| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

DB2 SQL PL

提供: MyMemoWiki
2020年2月15日 (土) 07:31時点におけるPiroto (トーク | 投稿記録)による版 (ページの作成:「==DB2 SQL PL== [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%…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

DB2 SQL PL

[DB2]テンプレート:Category SQL

概要

ステートメント

CALL ステートメント

  • プロシージャーまたは外部プロシージャーを呼び出します。

CASE ステートメント

  • 複数の条件に基づいて実行パスを選択します。

CASE ステートメントを CASE 式と混同しないでください。

simple-case-statement-when-clause

  1. CASE v_workdept
  2. WHEN'A00'
  3. THEN UPDATE department
  4. SET deptname = 'DATA ACCESS 1';
  5. WHEN 'B01'
  6. THEN UPDATE department
  7. SET deptname = 'DATA ACCESS 2';
  8. ELSE UPDATE department
  9. SET deptname = 'DATA ACCESS 3';
  10. END CASE

searched-case-statement-when-clause

  1. CASE
  2. WHEN v_workdept = 'A00'
  3. THEN UPDATE department
  4. SET deptname = 'DATA ACCESS 1';
  5. WHEN v_workdept = 'B01'
  6. THEN UPDATE department
  7. SET deptname = 'DATA ACCESS 2';
  8. ELSE UPDATE department
  9. SET deptname = 'DATA ACCESS 3';
  10. END CASE

コンパウンド SQL (コンパイル済み) ステートメント

  • 変数、条件、カーソル、およびハンドラーに関する、ローカルな有効範囲を指定して実行する一連の SQL ステートメント。

FOR ステートメント

  • 表の行ごとに、ステートメントまたはステートメントのグループを実行

  1. BEGIN ATOMIC
  2. DECLARE fullname CHAR(40);
  3. FOR vl AS
  4. SELECT firstnme, midinit, lastname FROM employee
  5. DO
  6. SET fullname = lastname CONCAT ','
  7. CONCAT firstnme CONCAT ' ' CONCAT midinit;
  8. INSERT INTO tnames VALUES (fullname);
  9. END FOR;
  10. END

GET DIAGNOSTICS ステートメント

GOTO ステートメント

IF ステートメント

  • 条件の評価に基づいて実行パスを選択します。

  1. CREATE PROCEDURE UPDATE_SALARY_IF
  2. (IN employee_number CHAR(6), INOUT rating SMALLINT)
  3. LANGUAGE SQL
  4. BEGIN
  5. DECLARE not_found CONDITION FOR SQLSTATE '02000';
  6. DECLARE EXIT HANDLER FOR not_found
  7. SET rating = -1;
  8. IF rating = 1
  9. THEN UPDATE employee
  10. SET salary = salary * 1.10, bonus = 1000
  11. WHERE empno = employee_number;
  12. ELSEIF rating = 2
  13. THEN UPDATE employee
  14. SET salary = salary * 1.05, bonus = 500
  15. WHERE empno = employee_number;
  16. ELSE UPDATE employee
  17. SET salary = salary * 1.03, bonus = 0
  18. WHERE empno = employee_number;
  19. END IF;
  20. END

ITERATE ステートメント

  • 制御のフローがラベル付きループの最初に戻ります。

  1. CREATE PROCEDURE ITERATOR()
  2. LANGUAGE SQL
  3. BEGIN
  4. DECLARE v_dept CHAR(3);
  5. DECLARE v_deptname VARCHAR(29);
  6. DECLARE v_admdept CHAR(3);
  7. DECLARE at_end INTEGER DEFAULT 0;
  8. DECLARE not_found CONDITION FOR SQLSTATE '02000';
  9. DECLARE c1 CURSOR FOR
  10. SELECT deptno, deptname, admrdept
  11. FROM department
  12. ORDER BY deptno;
  13. DECLARE CONTINUE HANDLER FOR not_found
  14. SET at_end = 1;
  15. OPEN c1;
  16. ins_loop:
  17. LOOP
  18. FETCH c1 INTO v_dept, v_deptname, v_admdept;
  19. IF at_end = 1 THEN
  20. LEAVE ins_loop;
  21. ELSEIF v_dept = 'D11' THEN
  22. ITERATE ins_loop;
  23. END IF;
  24. INSERT INTO department (deptno, deptname, admrdept)
  25. VALUES ('NEW', v_deptname, v_admdept);
  26. END LOOP;
  27. CLOSE c1;
  28. END

LEAVE ステートメント

  • プログラム制御をループまたはコンパウンド・ステートメントの外側に移動させます。

RETURN ステートメント

  • ルーチンから戻るために使用されます。 SQL 関数またはメソッドの場合、関数またはメソッドの結果を返します。 SQL プロシージャーの場合、オプションで整数状況値が戻されます。

  1. BEGIN
  2. ...
  3. GOTO FAIL;
  4. ...
  5. SUCCESS: RETURN 0;
  6. FAIL: RETURN -200;
  7. END

SET 変数ステートメント

  • 変数に値を割り当てます。 このステートメントは、トランザクションの制御下にありません。

行の給与の列を 50000 に設定
  1. SET NEW_VAR.SALARY = 50000;
  2. --または
  3. SET (NEW_VAR.SALARY) = (50000);
行の給与と歩合の列を、 それぞれ 50000 および 8000 に設定
  1. SET NEW_VAR.SALARY = 50000, NEW_VAR.COMM = 8000;
  2. --または
  3. SET (NEW_VAR.SALARY, NEW_VAR.COMM) = (50000, 8000);
行の給与と歩合の列を、 更新される行に関連した部門の従業員の平均給与および平均歩合にそれぞれ設定
  1. SET (NEW_VAR.SALARY, NEW_VAR.COMM)
  2. = (SELECT AVG(SALARY), AVG(COMM)
  3. FROM EMPLOYEE E
  4. WHERE E.WORKDEPT = NEW_VAR.WORKDEPT);
変数 P_SALARY を 10 % ずつ増加
  1. SET P_SALARY = P_SALARY + (P_SALARY * .10)
数値 2.71828183 および 3.1415926 を、配列変数 SPECIALNUMBERS の最初のエレメントと 10 番目のエレメントに割り当て
  1. SET SPECIALNUMBERS[1] = 2.71828183;
  2. SET SPECIALNUMBERS[10] = 3.14159265;
値を連想配列変数 CAPITALS に割り当てます。この変数は配列タイプ CAPITALSARRAY として宣言
  1. SET CAPITALS['British Columbia'] = 'Victoria';
  2. SET CAPITALS['Alberta'] = 'Edmonton';
  3. SET CAPITALS['Manitoba'] = 'Winnipeg';
  4. SET CAPITALS['Canada'] = 'Ottawa';


SIGNAL ステートメント

  • エラーまたは警告条件を通知するために使用されます。 これを使用すると、指定した SQLSTATE とオプションのメッセージ・テキストが、 エラーまたは警告とともに戻されます。

WHILE ステートメント

  • エラーまたは警告条件を通知するために使用されます。 これを使用すると、指定した SQLSTATE とオプションのメッセージ・テキストが、 エラーまたは警告とともに戻されます。

  1. CREATE PROCEDURE DEPT_MEDIAN
  2. (IN deptNumber SMALLINT, OUT medianSalary DOUBLE)
  3. LANGUAGE SQL
  4. BEGIN
  5. DECLARE v_numRecords INTEGER DEFAULT 1;
  6. DECLARE v_counter INTEGER DEFAULT 0;
  7. DECLARE c1 CURSOR FOR
  8. SELECT CAST(salary AS DOUBLE)
  9. FROM staff
  10. WHERE DEPT = deptNumber
  11. ORDER BY salary;
  12. DECLARE EXIT HANDLER FOR NOT FOUND
  13. SET medianSalary = 6666;
  14. SET medianSalary = 0;
  15. SELECT COUNT(*) INTO v_numRecords
  16. FROM staff
  17. WHERE DEPT = deptNumber;
  18. OPEN c1;
  19. WHILE v_counter < (v_numRecords / 2 + 1) DO
  20. FETCH c1 INTO medianSalary;
  21. SET v_counter = v_counter + 1;
  22. END WHILE;
  23. CLOSE c1;
  24. END