CREATE PROCEDURE
CREATE PROCEDURE文は、スタンドアロンのストアド・プロシージャを作成します。
必要な権限
CREATE PROCEDURE(所有者の場合)またはCREATE ANY PROCEDURE(非所有者の場合)。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
CREATE [OR REPLACE] PROCEDURE [Owner.]ProcedureName[(arguments [IN|OUT|IN OUT][NOCOPY] DataType [DEFAULT expr][,...])] [InvokerRightsClause][AccessibleByClause] [DETERMINISTIC] {IS|AS} plsql_procedure_body InvokerRightsClause::= AUTHID {CURRENT_USER|DEFINER} AccessibleByClause::= ACCESSIBLE BY(accessor[,...])accessor::= [UnitKind][Owner.]UnitName
InvokerRightsClause、AccessibleByClauseまたはDETERMINISTICは任意の順序で指定できます。
パラメータ
| パラメータ | 説明 |
|---|---|
|
|
プロシージャがすでに存在する場合に再作成するには、 |
|
|
プロシージャの名前。 |
|
|
引数またはパラメータの名前。プロシージャには0以上のパラメータを指定できます。パラメータを指定する場合は、パラメータのデータ型を指定する必要があります。データ型はPL/SQLデータ型である必要があります。 |
|
|
パラメータのモード。
|
|
|
可能なかぎり迅速にパラメータを渡すようにTimesTenに指示するには、 |
|
|
パラメータの |
|
|
PL/SQLファンクションまたはプロシージャ内のSQL文が定義者権限で実行されるか実行者権限で実行されるかを指定できます。
詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』の「定義者権限および実行者権限(AUTHID句)」を参照してください。 |
|
|
この句は、プロシージャを直接呼び出せる1つ以上のアクセッサ(PL/SQLユニット)を指定する場合に使用します。プロシージャにアクセスできるアクセッサのリストは、ホワイト・リストと呼ばれます。ホワイト・リストを使用すると、PL/SQLオブジェクトにセキュリティ・レイヤーを追加できます。特に、ホワイト・リストにあるオブジェクトのみにプロシージャへのアクセスを制限できます。
構文: |
|
|
アクセサは、 構文: |
|
|
|
|
|
|
|
|
パラメータに同じ値を指定してプロシージャをコールした場合に常に同じ結果値を返すように指定するには、 |
|
|
|
|
|
プロシージャの本体を指定します。 |
説明
-
AccessibleByClause:-
コンパイラは
AccessibleByClauseの構文の妥当性をチェックしますが、アクセッサが存在することはチェックしません。このため、所有者のスキーマにまだ存在しているアクセッサを定義できます。 -
プロシージャを呼び出すと、コンパイラはまず呼出しの通常のアクセス権チェックを実行します。いずれかのチェックに失敗すると、呼出し元がアクセッサであっても呼出しは失敗します。呼出し時の通常のアクセス権チェックがすべて成功し、このプロシージャに
AccessibleByClauseがない場合、呼出しは成功します。プロシージャにAccessibleByClauseがある場合、呼出し元がアクセッサである場合にのみ呼出しは成功します。
-
-
プロシージャを作成または置き換えた場合、プロシージャに付与された権限は同じままです。オブジェクトを削除して再作成した場合、元のオブジェクトに付与されていたオブジェクト権限は削除されます。
-
PL/SQLプロシージャのネームスペースは、TimesTen組込みプロシージャとは異なります。PL/SQLプロシージャは、TimesTen組込みプロシージャと同じ名前で作成できます。
-
次の句はTimesTenではサポートされません。
-
call_spec句 -
AS EXTERNAL句
-
-
レプリケートされた環境で、
CREATE PROCEDURE文はレプリケートされません。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』の「既存のアクティブ・スタンバイ・ペアでの新しいPL/SQLオブジェクトの作成」および「既存のクラシック・レプリケーション・スキームへのPL/SQLオブジェクトの追加」を参照してください。
例
Accessible By句の使用
この例では、ProtectedProcプロシージャを作成し、ACCESSIBLE BY句を使用してCallingProcプロシージャへのアクセスを制限します。CallingProcプロシージャはまだ存在しません。次に、ProtectedProcプロシージャをコールするCallingProcプロシージャを作成します。CallingProcプロシージャは、ACCESSIBLE BY句で指定されているため正常に作成されます。例では、ProtectedProcプロシージャを直接コールしようとしてエラーが発生します。最終的にProtectedProcプロシージャを参照するAnotherCallingProcプロシージャを作成しようとしますが、AnotherCallingProcプロシージャはホワイト・リストに存在しません。コンパイル・エラーが発生します。
この例を示すステップ:
-
ACCESSIBLEBY句を指定して、ProtectedProcプロシージャを作成します。CallingProcプロシージャは、ホワイト・リストにあります。まだ存在しません。Command> CREATE OR REPLACE PROCEDURE ProtectedProc ACCESSIBLE BY (CallingProc) AS BEGIN DBMS_OUTPUT.PUT_LINE ('ProtectedProc'); END; / Procedure created. -
ProtectedProcプロシージャを参照して、CallingProcプロシージャを作成します。Command> CREATE OR REPLACE PROCEDURE CallingProc AS BEGIN DBMS_OUTPUT.PUT_LINE ('CallingProc'); ProtectedProc; END; / Procedure created. -
CallingProcプロシージャをコールします。プロシージャは正常に実行されます。Command> SET SERVEROUTPUT ON Command> exec CallingProc; CallingProc ProtectedProc PL/SQL procedure successfully completed.
-
ProtectedProcプロシージャの直接のコールを試行します。アクセス権限が不十分なため、エラーがスローされます。Command> exec ProtectedProc; 8503: ORA-06550: line 1, column 7: PLS-00904: insufficient privilege to access object PROTECTEDPROC 8503: ORA-06550: line 1, column 7: PL/SQL: Statement ignored The command failed.
-
ProtectedProcプロシージャを参照するAnotherCallingProcプロシージャを作成します。AnotherCallingProcがホワイト・リスト内にない(ProtectedProcのACCESSIBLEBY句に含まれない)ため、コンパイル・エラーが発生します。Command> CREATE OR REPLACE PROCEDURE AnotherCallingProc AS BEGIN DBMS_OUTPUT.PUT_LINE ('AnotherCallingProc'); ProtectedProc; END; / Warning: Procedure created with compilation errors. Command> SHOW ERRORS Errors for PROCEDURE ANOTHERCALLINGPROC: LINE/COL ERROR -------- ----------------------------------------------------------------- 5/1 PL/SQL: Statement ignored 5/1 PLS-00904: insufficient privilege to access object PROTECTEDPROC
アクセサ句の使用
この例は、アクセッサ句を一連のステップで使用する方法を示しています。
-
SampleUser1ユーザーとSampleUser2ユーザーを作成し、両方のユーザーにADMIN権限を付与します。Command> CREATE USER SampleUser1 IDENTIFIED BY SampleUser1; User created. Command> CREATE USER SampleUser2 IDENTIFIED BY SampleUser2; User created. Command> GRANT ADMIN TO SampleUser1, SampleUser2;
-
ACCESSIBLEBY句を指定して、SampleUser1.ProtectedProcプロシージャを作成します。CallingProcプロシージャは、所有者なしでホワイト・リスト内に指定されます。CallingProcプロシージャの所有者は、ACCESSIBLEBY句を持つプロシージャの所有者と同じスキーマ内に存在すると想定されます。したがって、CallingProcはSampleUser1スキーマ内にあるとみなされます。Command> CREATE OR REPLACE PROCEDURE SampleUser1.ProtectedProc ACCESSIBLE BY (CallingProc) AS BEGIN DBMS_OUTPUT.PUT_LINE ('SampleUser1 ProtectedProc'); END; / Procedure created. -
SampleUser1として接続します。SampleUser1.ProtectedProcプロシージャを参照して、CallingProcプロシージャを作成します。Command> Connect adding "uid=SampleUser1;pwd=SampleUser1PW" as SampleUser1; Connection successful: DSN=database1;UID=SampleUser1;DataStore=/scratch/sampleuser1/database1; DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8; PermSize=128; (Default setting AutoCommit=1) sampleuser1: Command> CREATE OR REPLACE PROCEDURE CallingProc AS BEGIN DBMS_OUTPUT.PUT_LINE ('SampleUser1 CallingProc'); ProtectedProc; END; / Procedure created. -
SampleUser1接続から、CallingProcプロシージャをコールします。コールは成功します。sampleuser1: Command> SET SERVEROUTPUT ON sampleuser1: Command> exec CallingProc; SampleUser1 CallingProc SampleUser1 ProtectedProc PL/SQL procedure successfully completed.
-
SampleUser2に接続します。SampleUser1.ProtectedProcプロシージャを参照して、CallingProcプロシージャを作成します。コンパイル・エラーが発生します。SampleUser1: Command> connect adding "uid=Sampleuser2;pwd=SampleUser2PW" as SampleUser2; Connection successful: DSN=database1;UID=Sampleuser2;DataStore=/scratch/sampleuser2/database1; DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8; PermSize=128; (Default setting AutoCommit=1) sampleuser2: Command> CREATE OR REPLACE PROCEDURE CallingProc AS BEGIN DBMS_OUTPUT.PUT_LINE ('SampleUser2 CallingProc'); SampleUser1.ProtectedProc; END; / Warning: Procedure created with compilation errors. sampleuser2: Command> SHOW ERRORS Errors for PROCEDURE CALLINGPROC: LINE/COL ERROR -------- ----------------------------------------------------------------- 5/1 PL/SQL: Statement ignored 5/1 PLS-00904: insufficient privilege to access object PROTECTEDPROC -
SampleUser1接続に切り替えます。ProtectedProcプロシージャを再作成します。sampleuser2: Command> use SampleUser1 sampleuser1: Command> CREATE OR REPLACE PROCEDURE ProtectedProc ACCESSIBLE BY (CallingProc, SampleUser2.CallingProc) AS BEGIN DBMS_OUTPUT.PUT_LINE ('SampleUser1 ProtectedProc'); END; / Procedure created. -
SampleUser2接続から、CallingProcプロシージャをコールします。SampleUser2.CallingProcはSampleUser1.ProtectedProcプロシージャのホワイト・リストにあり、実行が成功します。sampleuser1: Command> use SampleUser2; sampleuser2: Command> SET SERVEROUTPUT ON sampleuser2: Command> exec CallingProc SampleUser2 CallingProc SampleUser1 ProtectedProc PL/SQL procedure successfully completed.
CREATE PROCEDURE文を使用した情報の取得
プロシージャquery_empを作成して、従業員に関する情報を取得します。employee_id 171をプロシージャに渡し、2つのOUTパラメータに対してlast_nameおよびsalaryを取得します。
Command> CREATE OR REPLACE PROCEDURE query_emp
(p_id IN employees.employee_id%TYPE,
p_name OUT employees.last_name%TYPE,
p_salary OUT employees.salary%TYPE) IS
BEGIN
SELECT last_name, salary INTO p_name, p_salary
FROM employees
WHERE employee_id = p_id;
END query_emp;
/
Procedure created.