「DB2 SQL PL」の版間の差分
ナビゲーションに移動
検索に移動
| 1行目: | 1行目: | ||
| − | ==DB2 SQL PL== | + | ==[[DB2 SQL PL]]== |
| − | [[DB2]] | | + | [[DB2]] | [[Category:SQL]] |
==概要== | ==概要== | ||
*[http://db2watch.com/wiki/index.php/%E3%82%B9%E3%83%88%E3%82%A2%E3%83%89%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3%EF%BC%88SQL%EF%BC%89%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF ストアドプロシージャ(SQL)を作成するには] | *[http://db2watch.com/wiki/index.php/%E3%82%B9%E3%83%88%E3%82%A2%E3%83%89%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3%EF%BC%88SQL%EF%BC%89%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF ストアドプロシージャ(SQL)を作成するには] | ||
| 40行目: | 40行目: | ||
END CASE | END CASE | ||
===[http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0004239.html コンパウンド SQL (コンパイル済み) ステートメント]=== | ===[http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0004239.html コンパウンド SQL (コンパイル済み) ステートメント]=== | ||
| − | *変数、条件、カーソル、およびハンドラーに関する、ローカルな有効範囲を指定して実行する一連の SQL ステートメント。 | + | *変数、条件、カーソル、およびハンドラーに関する、ローカルな有効範囲を指定して実行する一連の [[SQL]] ステートメント。 |
===[http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0004238.html FOR ステートメント]=== | ===[http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0004238.html FOR ステートメント]=== | ||
*表の行ごとに、ステートメントまたはステートメントのグループを実行 | *表の行ごとに、ステートメントまたはステートメントのグループを実行 | ||
====例==== | ====例==== | ||
BEGIN ATOMIC | BEGIN ATOMIC | ||
| − | + | DECLA[[R]]E fullname CHA[[R]](40); | |
| − | + | FO[[R]] vl AS | |
| − | SELECT firstnme, midinit, lastname | + | SELECT firstnme, midinit, lastname F[[R]]OM employee |
DO | DO | ||
SET fullname = lastname CONCAT ',' | SET fullname = lastname CONCAT ',' | ||
CONCAT firstnme CONCAT ' ' CONCAT midinit; | CONCAT firstnme CONCAT ' ' CONCAT midinit; | ||
| − | + | INSE[[R]]T INTO tnames VALUES (fullname); | |
| − | END | + | END FO[[R]]; |
END | END | ||
===[http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0005647.html GET DIAGNOSTICS ステートメント]=== | ===[http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0005647.html GET DIAGNOSTICS ステートメント]=== | ||
| 59行目: | 59行目: | ||
*条件の評価に基づいて実行パスを選択します。 | *条件の評価に基づいて実行パスを選択します。 | ||
====例==== | ====例==== | ||
| − | + | C[[R]]EATE P[[R]]OCEDU[[R]]E UPDATE_SALA[[R]]Y_IF | |
| − | (IN employee_number | + | (IN employee_number CHA[[R]](6), INOUT rating SMALLINT) |
| − | LANGUAGE SQL | + | LANGUAGE [[SQL]] |
BEGIN | BEGIN | ||
| − | DECLARE not_found CONDITION FOR | + | DECLARE not_found CONDITION FOR [[SQL]]STATE '02000'; |
| − | + | DECLA[[R]]E EXIT HANDLE[[R]] FO[[R]] not_found | |
SET rating = -1; | SET rating = -1; | ||
IF rating = 1 | IF rating = 1 | ||
THEN UPDATE employee | THEN UPDATE employee | ||
SET salary = salary * 1.10, bonus = 1000 | SET salary = salary * 1.10, bonus = 1000 | ||
| − | + | WHE[[R]]E empno = employee_number; | |
ELSEIF rating = 2 | ELSEIF rating = 2 | ||
THEN UPDATE employee | THEN UPDATE employee | ||
SET salary = salary * 1.05, bonus = 500 | SET salary = salary * 1.05, bonus = 500 | ||
| − | + | WHE[[R]]E empno = employee_number; | |
ELSE UPDATE employee | ELSE UPDATE employee | ||
SET salary = salary * 1.03, bonus = 0 | SET salary = salary * 1.03, bonus = 0 | ||
| − | + | WHE[[R]]E empno = employee_number; | |
END IF; | END IF; | ||
END | END | ||
| 82行目: | 82行目: | ||
*制御のフローがラベル付きループの最初に戻ります。 | *制御のフローがラベル付きループの最初に戻ります。 | ||
====例==== | ====例==== | ||
| − | + | C[[R]]EATE P[[R]]OCEDU[[R]]E ITE[[R]]ATO[[R]]() | |
| − | LANGUAGE SQL | + | LANGUAGE [[SQL]] |
BEGIN | BEGIN | ||
| − | + | DECLA[[R]]E v_dept CHA[[R]](3); | |
| − | + | DECLA[[R]]E v_deptname VA[[R]]CHA[[R]](29); | |
| − | + | DECLA[[R]]E v_admdept CHA[[R]](3); | |
| − | + | DECLA[[R]]E at_end INTEGE[[R]] DEFAULT 0; | |
| − | DECLARE not_found CONDITION FOR | + | DECLARE not_found CONDITION FOR [[SQL]]STATE '02000'; |
| − | + | DECLA[[R]]E c1 CU[[R]]SO[[R]] FO[[R]] | |
SELECT deptno, deptname, admrdept | SELECT deptno, deptname, admrdept | ||
| − | + | F[[R]]OM department | |
| − | + | O[[R]]DE[[R]] BY deptno; | |
| − | + | DECLA[[R]]E CONTINUE HANDLE[[R]] FO[[R]] not_found | |
SET at_end = 1; | SET at_end = 1; | ||
OPEN c1; | OPEN c1; | ||
| 103行目: | 103行目: | ||
LEAVE ins_loop; | LEAVE ins_loop; | ||
ELSEIF v_dept = 'D11' THEN | ELSEIF v_dept = 'D11' THEN | ||
| − | + | ITE[[R]]ATE ins_loop; | |
END IF; | END IF; | ||
| − | + | INSE[[R]]T INTO department (deptno, deptname, admrdept) | |
VALUES ('NEW', v_deptname, v_admdept); | VALUES ('NEW', v_deptname, v_admdept); | ||
END LOOP; | END LOOP; | ||
| 113行目: | 113行目: | ||
*プログラム制御をループまたはコンパウンド・ステートメントの外側に移動させます。 | *プログラム制御をループまたはコンパウンド・ステートメントの外側に移動させます。 | ||
===[http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0004237.html RETURN ステートメント]=== | ===[http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0004237.html RETURN ステートメント]=== | ||
| − | *ルーチンから戻るために使用されます。 SQL 関数またはメソッドの場合、関数またはメソッドの結果を返します。 SQL プロシージャーの場合、オプションで整数状況値が戻されます。 | + | *ルーチンから戻るために使用されます。 [[SQL]] 関数またはメソッドの場合、関数またはメソッドの結果を返します。 [[SQL]] プロシージャーの場合、オプションで整数状況値が戻されます。 |
====例==== | ====例==== | ||
BEGIN | BEGIN | ||
| 119行目: | 119行目: | ||
GOTO FAIL; | GOTO FAIL; | ||
... | ... | ||
| − | SUCCESS: | + | SUCCESS: [[R]]ETU[[R]]N 0; |
| − | FAIL: | + | FAIL: [[R]]ETU[[R]]N -200; |
END | END | ||
===[http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0001018.html SET 変数ステートメント]=== | ===[http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0001018.html SET 変数ステートメント]=== | ||
| − | *変数に値を割り当てます。 | + | *変数に値を割り当てます。 このステートメントは、[[トランザクション]]の制御下にありません。 |
====例==== | ====例==== | ||
=====行の給与の列を 50000 に設定===== | =====行の給与の列を 50000 に設定===== | ||
| − | SET | + | SET NEW_VA[[R]].SALA[[R]]Y = 50000; |
--または | --または | ||
| − | SET ( | + | SET (NEW_VA[[R]].SALA[[R]]Y) = (50000); |
=====行の給与と歩合の列を、 それぞれ 50000 および 8000 に設定===== | =====行の給与と歩合の列を、 それぞれ 50000 および 8000 に設定===== | ||
| − | SET NEW_VAR.SALARY = 50000, NEW_VAR. | + | SET NEW_VAR.SALARY = 50000, NEW_VAR.[[COM]]M = 8000; |
--または | --または | ||
| − | SET (NEW_VAR.SALARY, NEW_VAR. | + | SET (NEW_VAR.SALARY, NEW_VAR.[[COM]]M) = (50000, 8000); |
=====行の給与と歩合の列を、 更新される行に関連した部門の従業員の平均給与および平均歩合にそれぞれ設定===== | =====行の給与と歩合の列を、 更新される行に関連した部門の従業員の平均給与および平均歩合にそれぞれ設定===== | ||
| − | SET (NEW_VAR.SALARY, NEW_VAR. | + | SET (NEW_VAR.SALARY, NEW_VAR.[[COM]]M) |
| − | = (SELECT AVG(SALARY), AVG( | + | = (SELECT AVG(SALARY), AVG([[COM]]M) |
| − | + | F[[R]]OM EMPLOYEE E | |
| − | + | WHE[[R]]E E.WO[[R]]KDEPT = NEW_VA[[R]].WO[[R]]KDEPT); | |
| − | =====変数 | + | =====変数 P_SALA[[R]]Y を 10 % ずつ増加===== |
| − | SET | + | SET P_SALA[[R]]Y = P_SALA[[R]]Y + (P_SALA[[R]]Y * .10) |
| − | =====数値 2.71828183 および 3.1415926 を、配列変数 | + | =====数値 2.71828183 および 3.1415926 を、配列変数 SPECIALNUMBE[[R]]S の最初のエレメントと 10 番目のエレメントに割り当て===== |
SET SPECIALNUMBERS[1] = 2.71828183; | SET SPECIALNUMBERS[1] = 2.71828183; | ||
SET SPECIALNUMBERS[10] = 3.14159265; | SET SPECIALNUMBERS[10] = 3.14159265; | ||
| − | =====値を連想配列変数 CAPITALS に割り当てます。この変数は配列タイプ | + | =====値を連想配列変数 CAPITALS に割り当てます。この変数は配列タイプ CAPITALSA[[R]][[R]]AY として宣言===== |
SET CAPITALS['British Columbia'] = 'Victoria'; | SET CAPITALS['British Columbia'] = 'Victoria'; | ||
SET CAPITALS['Alberta'] = 'Edmonton'; | SET CAPITALS['Alberta'] = 'Edmonton'; | ||
| 151行目: | 151行目: | ||
===[http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0004232.html SIGNAL ステートメント]=== | ===[http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0004232.html SIGNAL ステートメント]=== | ||
| − | *エラーまたは警告条件を通知するために使用されます。 これを使用すると、指定した | + | *エラーまたは警告条件を通知するために使用されます。 これを使用すると、指定した [[SQL]]STATE とオプションのメッセージ・テキストが、 エラーまたは警告とともに戻されます。 |
===[http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0005655.html WHILE ステートメント]=== | ===[http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0005655.html WHILE ステートメント]=== | ||
| − | *エラーまたは警告条件を通知するために使用されます。 これを使用すると、指定した | + | *エラーまたは警告条件を通知するために使用されます。 これを使用すると、指定した [[SQL]]STATE とオプションのメッセージ・テキストが、 エラーまたは警告とともに戻されます。 |
====例==== | ====例==== | ||
| − | + | C[[R]]EATE P[[R]]OCEDU[[R]]E DEPT_MEDIAN | |
(IN deptNumber SMALLINT, OUT medianSalary DOUBLE) | (IN deptNumber SMALLINT, OUT medianSalary DOUBLE) | ||
| − | LANGUAGE SQL | + | LANGUAGE [[SQL]] |
BEGIN | BEGIN | ||
| − | + | DECLA[[R]]E v_num[[R]]ecords INTEGE[[R]] DEFAULT 1; | |
| − | + | DECLA[[R]]E v_counter INTEGE[[R]] DEFAULT 0; | |
| − | + | DECLA[[R]]E c1 CU[[R]]SO[[R]] FO[[R]] | |
SELECT CAST(salary AS DOUBLE) | SELECT CAST(salary AS DOUBLE) | ||
| − | + | F[[R]]OM staff | |
| − | + | WHE[[R]]E DEPT = deptNumber | |
| − | + | O[[R]]DE[[R]] BY salary; | |
| − | + | DECLA[[R]]E EXIT HANDLE[[R]] FO[[R]] NOT FOUND | |
SET medianSalary = 6666; | SET medianSalary = 6666; | ||
SET medianSalary = 0; | SET medianSalary = 0; | ||
| − | SELECT COUNT(*) INTO | + | SELECT COUNT(*) INTO v_num[[R]]ecords |
| − | + | F[[R]]OM staff | |
| − | + | WHE[[R]]E DEPT = deptNumber; | |
OPEN c1; | OPEN c1; | ||
| − | WHILE v_counter < ( | + | WHILE v_counter < (v_num[[R]]ecords / 2 + 1) DO |
FETCH c1 INTO medianSalary; | FETCH c1 INTO medianSalary; | ||
SET v_counter = v_counter + 1; | SET v_counter = v_counter + 1; | ||
2020年2月16日 (日) 04:24時点における最新版
目次
- 1 DB2 SQL PL
- 2 概要
- 3 ステートメント
- 3.1 CALL ステートメント
- 3.2 CASE ステートメント
- 3.3 コンパウンド SQL (コンパイル済み) ステートメント
- 3.4 FOR ステートメント
- 3.5 GET DIAGNOSTICS ステートメント
- 3.6 GOTO ステートメント
- 3.7 IF ステートメント
- 3.8 ITERATE ステートメント
- 3.9 LEAVE ステートメント
- 3.10 RETURN ステートメント
- 3.11 SET 変数ステートメント
- 3.11.1 例
- 3.11.1.1 行の給与の列を 50000 に設定
- 3.11.1.2 行の給与と歩合の列を、 それぞれ 50000 および 8000 に設定
- 3.11.1.3 行の給与と歩合の列を、 更新される行に関連した部門の従業員の平均給与および平均歩合にそれぞれ設定
- 3.11.1.4 変数 P_SALARY を 10 % ずつ増加
- 3.11.1.5 数値 2.71828183 および 3.1415926 を、配列変数 SPECIALNUMBERS の最初のエレメントと 10 番目のエレメントに割り当て
- 3.11.1.6 値を連想配列変数 CAPITALS に割り当てます。この変数は配列タイプ CAPITALSARRAY として宣言
- 3.11.1 例
- 3.12 SIGNAL ステートメント
- 3.13 WHILE ステートメント
DB2 SQL PL
DB2 |
概要
- ストアドプロシージャ(SQL)を作成するには
- SQL PL
- ルーチンの開発
- システム定義ルーチン
- SQLルーチン
- SQL ルーチンまたは外部ルーチンを使用する場合の判断
- SQLプロシージャ
- CREATE PROCEDURE
- CREATE FUNCTION
ステートメント
CALL ステートメント
- プロシージャーまたは外部プロシージャーを呼び出します。
CASE ステートメント
- 複数の条件に基づいて実行パスを選択します。
<blockquote>CASE ステートメントを CASE 式と混同しないでください。</blockquote>
simple-case-statement-when-clause
CASE v_workdept
WHEN'A00'
THEN UPDATE department
SET deptname = 'DATA ACCESS 1';
WHEN 'B01'
THEN UPDATE department
SET deptname = 'DATA ACCESS 2';
ELSE UPDATE department
SET deptname = 'DATA ACCESS 3';
END CASE
searched-case-statement-when-clause
CASE
WHEN v_workdept = 'A00'
THEN UPDATE department
SET deptname = 'DATA ACCESS 1';
WHEN v_workdept = 'B01'
THEN UPDATE department
SET deptname = 'DATA ACCESS 2';
ELSE UPDATE department
SET deptname = 'DATA ACCESS 3';
END CASE
コンパウンド SQL (コンパイル済み) ステートメント
- 変数、条件、カーソル、およびハンドラーに関する、ローカルな有効範囲を指定して実行する一連の SQL ステートメント。
FOR ステートメント
- 表の行ごとに、ステートメントまたはステートメントのグループを実行
例
BEGIN ATOMIC
DECLARE fullname CHAR(40);
FOR vl AS
SELECT firstnme, midinit, lastname FROM employee
DO
SET fullname = lastname CONCAT ','
CONCAT firstnme CONCAT ' ' CONCAT midinit;
INSERT INTO tnames VALUES (fullname);
END FOR;
END
GET DIAGNOSTICS ステートメント
GOTO ステートメント
IF ステートメント
- 条件の評価に基づいて実行パスを選択します。
例
CREATE PROCEDURE UPDATE_SALARY_IF (IN employee_number CHAR(6), INOUT rating SMALLINT) LANGUAGE SQL BEGIN DECLARE not_found CONDITION FOR SQLSTATE '02000'; DECLARE EXIT HANDLER FOR not_found SET rating = -1; IF rating = 1 THEN UPDATE employee SET salary = salary * 1.10, bonus = 1000 WHERE empno = employee_number; ELSEIF rating = 2 THEN UPDATE employee SET salary = salary * 1.05, bonus = 500 WHERE empno = employee_number; ELSE UPDATE employee SET salary = salary * 1.03, bonus = 0 WHERE empno = employee_number; END IF; END
ITERATE ステートメント
- 制御のフローがラベル付きループの最初に戻ります。
例
CREATE PROCEDURE ITERATOR() LANGUAGE SQL BEGIN DECLARE v_dept CHAR(3); DECLARE v_deptname VARCHAR(29); DECLARE v_admdept CHAR(3); DECLARE at_end INTEGER DEFAULT 0; DECLARE not_found CONDITION FOR SQLSTATE '02000'; DECLARE c1 CURSOR FOR SELECT deptno, deptname, admrdept FROM department ORDER BY deptno; DECLARE CONTINUE HANDLER FOR not_found SET at_end = 1; OPEN c1; ins_loop: LOOP FETCH c1 INTO v_dept, v_deptname, v_admdept; IF at_end = 1 THEN LEAVE ins_loop; ELSEIF v_dept = 'D11' THEN ITERATE ins_loop; END IF; INSERT INTO department (deptno, deptname, admrdept) VALUES ('NEW', v_deptname, v_admdept); END LOOP; CLOSE c1; END
LEAVE ステートメント
- プログラム制御をループまたはコンパウンド・ステートメントの外側に移動させます。
RETURN ステートメント
例
BEGIN
...
GOTO FAIL;
...
SUCCESS: RETURN 0;
FAIL: RETURN -200;
END
SET 変数ステートメント
- 変数に値を割り当てます。 このステートメントは、トランザクションの制御下にありません。
例
行の給与の列を 50000 に設定
SET NEW_VAR.SALARY = 50000; --または SET (NEW_VAR.SALARY) = (50000);
行の給与と歩合の列を、 それぞれ 50000 および 8000 に設定
SET NEW_VAR.SALARY = 50000, NEW_VAR.COMM = 8000; --または SET (NEW_VAR.SALARY, NEW_VAR.COMM) = (50000, 8000);
行の給与と歩合の列を、 更新される行に関連した部門の従業員の平均給与および平均歩合にそれぞれ設定
SET (NEW_VAR.SALARY, NEW_VAR.COMM) = (SELECT AVG(SALARY), AVG(COMM) FROM EMPLOYEE E WHERE E.WORKDEPT = NEW_VAR.WORKDEPT);
変数 P_SALARY を 10 % ずつ増加
SET P_SALARY = P_SALARY + (P_SALARY * .10)
数値 2.71828183 および 3.1415926 を、配列変数 SPECIALNUMBERS の最初のエレメントと 10 番目のエレメントに割り当て
SET SPECIALNUMBERS[1] = 2.71828183; SET SPECIALNUMBERS[10] = 3.14159265;
値を連想配列変数 CAPITALS に割り当てます。この変数は配列タイプ CAPITALSARRAY として宣言
SET CAPITALS['British Columbia'] = 'Victoria'; SET CAPITALS['Alberta'] = 'Edmonton'; SET CAPITALS['Manitoba'] = 'Winnipeg'; SET CAPITALS['Canada'] = 'Ottawa';
SIGNAL ステートメント
- エラーまたは警告条件を通知するために使用されます。 これを使用すると、指定した SQLSTATE とオプションのメッセージ・テキストが、 エラーまたは警告とともに戻されます。
WHILE ステートメント
- エラーまたは警告条件を通知するために使用されます。 これを使用すると、指定した SQLSTATE とオプションのメッセージ・テキストが、 エラーまたは警告とともに戻されます。
例
CREATE PROCEDURE DEPT_MEDIAN (IN deptNumber SMALLINT, OUT medianSalary DOUBLE) LANGUAGE SQL BEGIN DECLARE v_numRecords INTEGER DEFAULT 1; DECLARE v_counter INTEGER DEFAULT 0; DECLARE c1 CURSOR FOR SELECT CAST(salary AS DOUBLE) FROM staff WHERE DEPT = deptNumber ORDER BY salary; DECLARE EXIT HANDLER FOR NOT FOUND SET medianSalary = 6666; SET medianSalary = 0; SELECT COUNT(*) INTO v_numRecords FROM staff WHERE DEPT = deptNumber; OPEN c1; WHILE v_counter < (v_numRecords / 2 + 1) DO FETCH c1 INTO medianSalary; SET v_counter = v_counter + 1; END WHILE; CLOSE c1; END
© 2006 矢木浩人