ではここで、同一処理内容のストアドプロシージャをPostgreSQLのユーザ定義関数、MySQLのストアドファンクション、ストアドプロシージャのそれぞれで作成した例を説明します。なお、PostgreSQLのユーザ定義関数はPL/pgSQLにて作成することとします。
まず、処理対象のテーブルとして図1のようにTABLE01があり、COL01とCOL02の2つのカラムを用意します。
図1:処理対象テーブルの状態
各カラムの初期状態は図1にある通りで、COL02の値がすべて「100」の4レコードを格納しているものとします。このTABLE01に対して処理を行うストアドプロシージャとして、以下のような内容のものを作成します。
作成するストアドプロシージャは、名称を「sp_test()」とし、char型の入力パラメータを1つ持ちます。sp_test()は、まず与えられたパラメータ値をTABLE01のCOL01の条件値として使用し、該当するレコードを検索します。
検索結果が0件の場合は、COL01=入力パラメータ値、COL02=0としたレコードを1件挿入します。1件でも該当するレコードが存在した場合は、そのレコードのCOL02の値を0に更新します。そして、レコードを挿入した場合は'INSERT'という文字列を、レコードを更新した場合は'UPDATE'という文字列を返却値としてsp_test()は終了します。
この内容で3種類のsp_test()を作成します。
まず、以下はPostgreSQLのユーザ定義関数で記述したものです。
create function sp_test (para01 char) returns varchar(10)
as $$
declare
p_cnt int;
begin
select into p_cnt count(*) from table01 where col01=para01;
if p_cnt = 0 then
insert into table01 (col01,col02) values (para01,0);
return 'INSERT';
else
update table01 set col02=0 where col01=para01;
return 'UPDATE';
end if;
end;
$$ language plpgsql;
続いて、MySQLのストアドファンクションで作成したものです。
create function sp_test (para01 char) returns varchar(10)
begin
declare p_cnt int;
select count(*) into p_cnt from table01 where col01=para01;
if p_cnt = 0 then
insert into table01 (col01,col02) values (para01,0);
return 'INSERT';
else
update table01 set col02=0 where col01=para01;
return 'UPDATE';
end if;
end;
最後は、MySQLのストアドプロシージャで作成したものです。
create procedure sp_test (in para01 char,out para02 varchar(10))
begin
declare p_cnt int;
select count(*) into p_cnt from table01 where col01=para01;
if p_cnt = 0 then
insert into table01 (col01,col02) values (para01,0);
set para02 = 'INSERT';
else
update table01 set col02=0 where col01=para01;
set para02 = 'UPDATE';
end if;
end;
いかがでしょうか。この程度の処理内容だと3種類とも、ほとんど同じ内容にみえると思います。しかし、いくつか特徴的な違いもありますのでその部分について説明します。
|