CREATE FUNCTION
CREATE FUNCTION文は、スタンドアロンのストアド・ファンクションを作成します。
必要な権限
CREATE PROCEDURE(所有者の場合)またはCREATE ANY PROCEDURE(非所有者の場合)。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
CREATE [OR REPLACE] FUNCTION [Owner.]FunctionName[(arguments [IN|OUT|IN OUT][NOCOPY] DataType [DEFAULT expr][,...])] RETURN DataType [InvokerRightsClause][AccessibleByClause][DETERMINISTIC] {IS|AS} PlsqlFunctionBody InvokerRightsClause::= AUTHID {CURRENT_USER|DEFINER} AccessibleByClause::= ACCESSIBLE BY (accessor[,...])accessor::= [UnitKind][Owner.]UnitName
InvokerRightsClause、AccessibleByClauseまたはDETERMINISTICは任意の順序で指定できます。
パラメータ
| パラメータ | 説明 |
|---|---|
|
|
ファンクションがすでに存在する場合に再作成するには、 |
|
|
ファンクションの名前。 |
|
|
引数またはパラメータの名前。ファンクションに0以上のパラメータを指定できます。パラメータを指定する場合は、パラメータのデータ型を指定する必要があります。データ型はPL/SQLデータ型である必要があります。 |
|
|
パラメータのモード。
|
|
|
可能なかぎり迅速にパラメータを渡すようにTimesTenに指示するには、 |
|
|
パラメータのデフォルト値を指定するには、この句を使用します。キーワード |
|
|
必須の句。ファンクションは値を戻す必要があります。ファンクションの戻り値のデータ型を指定する必要があります。 データ型の長さ、精度またはスケールは指定しないでください。 データ型はPL/SQLデータ型です。 |
|
|
PL/SQLファンクションまたはプロシージャ内のSQL文が定義者権限で実行されるか実行者権限で実行されるかを指定できます。
詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』の「定義者権限および実行者権限(AUTHID句)」を参照してください。 |
|
|
この句は、ファンクションを直接呼び出せる1つ以上のアクセッサ(PL/SQLユニット)を指定する場合に使用します。ファンクションにアクセスできるアクセッサのリストは、ホワイト・リストと呼ばれます。ホワイト・リストを使用すると、PL/SQLオブジェクトにセキュリティ・レイヤーを追加できます。特に、ホワイト・リストにあるオブジェクトのみにファンクションへのアクセスを制限できます。
構文: |
|
|
アクセッサは、 構文: |
|
|
|
|
|
|
|
|
パラメータに同じ値を指定して関数をコールした場合に常に同じ結果値を返すように指定するには、 |
|
|
|
|
|
ファンクションの本体を指定します。 |
説明
-
AccessibleByClause:-
コンパイラは
ACCESSIBLEBY句の構文の妥当性をチェックしますが、アクセッサが存在することはチェックしません。このため、所有者のスキーマにまだ存在しているアクセッサを定義できます。 -
ファンクションを呼び出すと、コンパイラはまず呼出しの通常のアクセス権チェックを実行します。いずれかのチェックに失敗すると、呼出し元がアクセッサであっても呼出しは失敗します。呼出し時の通常のアクセス権チェックがすべて成功し、このファンクションに
ACCESSIBLEBY句がない場合、呼出しは成功します。ファンクションにACCESSIBLEBY句がある場合、呼出し元がアクセッサである場合にのみ呼出しは成功します。
-
-
ファンクションを作成または置き換えた場合、ファンクションに付与された権限は同じままです。オブジェクトを削除して再作成した場合、元のオブジェクトに付与されていたオブジェクト権限は削除されます。
-
レプリケーション環境で、
CREATE FUNCTION文はレプリケートされません。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』の「既存のアクティブ・スタンバイ・ペアでの新しいPL/SQLオブジェクトの作成」および「既存のクラシック・レプリケーション・スキームへのPL/SQLオブジェクトの追加」を参照してください。 -
次の句はTimesTenではサポートされません。
-
parallel_enable_clause句を指定できますが、無効になります。
-
call_spec句 -
AS EXTERNAL句
-
例
Accessible By句の使用
この例では、ProtectedFunction関数を作成します。ACCESSIBLE BY句は、ファンクションの呼出しをCallingProc1プロシージャおよびCallingProc2プロシージャに制限するために使用されます。CallingProc1ではPL/SQLユニットのタイプは指定されず、CallingProc2では、PL/SQLユニットのタイプは(PROCEDURE)と指定されることに注意してください。
Command> CREATE OR REPLACE FUNCTION ProtectedFunction (a IN NUMBER)
RETURN NUMBER
ACCESSIBLE BY (CallingProc1, PROCEDURE CallingProc2)
AS
BEGIN
RETURN a * 1;
END;
/
Function created.
CallingProc1プロシージャとCallingProc2プロシージャを作成します。
Command> CREATE OR REPLACE PROCEDURE CallingProc1 AS
a NUMBER:=1;
BEGIN
a:=ProtectedFunction(a);
DBMS_OUTPUT.PUT_LINE ('Calling Procedure: '|| a);
END;
/
Procedure created.
Command> CREATE OR REPLACE PROCEDURE CallingProc2
AS
a NUMBER:=2;
BEGIN
a:=ProtectedFunction(a);
DBMS_OUTPUT.PUT_LINE ('Calling Procedure: '|| a);
END;
/
Procedure created.
プロシージャをコールします。CallingProc1およびCallingProc2はホワイト・リストにあり、実行は成功します。
Command> SET SERVEROUTPUT ON Command> exec CallingProc1; Calling Procedure: 1 PL/SQL procedure successfully completed. Command> exec CallingProc2; Calling Procedure: 2 PL/SQL procedure successfully completed.
PL/SQLファンクションを作成するための構文の説明
1つの入力パラメータを指定してファンクションget_salを作成します。NUMBER型としてsalaryを戻します。
Command> CREATE OR REPLACE FUNCTION get_sal
(p_id employees.employee_id%TYPE) RETURN NUMBER IS
v_sal employees.salary%TYPE := 0;
BEGIN
SELECT salary INTO v_sal FROM employees
WHERE employee_id = p_id;
RETURN v_sal;
END get_sal;
/
Function created.