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

MyMemoWiki

「DB2 SQL PL」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
 
1行目: 1行目:
==DB2 SQL PL==
+
==[[DB2 SQL PL]]==
[[DB2]] | {{category SQL}}
+
[[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
     DECLARE fullname CHAR(40);
+
     DECLA[[R]]E fullname CHA[[R]](40);
     FOR vl AS
+
     FO[[R]] vl AS
       SELECT firstnme, midinit, lastname FROM employee
+
       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;
         INSERT INTO tnames VALUES (fullname);
+
         INSE[[R]]T INTO tnames VALUES (fullname);
     END FOR;
+
     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行目:
 
*条件の評価に基づいて実行パスを選択します。
 
*条件の評価に基づいて実行パスを選択します。
 
====例====
 
====例====
   CREATE PROCEDURE UPDATE_SALARY_IF
+
   C[[R]]EATE P[[R]]OCEDU[[R]]E UPDATE_SALA[[R]]Y_IF
     (IN employee_number CHAR(6), INOUT rating SMALLINT)
+
     (IN employee_number CHA[[R]](6), INOUT rating SMALLINT)
     LANGUAGE SQL
+
     LANGUAGE [[SQL]]
 
     BEGIN
 
     BEGIN
       DECLARE not_found CONDITION FOR SQLSTATE '02000';
+
       DECLARE not_found CONDITION FOR [[SQL]]STATE '02000';
       DECLARE EXIT HANDLER FOR not_found
+
       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
         WHERE empno = employee_number;
+
         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
         WHERE empno = employee_number;
+
         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
         WHERE empno = employee_number;
+
         WHE[[R]]E empno = employee_number;
 
       END IF;
 
       END IF;
 
     END
 
     END
82行目: 82行目:
 
*制御のフローがラベル付きループの最初に戻ります。
 
*制御のフローがラベル付きループの最初に戻ります。
 
====例====
 
====例====
   CREATE PROCEDURE ITERATOR()
+
   C[[R]]EATE P[[R]]OCEDU[[R]]E ITE[[R]]ATO[[R]]()
     LANGUAGE SQL
+
     LANGUAGE [[SQL]]
 
     BEGIN
 
     BEGIN
       DECLARE v_dept CHAR(3);
+
       DECLA[[R]]E v_dept CHA[[R]](3);
       DECLARE v_deptname VARCHAR(29);
+
       DECLA[[R]]E v_deptname VA[[R]]CHA[[R]](29);
       DECLARE v_admdept CHAR(3);
+
       DECLA[[R]]E v_admdept CHA[[R]](3);
       DECLARE at_end INTEGER DEFAULT 0;
+
       DECLA[[R]]E at_end INTEGE[[R]] DEFAULT 0;
       DECLARE not_found CONDITION FOR SQLSTATE '02000';
+
       DECLARE not_found CONDITION FOR [[SQL]]STATE '02000';
       DECLARE c1 CURSOR FOR
+
       DECLA[[R]]E c1 CU[[R]]SO[[R]] FO[[R]]
 
         SELECT deptno, deptname, admrdept
 
         SELECT deptno, deptname, admrdept
         FROM department
+
         F[[R]]OM department
         ORDER BY deptno;
+
         O[[R]]DE[[R]] BY deptno;
       DECLARE CONTINUE HANDLER FOR not_found
+
       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
           ITERATE ins_loop;
+
           ITE[[R]]ATE ins_loop;
 
         END IF;
 
         END IF;
         INSERT INTO department (deptno, deptname, admrdept)
+
         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: RETURN 0;
+
     SUCCESS: [[R]]ETU[[R]]N 0;
     FAIL: RETURN -200;
+
     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 NEW_VAR.SALARY = 50000;
+
  SET NEW_VA[[R]].SALA[[R]]Y = 50000;
 
  --または
 
  --または
  SET (NEW_VAR.SALARY) = (50000);
+
  SET (NEW_VA[[R]].SALA[[R]]Y) = (50000);
 
=====行の給与と歩合の列を、 それぞれ 50000 および 8000 に設定=====
 
=====行の給与と歩合の列を、 それぞれ 50000 および 8000 に設定=====
  SET NEW_VAR.SALARY = 50000, NEW_VAR.COMM = 8000;
+
  SET NEW_VAR.SALARY = 50000, NEW_VAR.[[COM]]M = 8000;
 
  --または
 
  --または
  SET (NEW_VAR.SALARY, NEW_VAR.COMM) = (50000, 8000);
+
  SET (NEW_VAR.SALARY, NEW_VAR.[[COM]]M) = (50000, 8000);
 
=====行の給与と歩合の列を、 更新される行に関連した部門の従業員の平均給与および平均歩合にそれぞれ設定=====
 
=====行の給与と歩合の列を、 更新される行に関連した部門の従業員の平均給与および平均歩合にそれぞれ設定=====
   SET (NEW_VAR.SALARY, NEW_VAR.COMM)
+
   SET (NEW_VAR.SALARY, NEW_VAR.[[COM]]M)
       = (SELECT AVG(SALARY), AVG(COMM)
+
       = (SELECT AVG(SALARY), AVG([[COM]]M)
           FROM EMPLOYEE E
+
           F[[R]]OM EMPLOYEE E
           WHERE E.WORKDEPT = NEW_VAR.WORKDEPT);
+
           WHE[[R]]E E.WO[[R]]KDEPT = NEW_VA[[R]].WO[[R]]KDEPT);
=====変数 P_SALARY を 10 % ずつ増加=====
+
=====変数 P_SALA[[R]]Y を 10 % ずつ増加=====
  SET P_SALARY = P_SALARY + (P_SALARY * .10)
+
  SET P_SALA[[R]]Y = P_SALA[[R]]Y + (P_SALA[[R]]Y * .10)
=====数値 2.71828183 および 3.1415926 を、配列変数 SPECIALNUMBERS の最初のエレメントと 10 番目のエレメントに割り当て=====
+
=====数値 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 に割り当てます。この変数は配列タイプ CAPITALSARRAY として宣言=====
+
=====値を連想配列変数 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 ステートメント]===
*エラーまたは警告条件を通知するために使用されます。 これを使用すると、指定した SQLSTATE とオプションのメッセージ・テキストが、 エラーまたは警告とともに戻されます。
+
*エラーまたは警告条件を通知するために使用されます。 これを使用すると、指定した [[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 ステートメント]===
*エラーまたは警告条件を通知するために使用されます。 これを使用すると、指定した SQLSTATE とオプションのメッセージ・テキストが、 エラーまたは警告とともに戻されます。
+
*エラーまたは警告条件を通知するために使用されます。 これを使用すると、指定した [[SQL]]STATE とオプションのメッセージ・テキストが、 エラーまたは警告とともに戻されます。
 
====例====
 
====例====
  
   CREATE PROCEDURE DEPT_MEDIAN
+
   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
       DECLARE v_numRecords INTEGER DEFAULT 1;
+
       DECLA[[R]]E v_num[[R]]ecords INTEGE[[R]] DEFAULT 1;
       DECLARE v_counter INTEGER DEFAULT 0;
+
       DECLA[[R]]E v_counter INTEGE[[R]] DEFAULT 0;
       DECLARE c1 CURSOR FOR
+
       DECLA[[R]]E c1 CU[[R]]SO[[R]] FO[[R]]
 
         SELECT CAST(salary AS DOUBLE)
 
         SELECT CAST(salary AS DOUBLE)
           FROM staff
+
           F[[R]]OM staff
           WHERE DEPT = deptNumber
+
           WHE[[R]]E DEPT = deptNumber
           ORDER BY salary;
+
           O[[R]]DE[[R]] BY salary;
       DECLARE EXIT HANDLER FOR NOT FOUND
+
       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 v_numRecords
+
       SELECT COUNT(*) INTO v_num[[R]]ecords
         FROM staff
+
         F[[R]]OM staff
         WHERE DEPT = deptNumber;
+
         WHE[[R]]E DEPT = deptNumber;
 
       OPEN c1;
 
       OPEN c1;
       WHILE v_counter < (v_numRecords / 2 + 1) DO
+
       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時点における最新版

DB2 SQL PL

DB2 |

概要

ステートメント

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 ステートメント

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

 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