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

戻る
戻る
 
次へ
次へ
 

例3: CREATE ROLEを使用した明示的なロール作成とGRANTを使用した暗黙的なロール作成

この例では、OpenVMS権利識別子と一致するロールの作成を示します。CREATE ROLE文を最初に使用し、次にGRANT文を使用します。GRANTでは、GRANT文の副次的な影響についてデータベース管理者に知らせる警告メッセージが表示されます。


SQL> create database
cont>   filename SAMPLE
cont>   security checking is internal;
SQL> show roles;
Roles in database with filename sample
 No Roles found
SQL> create role dba_mgr identified externally;
SQL> show roles;
Roles in database with filename sample
     DBA_MGR
SQL> grant saldb_user to smith;
%RDB-W-META_WARN, metadata successfully updated with the reported warning
-RDMS-W-PRFCREATED, some users or roles were created
SQL> show roles;
Roles in database with filename sample
     DBA_MGR
     SALDB_USER
SQL>


CREATE ROUTINE文

Oracle Rdbデータベースで、外部ルーチン定義をスキーマ・オブジェクトとして作成します。外部ルーチンとは、外部ファンクションと外部プロシージャの両方を意味します。ルーチン定義により、3GL言語で記述されたサブプログラム(ファンクションまたはプロシージャ)に関する情報がデータベースに格納されます。ルーチン定義とルーチン・イメージはそれぞれ独立しており、一方が存在しない場合でも、もう一方は存在できます。ただし、外部ルーチンを起動するには、ルーチン定義とルーチン・イメージの両方が必要です。

SQLでは、値式を指定できる任意の場所から外部ファンクションを起動できます。外部プロシージャは、複合文のCALL文 を使用して起動します。


環境

CREATE FUNCTION文とCREATE PROCEDURE文は次の環境で使用できます。


形式












引数

BIND ON CLIENT SITE

BIND ON SERVER SITE

外部ルーチン実行の実行モデルおよび環境を選択します。

CLIENTサイト・バインディングにより、外部ルーチンがアクティブ化され、OpenVMSデータベース・クライアント(アプリケーション)・プロセスで実行されます。これはデフォルトのバインディングです。このバインディングによって最も効率的な実行特性が提供され、I/Oデバイスなどのリソースを共有し、外部ルーチンをクライアント・アプリケーションの一部と同様にデバッグできます。ただし、このバインディングはアドレス空間の制限を受ける場合があります。データベース・バッファと仮想メモリーを共有しているため、このバインディングはクライアント・プロセスのシステム・ユーザー環境に限定されており、高レベルの権限が必要なアプリケーションの実行時に、外部ルーチンを実行することは禁止されています。

SERVERサイト・バインディングにより、外部ルーチンがデータベース・クライアントおよびサーバーとは別のプロセスでアクティブ化されます。このプロセスは、データベース・プロセスと同じノードで開始されます。このバインディングでは、適切な実行特性、より大きいアドレス空間、実際のセッション・ユーザー環境が提供され、高レベルの権限によるクライアント・プロセス制約を受けません。ただし、このバインディングでは、クライアントとI/Oデバイスなどのリソースを共有できないため(特に、クライアント対話型端末への接続がないため)、一般的にルーチンをデバッグできません。

BIND SCOPE CONNECT

BIND SCOPE TRANSACTION

外部ルーチンがアクティブ化される有効範囲と、外部ルーチンが非アクティブ化されるポイントを定義します。デフォルトの有効範囲はCONNECTです。

COMMENT IS 'string'

