「Oracle PL/SQL」の版間の差分
ナビゲーションに移動
検索に移動
(→定数の宣言) |
|||
(同じ利用者による、間の3版が非表示) | |||
1行目: | 1行目: | ||
− | ==Oracle PL/SQL== | + | ==[[Oracle PL/SQL]]== |
− | [[Oracle Database10g PL/SQL] | + | [[Oracle Database10g PL/SQL]|[Oracle Database10g PL/SQL]] |
− | http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/appdev.102/B19257-01/ | + | http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/appdev.102/B19257-01/over[[vi]]ew.html#1310 |
===特長=== | ===特長=== | ||
− | * | + | *[[SQL]]のデータ操作機能と手続き型言語の処理機能の両方が利用できる。 |
*プログラム・フローを制御できる。 | *プログラム・フローを制御できる。 | ||
*変数の宣言、プロシージャとファンクションの定義、ランタイム・エラーのトラップが可能。 | *変数の宣言、プロシージャとファンクションの定義、ランタイム・エラーのトラップが可能。 | ||
*複数のアプリケーション間でその定義済みコードを再利用できる。 | *複数のアプリケーション間でその定義済みコードを再利用できる。 | ||
− | * | + | *単純な[[SQL]]で問題が解決できる場合、PL/[[SQL]]プログラム内で[[SQL]]コマンドを直接発行できる。 |
− | * | + | *データ型は、[[SQL]]の列型と対応している。 |
===ブロック構造=== | ===ブロック構造=== | ||
21行目: | 21行目: | ||
===変数の宣言=== | ===変数の宣言=== | ||
− | * | + | *任意の[[SQL]]データ型(CHAR、DATE、NUMBERなど)や、BOOLEAN、PLS_INTEGERなどのPL/[[SQL]]固有のデータ型を持つことがでる。 |
*宣言部の各行の最後には、セミコロン(;)を付ける。 | *宣言部の各行の最後には、セミコロン(;)を付ける。 | ||
− | * | + | *コンポジット・データ型TABLE、VA[[R]][[R]]AY、[[R]]ECO[[R]]Dを使用して、ネストした表、可変サイズの配列(VA[[R]][[R]]AY)およびレコードも宣言できる。 |
− | + | DECLA[[R]]E | |
− | part_no | + | part_no NUMBE[[R]](6); |
− | part_name | + | part_name VA[[R]]CHA[[R]]2(20); |
in_stock BOOLEAN; | in_stock BOOLEAN; | ||
− | part_price | + | part_price NUMBE[[R]](6,2); |
− | part_desc | + | part_desc VA[[R]]CHA[[R]]2(50); |
===変数への値の代入=== | ===変数への値の代入=== | ||
37行目: | 37行目: | ||
変数は演算子の左に、ファンクション・コールを含む式は演算子の右に置きます。変数を宣言するときに、変数に値を代入できます。 | 変数は演算子の左に、ファンクション・コールを含む式は演算子の右に置きます。変数を宣言するときに、変数に値を代入できます。 | ||
− | + | DECLA[[R]]E | |
− | wages | + | wages NUMBE[[R]]; |
− | hours_worked | + | hours_worked NUMBE[[R]] := 40; |
− | hourly_salary | + | hourly_salary NUMBE[[R]] := 22.50; |
− | bonus | + | bonus NUMBE[[R]] := 150; |
− | country | + | country VA[[R]]CHA[[R]]2(128); |
− | counter | + | counter NUMBE[[R]] := 0; |
done BOOLEAN; | done BOOLEAN; | ||
valid_id BOOLEAN; | valid_id BOOLEAN; | ||
− | emp_rec1 employees% | + | emp_rec1 employees%[[R]]OWTYPE; |
− | emp_rec2 employees% | + | emp_rec2 employees%[[R]]OWTYPE; |
− | TYPE commissions IS TABLE OF | + | TYPE commissions IS TABLE OF NUMBE[[R]] INDEX BY PLS_INTEGE[[R]]; |
comm_tab commissions; | comm_tab commissions; | ||
BEGIN | BEGIN | ||
wages := (hours_worked * hourly_salary) + bonus; | wages := (hours_worked * hourly_salary) + bonus; | ||
country := 'France'; | country := 'France'; | ||
− | country := | + | country := UPPE[[R]]('Canada'); |
done := (counter > 100); | done := (counter > 100); | ||
− | valid_id := | + | valid_id := T[[R]]UE; |
emp_rec1.first_name := 'Antonio'; | emp_rec1.first_name := 'Antonio'; | ||
emp_rec1.last_name := 'Ortiz'; | emp_rec1.last_name := 'Ortiz'; | ||
63行目: | 63行目: | ||
/ | / | ||
=====データベース値を選択またはフェッチして代入する方法。===== | =====データベース値を選択またはフェッチして代入する方法。===== | ||
− | + | DECLA[[R]]E | |
− | bonus | + | bonus NUMBE[[R]](8,2); |
− | emp_id | + | emp_id NUMBE[[R]](6) := 100; |
BEGIN | BEGIN | ||
− | SELECT salary * 0.10 INTO bonus | + | SELECT salary * 0.10 INTO bonus F[[R]]OM employees |
− | + | WHE[[R]]E employee_id = emp_id; | |
END; | END; | ||
/ | / | ||
=====値をOUTパラメータまたはIN OUTパラメータとしてサブプログラムに渡し、サブプログラム内で代入する方法。===== | =====値をOUTパラメータまたはIN OUTパラメータとしてサブプログラムに渡し、サブプログラム内で代入する方法。===== | ||
− | + | DECLA[[R]]E | |
− | new_sal | + | new_sal NUMBE[[R]](8,2); |
− | emp_id | + | emp_id NUMBE[[R]](6) := 126; |
− | + | P[[R]]OCEDU[[R]]E adjust_salary(emp_id NUMBE[[R]], sal IN OUT NUMBE[[R]]) IS | |
− | emp_job | + | emp_job VA[[R]]CHA[[R]]2(10); |
− | avg_sal | + | avg_sal NUMBE[[R]](8,2); |
BEGIN | BEGIN | ||
− | SELECT job_id INTO emp_job | + | SELECT job_id INTO emp_job F[[R]]OM employees WHE[[R]]E employee_id = emp_id; |
− | SELECT AVG(salary) INTO avg_sal | + | SELECT AVG(salary) INTO avg_sal F[[R]]OM employees WHE[[R]]E job_id = emp_job; |
DBMS_OUTPUT.PUT_LINE ('The average salary for ' || emp_job | DBMS_OUTPUT.PUT_LINE ('The average salary for ' || emp_job | ||
− | || ' employees: ' || | + | || ' employees: ' || TO_CHA[[R]](avg_sal)); |
sal := (sal + avg_sal)/2; -- adjust sal value which is returned | sal := (sal + avg_sal)/2; -- adjust sal value which is returned | ||
END; | END; | ||
BEGIN | BEGIN | ||
− | SELECT AVG(salary) INTO new_sal | + | SELECT AVG(salary) INTO new_sal F[[R]]OM employees; |
DBMS_OUTPUT.PUT_LINE ('The average salary for all employees: ' | DBMS_OUTPUT.PUT_LINE ('The average salary for all employees: ' | ||
− | || | + | || TO_CHA[[R]](new_sal)); |
adjust_salary(emp_id, new_sal); -- assigns a new value to new_sal | adjust_salary(emp_id, new_sal); -- assigns a new value to new_sal | ||
− | DBMS_OUTPUT.PUT_LINE ('The adjusted salary for employee ' || | + | DBMS_OUTPUT.PUT_LINE ('The adjusted salary for employee ' || TO_CHA[[R]](emp_id) |
− | || ' is ' || | + | || ' is ' || TO_CHA[[R]](new_sal)); -- sal has new value |
END; | END; | ||
/ | / | ||
===バインド変数=== | ===バインド変数=== | ||
− | * | + | *[[SQL]]のINSERT、UPDATE、DELETEまたはSELECT文を直接埋め込むと、WHERE句およびVALUES句内の変数を自動的にバインド変数に変換する。 |
− | * | + | *動的[[SQL]]の場合は、変数を通常使用する部分(WHERE句やVALUES句など)にバインド変数を指定する。 |
− | **リテラルおよび変数値を連結して単一の文字列にするかわりに、変数をバインド変数の名前(先頭にコロンを追加したもの)に置き換え、USING句を使用して対応するPL/ | + | **リテラルおよび変数値を連結して単一の文字列にするかわりに、変数をバインド変数の名前(先頭にコロンを追加したもの)に置き換え、USING句を使用して対応するPL/[[SQL]]変数を指定します。 |
− | 'DELETE | + | 'DELETE F[[R]]OM employees WHE[[R]]E employee_id = :id' USING emp_id; |
====定数の宣言==== | ====定数の宣言==== | ||
− | * | + | *キーワードCONST[[ANT]]を付ける |
*定数に直接値を代入する必要がある。 | *定数に直接値を代入する必要がある。 | ||
− | credit_limit | + | credit_limit CONST[[ANT]] NUMBER := 5000.00; |
+ | ==制御== | ||
+ | ===ループ=== | ||
+ | ---- |
2021年10月5日 (火) 02:07時点における最新版
目次
Oracle PL/SQL
[[Oracle Database10g PL/SQL]|[Oracle Database10g PL/SQL]]
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/appdev.102/B19257-01/overview.html#1310
特長
- SQLのデータ操作機能と手続き型言語の処理機能の両方が利用できる。
- プログラム・フローを制御できる。
- 変数の宣言、プロシージャとファンクションの定義、ランタイム・エラーのトラップが可能。
- 複数のアプリケーション間でその定義済みコードを再利用できる。
- 単純なSQLで問題が解決できる場合、PL/SQLプログラム内でSQLコマンドを直接発行できる。
- データ型は、SQLの列型と対応している。
ブロック構造
- プログラムを構成する基本単位(プロシージャ、ファンクションおよび無名ブロック)
- 内部で相互にネストできる論理ブロック。
- 宣言はブロックの中で局所的に有効。
変数の宣言
- 任意のSQLデータ型(CHAR、DATE、NUMBERなど)や、BOOLEAN、PLS_INTEGERなどのPL/SQL固有のデータ型を持つことがでる。
- 宣言部の各行の最後には、セミコロン(;)を付ける。
- コンポジット・データ型TABLE、VARRAY、RECORDを使用して、ネストした表、可変サイズの配列(VARRAY)およびレコードも宣言できる。
DECLARE part_no NUMBER(6); part_name VARCHAR2(20); in_stock BOOLEAN; part_price NUMBER(6,2); part_desc VARCHAR2(50);
変数への値の代入
変数に値を代入する方法は3つある。
コロンに等号を付けた代入演算子(:=)を使用する。
変数は演算子の左に、ファンクション・コールを含む式は演算子の右に置きます。変数を宣言するときに、変数に値を代入できます。
DECLARE 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 wages := (hours_worked * hourly_salary) + bonus; country := 'France'; country := UPPER('Canada'); done := (counter > 100); valid_id := TRUE; emp_rec1.first_name := 'Antonio'; emp_rec1.last_name := 'Ortiz'; emp_rec1 := emp_rec2; comm_tab(5) := 20000 * 0.15; END; /
データベース値を選択またはフェッチして代入する方法。
DECLARE bonus NUMBER(8,2); emp_id NUMBER(6) := 100; BEGIN SELECT salary * 0.10 INTO bonus FROM employees WHERE employee_id = emp_id; END; /
値をOUTパラメータまたはIN OUTパラメータとしてサブプログラムに渡し、サブプログラム内で代入する方法。
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; -- adjust sal value which is returned 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); -- assigns a new value to new_sal DBMS_OUTPUT.PUT_LINE ('The adjusted salary for employee ' || TO_CHAR(emp_id) || ' is ' || TO_CHAR(new_sal)); -- sal has new value END; /
バインド変数
- SQLのINSERT、UPDATE、DELETEまたはSELECT文を直接埋め込むと、WHERE句およびVALUES句内の変数を自動的にバインド変数に変換する。
- 動的SQLの場合は、変数を通常使用する部分(WHERE句やVALUES句など)にバインド変数を指定する。
- リテラルおよび変数値を連結して単一の文字列にするかわりに、変数をバインド変数の名前(先頭にコロンを追加したもの)に置き換え、USING句を使用して対応するPL/SQL変数を指定します。
'DELETE FROM employees WHERE employee_id = :id' USING emp_id;
定数の宣言
- キーワードCONSTANTを付ける
- 定数に直接値を代入する必要がある。
credit_limit CONSTANT NUMBER := 5000.00;
制御
ループ
© 2006 矢木浩人