今回作成した3種類のストアドプロシージャは、すべて実行している内容は同一です。
- TABLE01内の4レコードが処理状態であることを確認
- 入力パラメータ値に’E’を指定し、SELECT文から呼び出し。COL01が’E’のレコードは存在しないためINSERTされる
- 入力パラメータ値に’A’を指定し、SELECT文から呼び出し。COL01が’A’のレコードは存在しているためUPDATEされる
- TABLE01内の全レコードの内容を確認。COL01が’A’のレコードのCOL02の値が0に更新されている。COL01が’E’のレコードが挿入されている
表2:ストアドプロシージャの実行内容
以下は、それぞれのsp_test()の実行結果です。
まず、以下はPostgreSQLのユーザ定義関数の実行結果です。
psql> select * from table01 order by col01;
A | 100
B | 100
C | 100
D | 100
psql> select sp_test('E');
INSERT
psql> select sp_test('A');
UPDATE
psql> select * from table01 order by col01;
A | 0
B | 100
C | 100
D | 100
E | 0
続いて、MySQLのストアドファンクションでの実行結果です。
mysql> select * from table01 order by col01;
+-------+-------+
| col01 | col02 |
+-------+-------+
| A | 100 |
| B | 100 |
| C | 100 |
| D | 100 |
+-------+-------+
mysql> select sp_test('E');
+--------------+
| sp_test('E') |
+--------------+
| INSERT |
+--------------+
mysql> select sp_test('A');
+--------------+
| sp_test('A') |
+--------------+
| UPDATE |
+--------------+
mysql> select * from table01 order by col01;
+-------+-------+
| col01 | col02 |
+-------+-------+
| A | 0 |
| B | 100 |
| C | 100 |
| D | 100 |
| E | 0 |
+-------+-------+
最後に、MySQLのストアドプロシージャでの実行結果です。
mysql> select * from table01 order by col01;
+-------+-------+
| col01 | col02 |
+-------+-------+
| A | 100 |
| B | 100 |
| C | 100 |
| D | 100 |
+-------+-------+
mysql> call sp_test('E',@ret);
mysql> select @ret;
+--------+
| @ret |
+--------+
| INSERT |
+--------+
mysql> call sp_test('A',@ret);
mysql> select @ret;
+--------+
| @ret |
+--------+
| UPDATE |
+--------+
mysql> select * from table01 order by col01;
+-------+-------+
| col01 | col02 |
+-------+-------+
| A | 0 |
| B | 100 |
| C | 100 |
| D | 100 |
| E | 0 |
+-------+-------+
MySQLのストアドプロシージャがCALL文を使用して呼び出しているところが特徴的です。CALL文を使用した場合、ストアドプロシージャの返却値はパラメータ内に入っていますので、それを取り出すためにSELECT文を使用して、そのパラメータ値を確認しています。
|