はじめに
本記事では、Vertica 11.1から、使用可能になったストアド・プロシージャをご紹介します。ストアド・プロシージャは、Verticaに加工したデータを追加や更新したい場合などに有効です。以前は、データの加工をおこなう場合、ETLツール等を使用していましたが、今後はストアド・プロシージャについて使用可能です。
ストアド・プロシージャの利用方法
ストアド・プロシージャの作成
ストアド・プロシージャの作成は、CREATE PROCEDURE 文を使用します。
構文
CREATE [ OR REPLACE ] PROCEDURE [ IF NOT EXISTS ]
[ [ データベース名 ]. スキーマ名. ] プロシージャ名( [ 引数リスト ] )
[ LANGUAGE 言語名 ]
[ SECURITY { DEFINER | INVOKER } ]
AS $$ [ <<ラベル>> ]
[ DECLARE
/* 宣言部 */ ]
BEGIN
/* 実行部 */
END [ ラベル ];
$$;CREATE ~ の各パラメータの説明
パラメータ | 説明 |
|---|---|
OR REPLACE | 同じ名前のプロシージャがすでに存在する場合、置き換えます。 |
IF NOT EXISTS | 同じ名前のプロシージャが存在する場合、作成されません。 |
[ データベース名 ].スキーマ名. | プロシージャを作成するデータベースとスキーマを指定します。 |
プロシージャ名 | 作成するプロシージャの名前を記述します。 |
引数リスト | カンマ区切りで、複数のパラメータを以下の形式で記述します。 [ 引数モード ] 引数名 データ型
|
言語名 | 以下のいずれかからプロシージャの言語を指定します。 |
SECURITY { DEFINER | INVOKER } | プロシージャが呼び出された際に使用する権限を次のいずれかから決定します。 |
AS $$ ~ の説明
<<ラベル>>
ラベルは、ブロック内で宣言された変数名を修飾する場合や、EXIT文でブロックから抜ける場合に使用します。
パラメータ | 説明 |
|---|---|
ラベル | ブロックにラベルを指定する場合は、DECLAREブロックの前にラベルを指定します。 |
・内側のブロックで外側のブロックの変数を利用する場合の例
<<outer_block>>
DECLARE
x INT;
BEGIN
<<inner_block>>
DECLARE
x INT;
BEGIN
x := 5; --inner_block の x 値を指す
outer_block.x := 10; --outer_block の x 値を指す
END inner_block;
END outer_block;・EXIT文でブロック自体から抜ける場合の例
<<test_block>>
BEGIN
IF i > 100 THEN
EXIT test_block; -- test_block のブロックから抜ける
END IF;
END test_block;DECLARE
DECLAREブロックの宣言部は、変数やカーソルなどの定義を記述します。
変数名 [ CONSTANT ] データ型 [ NOT NULL ] [ := { 式 | SQLステートメント } ];
パラメータ | 説明 |
|---|---|
変数名 | 以下の要件を満たしている変数名を指定します。 |
CONSTANT | 変数を定数(不変)として定義します。 |
データ型 | 変数のデータ型を指定します。 <変数名> <表名>.<列名>%TYPE; |
NOT NULL | 変数がNULLを保持することができないよう定義します。 |
:= { 式 | SQLステートメント } | 式またはSQLステートメントを使用して変数を初期化します。 DECLARE |
BEGIN ~ END
BEGINブロックの実行部には、手続き型言語を使用して、プロシージャで実行する処理を記述します。
BEGIN~ENDが1つの処理単位となります。
ストアド・プロシージャの実行
作成したプロシージャを実行する際は、CALL文を使用します。
構文
CALL [ [ データベース名. ] スキーマ名. ] プロシージャ名( [ 引数リスト ] );パラメータ | 説明 |
|---|---|
[データベース名].スキーマ名 | 実行するプロシージャのデータベース名とスキーマ名を指定します。 |
プロシージャ名 | 実行するプロシージャの名前です。 |
引数リスト | プロシージャに渡す引数を記述します。 |
ストアド・プロシージャの実行例
実行例1
引数を出力する TEST_PROC() プロシージャを作成します。
SQL=> CREATE OR REPLACE PROCEDURE TEST_PROC(x INT,y VARCHAR)
SQL-> LANGUAGE PLvSQL AS $$
SQL$> BEGIN
SQL$> RAISE NOTICE '1つ目の引数は %',x;
SQL$> RAISE NOTICE '2つ目の引数は %',y;
SQL$> END;
SQL$> $$;作成した TEST_PROC() プロシージャを実行します。
SQL=> call TEST_PROC(1,'テスト');
NOTICE 2005: 1つ目の引数は 1
NOTICE 2005: 2つ目の引数は テスト
TEST_PROC
-----------
0
(1 row)実行例2
employee表のある特定の従業員の給料(sal)を、1.2倍にする SALUP_PROC() プロシージャを作成します。
/*クエリの戻り値の管理が不要な場合、PERFORMコマンドで結果を破棄する必要があります。
updateをした場合更新した行数が戻ってくるため、PERFORMコマンドを使用します。*/
SQL=> CREATE OR REPLACE PROCEDURE SALUP_PROC(x INT)
SQL-> LANGUAGE PLvSQL AS $$
SQL$> DECLARE
SQL$> y INT;
SQL$> BEGIN
SQL$> y := select sal*1.2 from employee where no=x;
SQL$> PERFORM UPDATE employee set sal=y where no=x;
SQL$> END;
SQL$> $$;employee表の構成、現在格納されているデータを確認します。
SQL=> \d employee
List of Fields by Tables
Schema | Table | Column | Type | Size | Default | Not Null | Primary Key | Foreign Key
--------+----------+--------+-------------+------+---------+----------+-------------+-------------
public | employee | no | int | 8 | | t | t |
public | employee | name | varchar(80) | 80 | | f | f |
public | employee | job | varchar(80) | 80 | | f | f |
public | employee | sal | int | 8 | | f | f |
SQL=> select * from employee order by no;
no | name | job | sal
----+-----------+------------+------
1 | sato | engineer | 2500
2 | takahashi | salesman | 1600
3 | itou | salesman | 1250
4 | yamada | manager | 5000
5 | suzuki | salesman | 3200
6 | tanaka | engineer | 2850
7 | yamamoto | accounting | 1500
8 | sasaki | engineer | 2600
9 | kimura | accounting | 2000
(9 rows)SALUP_PROC() プロシージャを実行します。
SQL=> call SALUP_PROC(1);
SALUP_PROC
------------
0
(1 row)no1の従業員の給与が、1.2倍になっていることが確認できます。
SQL=> select * from employee order by no;
no | name | job | sal
----+-----------+------------+------
1 | sato | engineer | 3000 ★
2 | takahashi | salesman | 1600
3 | itou | salesman | 1250
4 | yamada | manager | 5000
5 | suzuki | salesman | 3200
6 | tanaka | engineer | 2850
7 | yamamoto | accounting | 1500
8 | sasaki | engineer | 2600
9 | kimura | accounting | 2000
(9 rows)参考情報
Stored Procedures
https://www.vertica.com/docs/11.1.x/HTML/Content/Authoring/ExtendingVertica/StoredProcedures/StoredProcedures.htm
CREATE PROCEDURE (Stored)
https://www.vertica.com/docs/11.1.x/HTML/Content/Authoring/SQLReferenceManual/Statements/CREATEPROCEDURE_stored.htm
外部プロシージャ
https://www.ashisuto.co.jp/cm/analytics-database/cre_procedure.html
検証バージョンについて
この記事の内容は、Vertica 11.1で確認しています。
更新履歴
2022/06/15 本記事を公開