パラメータまたは外部ルーチンの性質について説明します。SQLでは、SHOW FUNCTION文またはSHOW PROCEDURE文の実行時にコメントのテキストが表示されます。コメントは一重引用符(')で囲み、コメント内の複数の行はスラッシュ(/)で区切ります。

DEFAULT value-expr

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

DEFAULT LOCATION

LOCATION 'image-location'

外部ルーチン・イメージのデフォルトの位置または特定の位置です。結果ファイルの仕様には、タイプ.exeが含まれている必要があります。

これは、イメージ・ファイルの仕様または単に論理名になります。

SQLでは、次の要素の組合せに基づいてルーチンを選択します。

DETERMINISTIC

NOT DETERMINISTIC

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

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

external-body-clause

ルーチン名、ルーチンの実行可能イメージの位置、ルーチンをコーディングする言語など、ルーチンのキー特性を識別します。

external-body-name

外部ルーチン名です。この名前を指定しない場合は、external-routine-name句で指定した名前がSQLに使用されます。

この名前により、ルーチン本体の起動ごとにコールされるルーチン・エントリ・アドレスが定義されます。location句で選択された外部ルーチン・イメージには、この名前付きルーチンが必要です。

引用符付きでない名前は、大文字に変換されます。

external-location-clause

ルーチン本体とルーチン・オプションを含むイメージを参照するファイル仕様により、エントリ・ポイントを通知します。

external-routine-name

外部ルーチン名です。この名前は外部ルーチンおよびスキーマのストアド・ルーチンで一意にする必要があり、別名で、または(マルチスキーマ・データベースの場合は)スキーマ名で修飾できます。

FUNCTION

外部ファンクション定義を作成します。

このファンクションはINパラメータのリストをオプションで受け入れ、常に値を返し、値式の要素として名前で参照されます。

GENERAL PARAMETER STYLE

これはPARAMETER STYLE GENERALと同じ意味ですが、廃止予定です。

LANGUAGE language-name

外部ルーチンがコーディングされたホスト言語の名前です。ADA、C、COBOL、FORTRAN、PASCALまたはGENERALを指定できます。GENERALキーワードを使用すると、任意の言語で記述したルーチンをコールできます。

言語固有の情報の詳細は、「使用方法」を参照してください。

LANGUAGE SQL

ルーチンをコールする言語を指定します。

mechanism-clause

受渡しメカニズムを定義します。次のリストでは、受渡しメカニズムについて説明します。

notify-clause

特定の外部ルーチンまたはデータベース関連のイベントが発生した場合に、2番目に呼び出される(通知される)ルーチンの名前を指定します。この名前により、通知ルーチンの起動ごとにコールされるルーチン・エントリ・アドレスが定義されます。location句で選択された外部ルーチン・イメージには、この名前付きルーチンが必要です。

通知ルーチンに関連するイベントはON BIND、ON CONNECTおよびON TRANSACTIONです。複数のイベントを指定できます。

次に、イベントと各イベントの有効範囲について説明します。

  BIND ルーチンのアクティブ化からルーチンの非アクティブ化
  CONNECT データベース・アタッチからデータベース切断
  TRANSACTION 開始トランザクションからコミットまたはロールバック・トランザクション

parameter-list

外部ルーチンのオプションのパラメータです。それぞれのパラメータについて、パラメータ・アクセス・モード(IN、OUTおよびINOUT)、パラメータ名、データ型、受渡しメカニズム(DESCRIPTOR、LENGTH、REFERENCEまたはVALUEによる)を指定できます。

パラメータ・アクセス・モード(IN、OUTおよびINOUT)はオプションであり、パラメータへのアクセス方法(読取り、書込み、またはその両方)を指定します。INは読取り専用、OUTは書込み専用、INOUTは読取りおよび書込みを表します。パラメータ・アクセス・モードはINにデフォルト設定されます。

INパラメータ・アクセス・モードのみ、外部ファンクションに対してパラメータで指定できます。いずれかのパラメータ・アクセス・モード(IN、OUTおよびINOUT)を、外部プロシージャに対してパラメータで指定できます。

オプションのパラメータ名には、接頭辞としてコロン(:)が付きます。パラメータ名は外部ルーチン・パラメータ内で一意である必要があります。

データ型が必要であり、これはSQLデータ型またはドメイン名を使用するパラメータのタイプを示します。

パラメータは、LIST OF BYTE VARYINGデータ型としては宣言できません。

PARAMETER STYLE GENERAL

OpenVMSの引数を渡しファンクション値を返す表記規則と同様の方法で引数を渡し、値を返します。

PROCEDURE

外部プロシージャ定義を作成します。

このプロシージャはIN、OUTまたはINOUTパラメータのリストをオプションで受け入れ、CALL文において名前で参照されます。

RETURNS result-data-type

RETURNS domain-name

ファンクション(戻り)値について説明します。データ型と受渡しメカニズム(BY DESCRIPTOR、LENGTH、REFERENCEまたはVALUE)を指定できます。定義では、ファンクション値はOUTアクセス・モード値です。

データ型が必要であり、これはSQLデータ型またはドメイン名を使用するパラメータのタイプを示します。

ファンクション値は、LIST OF BYTE VARYINGデータ型としては宣言できません。

STORED NAME IS identifier

マルチスキーマ・データベースに定義する際、ルーチンへのアクセスに使用される名前です。ストアド名を使用すると、1つのデータベース内では複数のスキーマを認識しないインタフェースを使用して、マルチスキーマ定義にアクセスできます。複数のスキーマに対応しないデータベース内では、ルーチンのストアド名は指定できません。ストアド名の詳細は、第2.2.18項を参照してください。

USAGE IS

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

VARIANT

NOT VARIANT

これらの句は、DETERMINISTIC句およびNOT DETERMINISTIC句と同義です。DETERMINISTIC句は、ファンクションに対する入力が同じであれば、出力も同じになることを示します。これはNOT VARIANT句と同義です。NOT DETERMINISTIC句は、ファンクションの出力は、その入力に依存しないことを示します。これはVARIANT句と同義です。この句は廃止予定です。かわりにDETERMINISTICを使用してください。

使用方法


例1: 整数の絶対値ルーチンの提供


SQL> CREATE FUNCTION IABS (IN INTEGER BY REFERENCE)
cont>   RETURNS INTEGER BY VALUE;
cont>   EXTERNAL NAME MTH$JIABS
cont>   LOCATION 'SYS$SHARE:DPML$SHR.EXE'
cont>   LANGUAGE GENERAL
cont>   PARAMETER STYLE GENERAL
cont>   NOT DETERMINISTIC;
SQL> --
SQL> SELECT IABS(-33) FROM JOBS LIMIT TO 1 ROW;

          33
1 row selected

例2: DETERMINISTIC句ではなく、NOT DETERMINISTIC句の使用

次の例では、最初にCREATE FUNCTION文でDETERMINISTIC句を使用し、ファンクションを作成します。DETERMINISTIC句は、コールされる回数に関係なく、ファンクションが同じ結果を返すことを示します。引数は文字列リテラルであり、変更できないため、Oracle Rdbでは、ファンクション・コール全体を最適化し、後続のSELECT文でコールされないようにします。


SQL> -- Create a function with a DETERMINISTIC clause.
SQL> CREATE function DO_COM (IN VARCHAR(255) BY DESCRIPTOR)
cont>       RETURNS INTEGER;
cont>       EXTERNAL NAME LIB$SPAWN
cont>                LOCATION 'SYS$SHARE:LIBRTL.EXE'
cont>       LANGUAGE GENERAL
cont>       PARAMETER STYLE GENERAL
cont>       DETERMINISTIC;
SQL> --
SQL> -- Use a SELECT statement to pass a string literal to the function.
SQL> --
SQL> -- Because  Oracle Rdb  optimizes functions with the DETERMINISTIC
SQL> -- clause, and the function is passed a string literal,
SQL> --  Oracle Rdb  does not call the function from subsequent
SQL> -- statements.
SQL> --
SQL> SELECT DO_COM('WRITE SYS$OUTPUT "HELLO"'), employee_id FROM employees
cont> LIMIT TO 5 ROWS;
HELLO
      DO_COM   EMPLOYEE_ID
           1   00164
           1   00165
           1   00166
           1   00167
           1   00168
5 rows selected
SQL> --
SQL> -- Use the NOT DETERMINISTIC clause to create the function:
SQL> --
SQL> CREATE function DO_COM (IN VARCHAR(255) BY DESCRIPTOR)
cont>       RETURNS INTEGER;
cont>       EXTERNAL NAME lib$SPAWN
cont>                LOCATION 'SYS$SHARE:LIBRTL.EXE'
cont>       LANGUAGE GENERAL
cont>       PARAMETER STYLE GENERAL
cont>       NOT DETERMINISTIC;
SQL> SELECT DO_COM('WRITE SYS$OUTPUT "HELLO"'), EMPLOYEE_ID FROM EMPLOYEES
cont> LIMIT TO 5 ROWS;
HELLO
HELLO
      DO_COM   EMPLOYEE_ID
           1   00164
HELLO
           1   00165
HELLO
           1   00166
HELLO
           1   00167
           1   00168
5 rows selected

例3: 外部ファンクションおよび外部プロシージャ定義

この例では、次を示しています。

この例では、MF_PERSONNELデータベースのEMPLOYEES表に新規の列を追加します。外部ルーチンは、新規の列をスペース、および様々な従業員名に対応するSOUNDEX値に設定するために使用されます。アプリケーション・レベル(この場合はSQL)とともに通知ルーチンを使用したトランザクション制御では、アプリケーションのアクションによる外部ルーチンのアクションへの影響を示します。

スペース充填は埋込みSQLを含む外部ファンクションCLEAR_SOUNDEX(C言語で記述)で実行されます。これはMF_PERSONNELデータベースの別のインスタンスをオープンし、非アクティブ化されるまで、そのインスタンスをオープンのままにします。

SOUNDEX name-settingは、通知ルーチン(FORTRANで記述)を使用した外部プロシージャ(FORTRANで記述)で実行されます。これはデータベースを接続し、トランザクションを制御します。すべてのデータベース操作はSQLモジュール言語ルーチンで実行されます。このプロシージャもMF_PERSONNELデータベースの別のインスタンスをオープンします。これはトランザクションの最後にルーチンを非アクティブ化すると、通知ルーチンによって切断されます。通知ルーチンによって実行される文を表示し、データベース操作の進捗を示します。


SQL> ATTACH 'FILENAME MF_PERSONNEL';
SQL> --
SQL> -- Add the new column SOUNDEX_NAME to the EMPLOYEES table.
SQL> --
SQL> ALTER TABLE EMPLOYEES ADD SOUNDEX_NAME CHAR(4);
SQL> --
SQL> -- Define the CLEAR_SOUNDEX function.
SQL> --
SQL> CREATE FUNCTION CLEAR_SOUNDEX ()
cont>  RETURNS INTEGER BY VALUE;
cont>     EXTERNAL NAME CLEAR_SOUNDEX
cont>       LOCATION 'CLEAR_SOUNDEX.EXE'
cont>     LANGUAGE C PARAMETER STYLE GENERAL NOT DETERMINISTIC
cont>     BIND ON SERVER SITE BIND SCOPE CONNECT;
SQL> --
SQL> -- Define the ADD_SOUNDEX_NAME procedure.
SQL> --
SQL> CREATE PROCEDURE ADD_SOUNDEX_NAME
cont>  (INOUT INTEGER BY REFERENCE);
cont>     EXTERNAL NAME ADD_SOUNDEX_NAME
cont>       LOCATION 'ADD_SOUNDEX.EXE'
cont>     LANGUAGE FORTRAN PARAMETER STYLE GENERAL
cont>     BIND ON CLIENT SITE BIND SCOPE TRANSACTION
cont>     NOTIFY ADD_SOUNDEX_NOTIFY ON BIND, TRANSACTION;
SQL> --
SQL> COMMIT;
SQL> DISCONNECT ALL;
SQL> EXIT;

例4: C言語で記述したCLEAR_SOUNDEX.SCプログラム


/* Set the soundex_name column to spaces, return any error as function value */

static int state = 0;

extern int clear_soundex () {
    exec sql include sqlca ;
    exec sql declare alias filename MF_PERSONNEL;
    if (state == 0) {
        exec sql attach 'filename MF_PERSONNEL';
        state = 1;
    }
    exec sql set transaction read write;
    if (SQLCA.SQLCODE < 0)
        return SQLCA.SQLCODE;
    exec sql update employees set soundex_name = '    ';
    if (SQLCA.SQLCODE < 0)
        return SQLCA.SQLCODE;
    exec sql commit;
    if (SQLCA.SQLCODE < 0)
        return SQLCA.SQLCODE;
    return 0;
}

例5: リンカー・オプション・ファイルのコンパイル、作成およびCLEAR_SOUNDEXプログラムへのリンク


$ SQL$PRE/CC/NOLIST/SQLOPT=ROLLBACK_ON_EXIT CLEAR_SOUNDEX.SC

$ CREATE CLEAR_SOUNDEX.OPT
    SYMBOL_VECTOR = (CLEAR_SOUNDEX=PROCEDURE)
    PSECT_ATTR=RDB$MESSAGE_VECTOR,NOSHR
    PSECT_ATTR=RDB$DBHANDLE,NOSHR
    PSECT_ATTR=RDB$TRANSACTION_HANDLE,NOSHR

$ LINK/SHARE=CLEAR_SOUNDEX.EXE -
  CLEAR_SOUNDEX.OBJ, SQL$USER:/LIBRARY, -
  CLEAR_SOUNDEX.OPT/OPT
    SYMBOL_VECTOR = (CLEAR_SOUNDEX=PROCEDURE)
    PSECT_ATTR=RDB$MESSAGE_VECTOR,NOSHR
    PSECT_ATTR=RDB$DBHANDLE,NOSHR
    PSECT_ATTR=RDB$TRANSACTION_HANDLE,NOSHR

例6: FORTRANで記述したADD_SOUNDEX.FORプログラム


C  Set the soundex values, returning any error in the IN/OUT parameter

        SUBROUTINE ADD_SOUNDEX_NAME (ERROR)
        CHARACTER ID*5,LAST*14,SX_NAME*4
        INTEGER ERROR
        ERROR = 0
        ID = '00000'
10      CALL GET_NAME (ID, LAST, ERROR)
        IF (ERROR .NE. 0) GO TO 80
        CALL MAKE_SOUNDEX_NAME (LAST, SX_NAME)
        CALL SET_SOUNDEX_NAME (ID, SX_NAME, ERROR)
        IF (ERROR .EQ. 0) GO TO 10
80      IF (ERROR .EQ. 100) ERROR = 0
90      RETURN
        END

C  Perform database connection and transaction operations for notify events

        SUBROUTINE ADD_SOUNDEX_NOTIFY (FUNC, RSV1, RSV2, RSV3)
        INTEGER FUNC, RSV1, RSV2, RSV3, SQLCODE
        SQLCODE = 0
        GO TO (10,20,5,5,30,40,50),FUNC
5       TYPE *,'*** ADD_SOUNDEX_NOTIFY bad func ***'
        GO TO 90
10      TYPE *,'*** ADD_SOUNDEX_NOTIFY activate ***'
        CALL ATTACH_DB (SQLCODE)
        IF (SQLCODE .NE. 0) GO TO 80
        GO TO 90
20      TYPE *,'*** ADD_SOUNDEX_NOTIFY deactivate ***'
        CALL DETACH_DB (SQLCODE)
        IF (SQLCODE .NE. 0) GO TO 80
        GO TO 90
30      TYPE *,'*** ADD_SOUNDEX_NOTIFY start tran ***'
        CALL START_TRAN (SQLCODE)
        IF (SQLCODE .NE. 0) GO TO 80
        GO TO 90
40      TYPE *,'*** ADD_SOUNDEX_NOTIFY commit tran ***'
        CALL COMMIT_TRAN (SQLCODE)
        IF (SQLCODE .NE. 0) GO TO 80
        GO TO 90
50      TYPE *,'*** ADD_SOUNDEX_NOTIFY rollback tran ***'
        CALL ROLLBACK_TRAN (SQLCODE)
        IF (SQLCODE .NE. 0) GO TO 80
        GO TO 90
80      CALL SQL_SIGNAL ()
90      RETURN
        END

C       A 'substitute' SOUNDEX routine for demonstration purposes only

        SUBROUTINE MAKE_SOUNDEX_NAME (NAME, SOUNDEX_NAME)
        CHARACTER NAME*(*),SOUNDEX_NAME*4
        SOUNDEX_NAME(1:1)=NAME(1:1)
        IV = ICHAR(NAME(1:1))+22
        SOUNDEX_NAME(2:2)=CHAR(MOD(IV,10)+48)
        SOUNDEX_NAME(3:3)=CHAR(MOD(IV/10,10)+48)
        SOUNDEX_NAME(4:4)=CHAR(IV/100+48)
        RETURN
        END

例7: ADD_SOUNDEXM.SQLMODモジュール


-- Support for set soundex routine

MODULE ADD_SOUNDEX
LANGUAGE FORTRAN
PARAMETER COLONS

PROCEDURE ATTACH_DB (SQLCODE);
    ATTACH 'FILENAME MF_PERSONNEL';
PROCEDURE DETACH_DB (SQLCODE);
    DISCONNECT DEFAULT;

PROCEDURE START_TRAN (SQLCODE);
    SET TRANSACTION READ WRITE;
PROCEDURE COMMIT_TRAN (SQLCODE);
    COMMIT;
PROCEDURE ROLLBACK_TRAN (SQLCODE);
    ROLLBACK;

PROCEDURE GET_NAME (:ID CHAR(5), :LASTNAME CHAR(14), SQLCODE);
    SELECT EMPLOYEE_ID, LAST_NAME INTO :ID, :LASTNAME
    FROM EMPLOYEES WHERE EMPLOYEE_ID > :ID LIMIT TO 1 ROW;

PROCEDURE SET_SOUNDEX_NAME (:ID CHAR(5), :SX_NAME CHAR(4), SQLCODE);
    UPDATE EMPLOYEES SET SOUNDEX_NAME = :SX_NAME WHERE EMPLOYEE_ID = :ID;

例8: リンカー・オプション・ファイルのコンパイル、作成およびFORTRANとSQLモジュール言語プログラムへのリンク


$ FORTRAN/NOLIST ADD_SOUNDEX.FOR
$ SQL$MOD ADD_SOUNDEXM.SQLMOD

$ CREATE ADD_SOUNDEX.OPT
    SYMBOL_VECTOR = (ADD_SOUNDEX_NAME=PROCEDURE)
    SYMBOL_VECTOR = (ADD_SOUNDEX_NOTIFY=PROCEDURE)
    PSECT_ATTR=RDB$MESSAGE_VECTOR,NOSHR
    PSECT_ATTR=RDB$DBHANDLE,NOSHR
    PSECT_ATTR=RDB$TRANSACTION_HANDLE,NOSHR

$ LINK/SHARE=ADD_SOUNDEX.EXE -
  ADD_SOUNDEX.OBJ, ADD_SOUNDEXM.OBJ, SQL$USER:/LIBRARY, -
  ADD_SOUNDEX.OPT/OPT
    SYMBOL_VECTOR  = ADD_SOUNDEX_NAME
    SYMBOL_VECTOR  = ADD_SOUNDEX_NOTIFY
    PSECT_ATTR=RDB$MESSAGE_VECTOR,NOSHR
    PSECT_ATTR=RDB$DBHANDLE,NOSHR
    PSECT_ATTR=RDB$TRANSACTION_HANDLE,NOSHR

例9: 対話型SQLでのルーチンの使用