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

MyMemoWiki

「Oracle PL/SQL」の版間の差分

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

制御

ループ