PL/SQLの変数および定数

PL/SQLで変数および定数を定義した後、SQLとプロシージャ文の式を使用できる任意の場所でこれらを使用できます。

次に例を示します:

Command> DECLARE
           v_hiredate DATE;
           v_deptno   NUMBER (2) NOT NULL := 10;
           v_location VARCHAR2 (13) := 'San Francisco';
           c_comm     CONSTANT NUMBER := 1400;

%TYPE属性を使用すると、TimesTenの列定義または宣言済の別の変数に応じた変数を宣言できます。たとえば、%TYPEを使用して、変数emp_lnameおよびmin_balanceを作成します。

Command> DECLARE
           emp_lname  employees.last_name%TYPE;
           balance    NUMBER (7,2);
           min_balance  balance%TYPE:= 1000;
         BEGIN
           SELECT last_name INTO emp_lname FROM employees WHERE employee_id = 100;
           DBMS_OUTPUT.PUT_LINE (emp_lname);
           DBMS_OUTPUT.PUT_LINE (min_balance);
         END;
         /
King
1000
 
PL/SQL procedure successfully completed.

次の方法で、値を変数に代入できます。

  • 代入演算子(:=)を使用します。

  • そこへ値を選択またはフェッチします。

  • 変数をOUTまたはIN OUTパラメータとしてサブプログラム(プロシージャまたはファンクション)に渡し、次にその値をサブプログラム内で割り当てます。

ノート:

これらの例で使用されているDBMS_OUTPUTパッケージは、TimesTenに付属しています。このパッケージおよびその他の付属パッケージの詳細は、TimesTenが提供するPL/SQLパッケージを参照してください。

この例では、代入演算子を使用して変数に値を代入しています。

Command> DECLARE -- Assign values in the declarative section 
           wages NUMBER;
           hours_worked NUMBER := 40;
           hourly_salary NUMBER := 22.50;
           bonus NUMBER := 150;
           country VARCHAR2(128);
           counter NUMBER := 0;
           done BOOLEAN;
           valid_id BOOLEAN;
           emp_rec1 employees%ROWTYPE;
           emp_rec2 employees%ROWTYPE;
           TYPE commissions IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
           comm_tab commissions;
         BEGIN -- Assign values in the executable section
           wages := (hours_worked * hourly_salary) + bonus;
           country := 'France';
           country := UPPER('Canada');
           done := (counter   100);
           valid_id := TRUE;
           emp_rec1.first_name := 'Amy';
           emp_rec1.last_name := 'Feiner';
           emp_rec1 := emp_rec2;
           comm_tab(5) := 20000 * 0.15;
         END;
         /
 
PL/SQL procedure successfully completed.

ノート:

この例では、異なるデータ型を持つフィールドで構成された複合データ構造のレコードを使用します。ここに示されているように、%ROWTYPE属性を使用して、表内の行または問合せの結果セットの行を表すレコードを宣言できます。レコードについては、「PL/SQLの複合データ型」でさらに説明します。

次の例では、値を選択またはフェッチして変数に値を代入しています

従業員の給与の10%を選択して、bonus変数に入れます。

Command>  DECLARE
            bonus NUMBER(8,2);
            emp_id NUMBER(6) := 100;
          BEGIN
            SELECT salary * 0.10 INTO bonus FROM employees
              WHERE employee_id = emp_id;
            DBMS_OUTPUT.PUT_LINE (bonus);
          END;
          /
2400
 
PL/SQL procedure successfully completed.

次の例では、変数をOUTまたはIN OUTパラメータとしてサブプログラム(プロシージャまたはファンクション)に渡し、次にその値をサブプログラム内で割り当てて、変数に値を代入しています。

変数new_salを宣言した後、変数をパラメータ(sal)としてプロシージャadjust_salaryに渡します。プロシージャadjust_salaryでは、job_id='ST_CLERK'の従業員の平均給与を計算した後、salを更新します。プロシージャの実行後、変数の値が表示され、変数が正しく更新されたことが示されます。

Command> DECLARE
           new_sal NUMBER(8,2);
           emp_id NUMBER(6) := 126;
         PROCEDURE adjust_salary (emp_id NUMBER, sal IN OUT NUMBER) IS
           emp_job VARCHAR2(10);
           avg_sal NUMBER(8,2);
         BEGIN
           SELECT job_id INTO emp_job FROM employees
             WHERE employee_id = emp_id;
           SELECT AVG(salary) INTO avg_sal FROM employees
             WHERE job_id = emp_job;
           DBMS_OUTPUT.PUT_LINE ('The average salary for ' || emp_job
             || ' employees: ' || TO_CHAR(avg_sal));
           sal := (sal + avg_sal)/2;
           DBMS_OUTPUT.PUT_LINE ('New salary is ' || sal);
         END;
         BEGIN
           SELECT AVG(salary) INTO new_sal FROM employees;
           DBMS_OUTPUT.PUT_LINE ('The average salary for all employees: '
             || TO_CHAR(new_sal));
           adjust_salary(emp_id, new_sal);
           DBMS_OUTPUT.PUT_LINE ('Salary should be same as new salary ' ||
             new_sal);
         END;
         /
The average salary for all employees: 6461.68
The average salary for ST_CLERK employees: 2785
New salary is 4623.34
Salary should be same as new salary 4623.34
 
PL/SQL procedure successfully completed.

ノート:

この例では、ブロック内にPL/SQLブロックをネストする機能を示しています。外側の無名ブロック内に、内側のプロシージャが含まれています。このPROCEDURE文は、CREATE PROCEDURE文とは異なります(詳細は、「PL/SQLのプロシージャおよびファンクション」を参照)。後者は、ユーザーのスキーマ内に格納されたままとなるサブプログラムを作成する文です。