目次
サンプル | 前提 |
文字列を出力する | |
select intoで値を取得する | |
select intoで複数項目を取得する | |
select文でカーソル(cursor)とfetchとloopを使用する | |
returnで処理を終了する | |
NULLで処理を何もしない | |
プロシージャの一覧を表示する | |
プロシージャの内容を表示する |
前提
- redshiftの初期設定にあるサンプルテーブルを使用します。
https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_sampledb.html
文字列を出力する
CREATE OR REPLACE PROCEDURE test1()
AS $$
DECLARE
str1 VARCHAR(20);
BEGIN
str1 := 'hello world';
RAISE INFO 'msg:%', STR1; --'msg:hello world
END;
$$
LANGUAGE plpgsql;
4行目は、変数を宣言しています。
6行目は、変数に値をセットしています。
7行目は、変数の値を出力します。コメントはハイフン2つ続けます。
%は、右の変数の値がセットされます。
10行目は、言語の指定で必要です。
プロシージャを実行する
上記で作成したプロシージャを実行するサンプルです。
call プロシージャ名()で実行します。
call test1()
クエリエディタ2から実行すると文字列が表示されます。
select intoで値を取得する
入力として数値を渡してsql intoで値を取得します。
CREATE OR REPLACE PROCEDURE test1(id1 int)
AS $$
DECLARE
str1 VARCHAR(20);
BEGIN
select firstname into str1 from users
where userid = id1;
RAISE INFO 'msg:%', STR1; --'msg:Henry
END;
$$
LANGUAGE plpgsql;
1行目は、引数としてintの値を受け取ります。
6行目はselect intoで取得したfirstnameを右の変数のstr1にセットしています。
7行目は、外部から受け取った数値で条件を指定します。
8行目の%は、右の変数の値がセットされます。
プロシージャを実行する
上記のプロシージャを実行するサンプルです。
引数として13を指定しています。
call test1(13)
select intoで複数項目を取得する
CREATE OR REPLACE PROCEDURE test1(id1 int)
AS $$
DECLARE
str1 VARCHAR(20);
str2 VARCHAR(20);
BEGIN
select firstname,lastname into str1,str2 from users
where userid = id1;
RAISE INFO 'msg:%,%', STR1,STR2; --'msg:Henry,Cochran
END;
$$
LANGUAGE plpgsql;
selectで取得する項目を複数にし、intoの後の変数も複数にすれば複数項目を取得できます。
select文でカーソル(cursor)とfetchとloopを使用する
CREATE OR REPLACE PROCEDURE test1()
AS $$
DECLARE
cur1 CURSOR FOR
select userid,firstname from users limit 10;
user_rec RECORD;
BEGIN
OPEN cur1;
LOOP
FETCH cur1 INTO user_rec;
EXIT WHEN NOT FOUND;
RAISE INFO '%,%', user_rec.userid , user_rec.firstname;
END LOOP;
CLOSE cur1;
END;
$$
LANGUAGE plpgsql;
4行目のCURSORで複数行を取得しています。
9,10行目のLOOPとFETCHで1行ずつ取り出しています。
プロシージャを実行する
上記で作成したプロシージャを実行するサンプルです。
call test1()
クエリエディタ2から実行すると文字列が表示されます。
returnで処理を終了する
CREATE OR REPLACE PROCEDURE test1()
AS $$
DECLARE
num1 int;
BEGIN
num1 := 1;
if num1 = 1 then
RAISE INFO 'process1'; --'process1
return;
end if;
RAISE INFO 'process2';
END;
$$
LANGUAGE plpgsql;
9行目は、returnです。このプロシージャの処理が終了します。
実行した場合、8行目の文字列が出力されます。
11行目の文字列は出力されません。
NULLで処理を何もしない
CREATE OR REPLACE PROCEDURE test1()
AS $$
DECLARE
num1 int;
BEGIN
num1 := 1;
if num1 = 1 then
NULL;
end if;
RAISE INFO 'process2';--'process2
END;
$$
LANGUAGE plpgsql;
NULLを記述すると何もしません。
NULLがない場合でもエラーにはなりません。
プロシージャの一覧を表示する
SELECT routine_catalog,routine_schema,routine_name,routine_type
FROM information_schema.routines
WHERE routine_type = 'PROCEDURE';
以下のように表示されます。
プロシージャの内容を表示する
show procedure test1()
指定したプロシージャを表示します。
関連の記事