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

MyMemoWiki

差分

ナビゲーションに移動 検索に移動
258 バイト追加 、 2020年2月16日 (日) 04:30
編集の要約なし
==[[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/overviewover[[vi]]ew.html#1310
===特長===
*SQLのデータ操作機能と手続き型言語の処理機能の両方が利用できる。[[SQL]]のデータ操作機能と手続き型言語の処理機能の両方が利用できる。
*プログラム・フローを制御できる。
*変数の宣言、プロシージャとファンクションの定義、ランタイム・エラーのトラップが可能。
*複数のアプリケーション間でその定義済みコードを再利用できる。
*単純なSQLで問題が解決できる場合、PL単純な[[SQL]]で問題が解決できる場合、PL/SQLプログラム内でSQLコマンドを直接発行できる。[[SQL]]プログラム内で[[SQL]]コマンドを直接発行できる。*データ型は、SQLの列型と対応している。データ型は、[[SQL]]の列型と対応している。
===ブロック構造===
===変数の宣言===
*任意のSQLデータ型任意の[[SQL]]データ型(CHAR、DATE、NUMBERなど)や、BOOLEAN、PLS_INTEGERなどのPL/SQL固有のデータ型を持つことがでる。[[SQL]]固有のデータ型を持つことがでる。
*宣言部の各行の最後には、セミコロン(;)を付ける。
*コンポジット・データ型TABLE、VARRAY、RECORDを使用して、ネストした表、可変サイズの配列(VARRAY)およびレコードも宣言できる。コンポジット・データ型TABLE、VA[[R]][[R]]AY、[[R]]ECO[[R]]Dを使用して、ネストした表、可変サイズの配列(VA[[R]][[R]]AY)およびレコードも宣言できる。
DECLAREDECLA[[R]]E part_no NUMBERNUMBE[[R]](6); part_name VARCHAR2VA[[R]]CHA[[R]]2(20);
in_stock BOOLEAN;
part_price NUMBERNUMBE[[R]](6,2); part_desc VARCHAR2VA[[R]]CHA[[R]]2(50);
===変数への値の代入===
変数は演算子の左に、ファンクション・コールを含む式は演算子の右に置きます。変数を宣言するときに、変数に値を代入できます。
DECLAREDECLA[[R]]E wages NUMBERNUMBE[[R]]; hours_worked NUMBER NUMBE[[R]] := 40; hourly_salary NUMBER NUMBE[[R]] := 22.50; bonus NUMBER NUMBE[[R]] := 150; country VARCHAR2VA[[R]]CHA[[R]]2(128); counter NUMBER NUMBE[[R]] := 0;
done BOOLEAN;
valid_id BOOLEAN;
emp_rec1 employees%ROWTYPE[[R]]OWTYPE; emp_rec2 employees%ROWTYPE[[R]]OWTYPE; TYPE commissions IS TABLE OF NUMBER NUMBE[[R]] INDEX BY PLS_INTEGERPLS_INTEGE[[R]];
comm_tab commissions;
BEGIN
wages := (hours_worked * hourly_salary) + bonus;
country := 'France';
country := UPPERUPPE[[R]]('Canada');
done := (counter > 100);
valid_id := TRUET[[R]]UE;
emp_rec1.first_name := 'Antonio';
emp_rec1.last_name := 'Ortiz';
/
=====データベース値を選択またはフェッチして代入する方法。=====
DECLAREDECLA[[R]]E bonus NUMBERNUMBE[[R]](8,2); emp_id NUMBERNUMBE[[R]](6) := 100;
BEGIN
SELECT salary * 0.10 INTO bonus FROM F[[R]]OM employees WHERE WHE[[R]]E employee_id = emp_id;
END;
/
=====値をOUTパラメータまたはIN OUTパラメータとしてサブプログラムに渡し、サブプログラム内で代入する方法。=====
DECLAREDECLA[[R]]E new_sal NUMBERNUMBE[[R]](8,2); emp_id NUMBERNUMBE[[R]](6) := 126; PROCEDURE P[[R]]OCEDU[[R]]E adjust_salary(emp_id NUMBERNUMBE[[R]], sal IN OUT NUMBERNUMBE[[R]]) IS emp_job VARCHAR2VA[[R]]CHA[[R]]2(10); avg_sal NUMBERNUMBE[[R]](8,2);
BEGIN
SELECT job_id INTO emp_job FROM F[[R]]OM employees WHERE WHE[[R]]E employee_id = emp_id; SELECT AVG(salary) INTO avg_sal FROM F[[R]]OM employees WHERE WHE[[R]]E job_id = emp_job;
DBMS_OUTPUT.PUT_LINE ('The average salary for ' || emp_job
|| ' employees: ' || TO_CHARTO_CHA[[R]](avg_sal));
sal := (sal + avg_sal)/2; -- adjust sal value which is returned
END;
BEGIN
SELECT AVG(salary) INTO new_sal FROM F[[R]]OM employees;
DBMS_OUTPUT.PUT_LINE ('The average salary for all employees: '
|| TO_CHARTO_CHA[[R]](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_CHARTO_CHA[[R]](emp_id) || ' is ' || TO_CHARTO_CHA[[R]](new_sal)); -- sal has new value
END;
/
===バインド変数===
*SQLのINSERT、UPDATE、DELETEまたはSELECT文を直接埋め込むと、WHERE句およびVALUES句内の変数を自動的にバインド変数に変換する。[[SQL]]のINSERT、UPDATE、DELETEまたはSELECT文を直接埋め込むと、WHERE句およびVALUES句内の変数を自動的にバインド変数に変換する。*動的SQLの場合は、変数を通常使用する部分(WHERE句やVALUES句など)にバインド変数を指定する。動的[[SQL]]の場合は、変数を通常使用する部分(WHERE句やVALUES句など)にバインド変数を指定する。**リテラルおよび変数値を連結して単一の文字列にするかわりに、変数をバインド変数の名前(先頭にコロンを追加したもの)に置き換え、USING句を使用して対応するPL/SQL変数を指定します。[[SQL]]変数を指定します。
'DELETE FROM F[[R]]OM employees WHERE WHE[[R]]E employee_id = :id' USING emp_id;
====定数の宣言====
*キーワードCONSTANTを付けるキーワードCONST[[ANT]]を付ける
*定数に直接値を代入する必要がある。
credit_limit CONSTANT CONST[[ANT]] NUMBER := 5000.00;

案内メニュー