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のプロシージャおよびファンクション」を参照)。後者は、ユーザーのスキーマ内に格納されたままとなるサブプログラムを作成する文です。