ヘッダーをスキップ
Oracle Rdb SQLリファレンス・マニュアル
リリース7.2
E06178-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 


CREATE MODULE文

Oracle Rdbデータベースにオブジェクトとしてモジュールを定義します。モジュールは、ファンクションとプロシージャとともに格納されます。SQLで記述された、データとともにデータベースに存在するファンクションまたはプロシージャは、ストアド・ファンクションまたはストアド・プロシージャと呼ばれます。同様に、データベースに格納されるモジュールはストアド・モジュールと呼ばれます。ストアド・ルーチンは、ストアド・プロシージャまたはストアド・ファンクションのいずれかを参照します。

ストアド・プロシージャは、埋込みSQL、SQLモジュール言語または対話型SQLの単一文プロシージャでCALL文を使用して起動するか、複合文の内部でCALL文を使用して起動します。

ストアド・ファンクションは、値式にファンクション名を指定して起動します。

SQLでは、データベース内のストアド・ルーチンに対して格納、表示、削除、権限の付与および取消しを実行するメカニズムとして、モジュールの概念が適用されます。つまり、格納、削除、権限の付与および取消しは、個々のストアド・ルーチンに対しては実行できません。ストアド・ルーチンを削除する必要がある場合は、DROP FUNCTION routine-name CASCADE構文またはDROP PROCEDURE routine-name CASCADE構文を使用します。

通常、SQLはストアド・ルーチンではなく、モジュールを対象とします。ただし、DROP FUNCTION、DROP PROCEDURE、RENAME、SHOW FUNCTION、SHOW PROCEDUREおよびCALLの場合は除きます。SHOW FUNCTION文によって、ファンクションに関する情報が表示されます。SHOW PROCEDURE文によって、ストアド・モジュール内の個々のプロシージャが表示されます。CALL文では、単一のストアド・プロシージャのみを起動できます。


環境

CREATE MODULE文は、単一文プロシージャで次のような場合に使用できます。


形式








引数

AUTHORIZATION auth-id

モジュールの定義者を識別する名前であり、モジュール権限の検証に使用されます。

権限の検証の詳細は、「使用方法」を参照し、認可識別子の使用の詳細は、第2.2.2項を参照してください。

COMMENT IS 'string'

