2013/10/08

15.プロシージャ(PROCEDURE)と関数(FUNCTION)

■プロシージャ(Procedure)とは?
 →特定の作業を実行する名前のあるPL/SQL BLOCKだ。
 →パラメーターを受けられ、繰り返し使用できるBLOCKだ。
 →通常、連続実行または複雑なトランザクションを実行するPL/SQL BLOCKをデータベースに
  保存するために作る。

■プロシージャの文法


CREATE OR REPLACE procedure name
    IN argument
    OUT argument
    IN OUT argument

IS

    [変数の宣言]

BEGIN  --->必須

    [PL/SQL Block]
    --SQL文、PL/SQL制御文

    [EXCEPTION] --->選択
    --errorが発生する時実行する文章

END;  --->必須

 ・CREATE OR REPLACEを使用して作る
 ・ISでPL/SQLのブロックを始める
 ・LOCAL変数はISとBEGINの間に宣言する



■プロシージャ作成例

--プロシージャの名前はupdate sal
--update salプロシージャは社員番号を受けて給与をアップさせる
--プロシージャの終わりは「/」を表記する
SQL> CREATE OR REPLACE PROCEDURE update_sal
  2  /* IN Parameter */
  3  (v_empno IN NUMBER)
  4
  5  IS
  6
  7  BEGIN
  8
  9   UPDATE emp
 10  set sal = sal * 1.1
 11  WHERE empno = v_empno;
 12
 13  COMMIT;
 14
 15  END update_sal;
 16  /

プロシージャが作成されました。

SQL>


■プロシージャ実行例  EXECUTEを使用してプロシージャを実行する

SQL> EXECUTE update_sal(7369);

PL/SQLプロシージャが正常に完了しました。

SQL>
--社員番号7369の社員の給与が10%アップされたか確認してみよう


■関数(Function)とは?
 →通常、計算後の値を返す為に関数を使用するケースが多い
 →構成はほとんどプロシージャと似ているが、INパラメータのみ使用できる
 →返すデータタイプをRETURN文に宣言しなければいけない
 →PL/SQLブロック内でRETURN文を通じて値を返す

■関数文法


--PL/SQLブロックには少なくとも1つのRETURN文が必要だ
--PL/SQL Blockは関数が実行する内容を定義した本体部分た

CREATE OR REPLACE FUNCTION function name
 [(argument...)]

 RETURN datatype
  --datatypeは返す値のdatatypeだ

IS

 [PL/SQL Block]

 --RETURN文必須
 RETURN 変数;

END;


■関数作成例


SQL> CREATE OR REPLACE FUNCTION FC_update_sal
  2  (v_empno IN NUMBER)
  3
  4  --RETURNされる変数のデータタイプ定義は必須
  5  RETURN NUMBER
  6
  7  IS
  8
  9  --%type変数を使用
 10  v_sal emp.sal%type;
 11
 12  BEGIN
 13
 14  UPDATE emp
 15  SET sal = sal * 1.1
 16  WHERE empno = v_empno;
 17
 18  COMMIT;
 19
 20  SELECT sal
 21  INTO v_sal
 22  FROM emp
 23  WHERE empno = v_empno;
 24
 25  --RETURNは必須
 26  RETURN v_sal;
 27
 28  END;
 29  /

ファンクションが作成されました。

SQL>


■関数実行例


--まず関数が返す値を保存する変数を宣言
SQL> VAR salary NUMBER;

--EXECUTEを使用して関数を実行する
SQL> EXECUTE :salary := FC_update_sal(7900);

PL/SQLプロシージャが正常に完了しました。

--PRINT文で出力
SQL> PRINT salary;

    SALARY
----------
    1149.5

SQL>

2013/10/01

14.PL/SQL概要

■PL/SQLとは?
 →PL/SQLはOracle's Procedural Language extension to SQLの訳
 →SQL文で変数定義、条件処理(IF)、反復処理(LOOP,WHILE,FOR)等を使え、
  オラクルに内蔵されているProcedure  Languageである
 →DEClARE文を利用して定義され、宣言文の使用は選択事項
 →PL/SQL文はブロック構造になっていて、PL/SQL自身がコンパイルエンジンを持っている

■PL/SQLの長所
 →PL/SQL文はBLOCK構造で多数のSQL文を纏めてQRACLE DBに送り処理するので、処理速度が早い
 →より強力なプログラムを作成するために大BLOCKの中に小BLOCKを持てる
 →VARIABLE,CONSTANT,CURSOR,EXCEPTIONを定義し、SQL文とProcedural文で使用する
 →単純、複雑なデータ形の変数を宣言する。
 →テーブルのデータ構造とコラム名に準じて動的変数を宣言できる
 →EXCEPTION処理ルーティンを利用してOracle Server Errorを処理する
 →ユーザー定義エラーを宣言し、EXCEPTION処理ルーティンで処理可能だ

■PL/SQL Block Structure
 →PL/SQLはプログラムを論理的なブロックに分ける構造化されているブロック言語だ
 →PL/SQLブロックは宣言部(オプション)、実行部(必須)、例外処理部(オプション)で構成され、
  BEGINとENDキーワードは必ず記述する
 →PL/SQLブロックで使用する便数はブロックに対して論理的に宣言し、使用出来る

 ・Declarative Section(宣言部)
  →変数、定数、CURSOR、USER_DEFINE Exception宣言

 ・Executable Section(実行部)
  →SQL、反復文、条件文実行
  →実行部はBEGINで始まりENDで終了する
  →実行文はプログラム内容が入る部分で必須

 ・Exception Handling Section(例外処理)
  →例外に関する処理
  →一般的にエラーを定義し処理する部分で選択事項

■PL/SQLプログラムの作成要領
 →PL/SQLブロック内では一文が終了するたびにセミコロン「;」を使用する
 →ENDの後にセミコロン「;」を使用し1ブロックの終わりを明記する
 →PL/SQLブロックの作成はエディターでファイルに作成出でき、SQLプロンプトで直接作成できる
 →SQL*PLUS環境ではDECLAREやBEGINのキーワードでPL/SQLブロックが始まる
 →1行コメント:--
 →複数行コメント:/* */
 →PL/SQLブロックは行に「/」が有ると終了される


■PL/SQLブロックの形

 ・Aninymous Block
  →名前の無いブロックを意味し、実行するためプログラム内で宣言され実行時には実行のため
   PL/SQLエンジンに送られる
  →先行コンパイラープログラムとSQL*Plusまたはサーバー管理者からブロックを内蔵できる。

 ・Procedure
  →特定の作業を実行出来る名前のあるPL/SQLブロックで、パラメーターを受けられ、
   繰り返し使用できる
  →通常、連続実行または複雑なトランザクションを実行するPL/SQLブロックをDBへ
   保存するために作る

 ・Function
  →通常、計算を行い結果を返す為に関数を使用する
  →大体の構成がプロシーザーと似ているが、INパラメーターのみ使用可能で、
   必ず返す値のデータタイプをRETURN文に宣言しなければならない
   またPL/SQLブロック内でRETURN文で必ず値を返す必要がある。

QLOOKアクセス解析