|
|
|
|
サブプログラム |
|
ストアド・サブプログラムは、Oracle データベースに格納されたプロシージャやファンクションで、以下の3つに分類されます。
・PL/SQL プロシージャ/(ストアド・プロシージャ)
・PL/SQL ファンクション/ストアド・ファンクション)
・PL/SQL パッケージ/(ストアド・パッケージ)
ストアドプロシージャとストアドファンクションのライブラリ集
トリガーは表、ビューのイベントに関連付けされているストアド・サブプログラムを言います。 |
|
|
ストアド・プロシージャ |
|
CREATE OR REPLACE PROCEDURE プロシージャ名
[ (パラメータ変数1 [ IN | OUT | INT OUT ]
データ型,
:
パラメータ変数n [ IN | OUT | INT OUT ] データ型) ] { AS | IS } -- local declarations
Begin
Exception
End [ プロシージャ名 ];
例 引数で指定した v_dept_id をキーに、表 departments の department_name を取得し、v_dept_nameを返却します
IF EXISTS (SELECT * FROM sysobjects WHERE id = object_id('get_dept') and
sysstat & 0xf = 4)
DROP PROCEDURE get_dept
GO
CREATE PROCEDURE get_dept
(
v_dept_id IN NUMBER,
v_dept_name OUT VARCHAR2
)
AS
Begin
SELECT department_name INTO v_dept_name FROM departments
WHERE department_id = v_dept_id;
End get_dept;
ブロックからの実行
Declare
disp_dept_name VARCHAR2(30);
Begin
get_dept(1000 , v_dept_name => disp_dept_name);
DBMS_OUTPUT.PUT_LINE(disp_dept_name);
End;
SQL*PLUSからの実行
SQL>EXECUTE get_dept('ID01','なまえ'); -- EXECUTEに替わりCALLも可 |
|
ストアド・ファンクション |
|
CREATE OR REPLACE FUNCTION ファンクション名 [ (パラメータ変数1 [ IN | OUT | INT OUT ]
データ型, : パラメータ変数n [ IN | OUT | INT OUT ]
データ型) ] RETURN データ型 { AS | IS }
/* 宣言セクション
*/
Begin /* 実行可能セクション */
Exception /* 例外セクション */
End [ ファンクション名 ];
例 引数で指定した v_dept_id をキーに、表 departments の department_name を取得してRETURNで返却します
IF EXISTS (SELECT * FROM sysobjects WHERE id = object_id('get_dept') and
sysstat & 0xf = 4)
DROP PROCEDURE get_dept
GO
CREATE FUNCTION get_dept
(
v_dept_id IN NUMBER
)
RETURN VARCHAR2
AS
v_dept_name VARCHAR2(10);
Begin
SELECT department_name INTO v_dept_name FROM departments
WHERE department_id = v_dept_id;
RETURN v_dept_name;
End get_dept;
ブロックからの実行
Declare
dept_name VARCHAR2(30);
Begin
department_name := get_dept(1000);
DBMS_OUTPUT.PUT_LINE(department_name);
End; |
|
|
ストアド・パッケージ |
|
パッケージは、ストアドファンクション、ストアドプロシジャを共有宣言も含めひとつにまとめたものです。ストアドパッケージは、パッケージ仕様部とパッケージ本体の2つから構成されます。 |
|
パッケージ仕様部
パッケージ外部またはパッケージ全体からアクセス可能な、プロシージャ、ファンクション、変数、例外、データ型、カーソルを定義します。プロシージャやファンクションはインターフェースの定義のみ記述し、内部のプログラムは、パッケージ本体に記述します。
CREATE OR REPLACE PACKAGE パッケージ名 { AS | IS }
プロシージャ定義;
ファンクション定義;
変数定義;
データ型定義;
例外定義;
カーソル定義;
END [ パッケージ名 ];
パッケージ本体
パッケージ仕様部で定義した、プロシージャやファンクションに対応するプログラムを記述します。また、パッケージ本体内部からのみアクセス可能な、プロシージャやファンクションも記述します。
CREATE OR REPLACE PACKAGE BODY パッケージ名 { AS | IS }
パッケージ仕様部のプロシージャ定義に対応したプログラム;
パッケージ仕様部のファンクション定義に対応したプログラム;
パッケージ本体内部から呼ばれるプロシージャプログラム;
パッケージ本体内部から呼ばれるファンクションプログラム;
END [パッケージ名];
|
|
|