モジュール、ルーチンおよびパラメータに関するコメントを追加します。SQLでは、SHOW MODULE文の実行時にコメントのテキストが表示されます。コメントは一重引用符(')で囲み、コメント内の複数の行はスラッシュ(/)で区切ります。

compound-statement

ストアド・ルーチン内に複数のSQL文を組み込むことができるようにします。詳細は、「複合文」を参照してください。

compound-use-statement

ストアド・ルーチン内に1つのSQL文を組み込むことができるようにします。詳細は、「複合文」を参照してください。

ストアド・ファンクションを定義している場合、この単一文はRETURNS句である必要があります。

data-type

有効なSQLデータ型です。明示的なデータ型の指定は、ドメイン名指定の代替手段です。データ型の詳細は、第2.3節を参照してください。

declare-local-temporary-table-statement

モジュールに対してローカル一時表を宣言します。詳細は、「DECLARE LOCAL TEMPORARY TABLE文」を参照してください。

declare-transaction-statement

モジュールに対してトランザクションを宣言します。declare-transaction-statementは、各モジュールに1つのみ許可されます。省略すると、DECLARE TRANSACTION READ WRITEが暗黙的に使用されます。詳細は、「DECLARE TRANSACTION文」を参照してください。

declare-variable-statement

モジュールに対してグローバル変数を宣言します。詳細は、「DECLARE変数文」を参照してください。

DEFAULT value-expr

INモードで定義したファンクションまたはプロシージャに対するパラメータのデフォルト値を指定します。このパラメータを省略するか、CALL文の引数リストまたはファンクションの起動でDEFAULTキーワードが指定される場合は、この句に指定したvalue-exprが使用されます。値式を明示的に指定しない場合は、パラメータでNULLがデフォルトとして使用されます。

DETERMINISTIC

NOT DETERMINISTIC

この句は、問合せの有効範囲内で外部ファンクションの評価を制御します。

プロシージャ定義では、DETERMINISTIC句またはNOT DETERMINISTIC句は使用できません。

domain-name

CREATE DOMAIN文で作成されるドメインの名前です。ドメインの詳細は、「CREATE DOMAIN文」を参照してください。

DEFAULT value-expr

INモードで定義したファンクションまたはプロシージャに対するパラメータのデフォルト値を指定します。このパラメータを省略するか、CALL文の引数リストまたはファンクションの起動でDEFAULTキーワードが指定される場合は、この句に指定したvalue-exprが使用されます。値式を明示的に指定しない場合は、パラメータでNULLがデフォルトとして使用されます。

IN

OUT

INOUT parameter-name

ルーチンで使用されるパラメータ・モードを指定します。

INパラメータはストアド・ルーチンに読み込まれるパラメータを指定するものですが、このパラメータは設定されません。OUTパラメータはデータの送信先となるパラメータを指定するものです。OUTパラメータは設定されますが、読み込まれません。INOUTパラメータは入力データ(読込み対象)および受信データ(設定対象)を指定するものです。INOUTパラメータは変更対象となるパラメータです。

INパラメータはファンクションで使用できる唯一のモードです。

各パラメータ名はルーチン内で一意である必要があります。

LANGUAGE SQL

LANGUAGEキーワードおよびSQL引数は、モジュール内のプロシージャがホスト言語のプログラムではなく、SQL文によって起動されることを示します。

非ストアド・プロシージャの場合、LANGUAGEキーワードはホスト言語の名前を指定します。これは、モジュールのプロシージャをコールするプログラムを記述しているホスト言語を識別するものです。

この句はOracle Rdbリリース7.1以降ではオプションです。

module-name

モジュールに割り当てるユーザー指定の名前です。

ユーザー指定の名前の詳細は、第2.2節を参照してください。

parameter-decl

ストアド・ルーチンまたは外部ルーチンで使用されるパラメータおよびパラメータ・モードを指定します。

PROCEDURE procedure-name

FUNCTION function-name

モジュール内のストアド・ルーチンまたは外部ルーチンに割り当てるユーザー指定の名前です。ストアド・ルーチンに対して指定する名前は、データベース定義内で一意である必要があります。

RETURNS result-data-type

ファンクション起動後のデータ型またはドメインを指定します。この句はファンクションの定義時にのみ有効です。RETURNS句はファンクションの定義時にのみ使用できます。

routine-clause

モジュール内に作成されるストアド・ファンクションまたはストアド・プロシージャの定義です。

STORED NAME IS stored-name

マルチスキーマ・データベースに作成したモジュールのプロシージャまたはファンクションへのアクセスに使用される名前を指定します。

USAGE IS

ファンクションまたはプロシージャのコール方法を指定します。

VARIANT

NOT VARIANT

これらの句は、DETERMINISTIC句およびNOT DETERMINISTIC句と同義です。DETERMINISTIC句は、ファンクションに対する入力が同じであれば、出力も同じになることを示します。これはNOT VARIANT句と同義です。NOT DETERMINISTIC句は、ファンクションの出力は、その入力に依存しないことを示します。これはVARIANT句と同義です。

この句は廃止予定です。かわりにDETERMINISTICを使用してください。この句は、問合せの有効範囲内で外部ファンクションの評価を制御します。

プロシージャ定義では、DETERMINISTIC句またはNOT DETERMINISTIC句は使用できません。


使用方法


1依存性タイプ: DE(デフォルトで評価)、DR(デフォルトで予約)、LS(言語セマンティクス)、SR(ストアド・ルーチン)、SM(ストアド・モジュール)。
2Oracle Rdbでは、このドメインのパラメータ・リストの依存性はRDB$INTERRELATIONSではなくRDB$PARAMETERSに保持されます。
3Oracle Rdbでは、ドメインがストアド・ルーチン・ブロックにある場合、ルーチンの依存性はRDB$INTERRELATIONSに格納されます。
4RENAMEでは、削除されたシノニムが無効化されたルーチンである場合にのみ、古い名前に対してこのシノニムが追加されます。
5変更されたシノニムは同じ列またはパラメータ・リストのあるオブジェクト(表、ビュー、ファンクションまたはプロシージャ)を参照します。それ以外の場合、実行時にエラーが発生します。
6古い制約名がDECLARE TRANSACTION ... EVALUATING句で参照され、その後、この宣言されたトランザクションがルーチンの起動時に使用されると、エラーが発生します。

  • コメントのそれぞれの文字列リテラルの最大長は1024文字です。

  • ストアド・ファンクション内に、COMMIT文、ROLLBACK文、START TRANSACTION文、SET TRANSACTION文は指定できません。

  • ファンクションは、値式を使用できる任意の場所で起動できます。

  • Oracle Rdbには、ストアド・ルーチンで可能なネストの深さに関する制限は設定されていません。ここでは、メモリーとスタック・サイズによる制約のみを考慮する必要があります。

  • ストアド・ルーチンでは、モジュール内に事前に定義した他のストアド・ルーチンを参照できます。「DECLARE STATEMENT文」および「DECLAREルーチン文」も参照してください。

  • TRACE文は任意のストアド・ルーチンから使用できます。ただし、SQL内からTRACEフラグを有効にする場合は、ストアド・ルーチンを起動する前に有効にする必要があります。

  • 通常、SQLは組み込まれているルーチンではなく、モジュールに対して機能します。ただし、DROP FUNCTION、DROP PROCEDURE、SHOW FUNCTION、SHOW PROCEDUREおよびCALLの場合は除きます。SHOW FUNCTION文によって、ファンクションに関する情報が表示されます。SHOW PROCEDURE文によって、個々のプロシージャが表示されます。

  • mechanism-clauseは、SQLストアド・ファンクションまたはプロシージャでは使用できません。

  • グローバル変数については、次の使用方法に注意します。

  • CURRENT_USERまたはCURRENT_UIDをストアド・ファンクションまたはストアド・プロシージャのデフォルトとして使用すると、これらはコール元から渡されたものとして評価され、作成されるルーチン内では評価されません。これは、該当するモジュールが定義者権限モジュールである(AUTHORIZATION句が指定されている)場合にのみ有効です。
    たとえば、次の例では、実行者は現行ユーザーとして返されますが、想定したようにはモジュールのAUTHORIZATIONは戻されません。


    SQL> create module DEF
    cont>     authorization FEENAN
    cont> procedure DEF1
    cont>     (in :a char(31)
    cont>      default current_user);
    cont> trace :a;
    cont> end module;
    SQL>
    SQL> set flags 'trace';
    SQL> begin
    cont> call DEF1 ();
    cont> end;
    ~Xt: SMITH
    

  • デフォルトの式でSQLファンクションを使用して表にアクセスする場合、ファンクション内のLOCK TABLE文を使用して、該当する表をファンクション内またはネストされているコール先プロシージャ内で明示的にロックする必要があります。

  • 外部ルーチンおよびストアド・ルーチンは、単一モジュール内に組み込むことができます。これには次のような利点があります。


  • ストアド・モジュールの名前は、SQLモジュール言語モジュールや、外部機能を実装するプリコンパイルされたSQLモジュールに使用されている名前とは別のものにする必要があります。ただし、同一の名前や類似する名前を保持しておくと、今後のアプリケーションのメンテナンスに役立つ場合もあります。

  • 共有モジュール・データベース環境は、SQL文を実行する外部ルーチンでのみ有効です。

  • 外部ルーチンがデータベースにアタッチしている場合、起動元のセッションが終了すると暗黙的に切断されます。
    ただし、現在のトランザクション、オープンなカーソル、および外部ファンクション用に開始したセッションは、DISCONNECTを使用する前に終了することをお薦めします。これは、起動元ルーチンと同じコンテキストでトランザクションの終了と切断を行う外部ルーチンを明示的にコールするか、またはNOTIFYルーチンを使用して暗黙的に終了します。

  • CREATE MODULEの定義でdeclare-transaction-statementを省略すると、SQLによってデフォルトのDECLARE TRANSACTION READ WRITEが適用されます。


    例1: ストアド・モジュールおよびストアド・プロシージャの作成

    次の例では、対話型SQLを使用してストアド・モジュールおよびストアド・プロシージャを作成する方法を示します。