日本語PDF

外部プロシージャの登録

外部プロシージャを含むDLLをビルドした後は、外部プロシージャをOracle Databaseに登録する必要があります。

セキュリティを強化するために、EXTPROCプロセスを構成すると、CREDENTIALを介して認証できます。

Oracle DatabaseではCREATE LIBRARYコマンドの新しい2つの拡張がサポートされます。これは、CREDENTIAL句およびDIRECTORYオブジェクト・オプションです。CREDENTIAL句はユーザーのEXTPROCの実行を定義し、DIRECTORYオブジェクト・オプションはDLLを配置するディレクトリを指定します。

DLLにマップするためのPL/SQLライブラリを作成するには、次のようにします。

  1. listener.oraENVSパラメータに環境変数EXTPROC_DLLSを設定します。次に例を示します。
    SID_LIST_LISTENER =
     (SID_LIST =
      (SID_DESC =
       (SID_NAME=PLSExtProc)
       (ENVS=EXTPROC_DLLS=C:\app\oracle\product\19.0.0\dbhome_1\rdbms\extproc\extern.dll)
       (ORACLE_HOME=C:\app\oracle\product\19.0.0\dbhome_1)
       (PROGRAM=extproc)
      )
     )
    
  2. SQL*Plusを起動します。
    C:\> sqlplus
    
  3. 適切なユーザー名およびパスワードを入力してデータベースに接続します。
  4. CREATE LIBRARYコマンドでPL/SQLライブラリを作成します。
    DBMS_CREDENTIAL.CREATE_CREDENTIAL(...);
    CREATE DIRECTORY DLL_LOC as ...;
    CREATE LIBRARY externProcedures as 'extern.dll' in DLL_LOC credential the_credential;
    

    the_credentialDBMS_CREDENTIAL.CREATE_CREDENTIALの起動時に選択される名前です。

    SQL> CREATE LIBRARY externProcedures AS 'C:\app\oracle\product\19.0.0\dbhome_1\rdbms\ extproc\extern.dll';
    

    externProceduresは、別名のライブラリ(実際にはデータベースのスキーマ・オブジェクト)です。

    C:\app\oracle\product\19.0.0\dbhome_1\rdbms\extproc\extern.dll
    

    これは、Windowsオペレーティング・システムのdllextern.dllへのパスです。この例では、OracleベースとしてC:\app\oracle\product\19.0.0を、Oracleホームとしてdbhome_1を使用しています。

    注意:

    PL/SQLまたはSQLからPL/SQLライブラリの外部プロシージャをコールする必要のあるユーザーに対して、DBAは、PL/SQLライブラリへのEXECUTE権限を付与する必要があります。CREDENTIALおよびDIRECTORYオブジェクトの拡張での個別のEXECUTE権限が、それらが適切に機能するために必要です。

  5. PL/SQLプログラム・ユニットの仕様部を作成します。

    宣言部およびBEGIN...ENDブロックのかわりにEXTERNAL句を使用するPL/SQLサブプログラムを記述します。EXTERNAL句は、PL/SQLと外部プロシージャの間のインタフェースです。EXTERNAL句は、外部プロシージャに関する次の情報を示します。

    • 名前

    • DLLの別名

    • 使用したプログラム言語

    • コール標準(省略した場合は、デフォルトのCが使用される)

    次の例では、externProceduresはDLLの別名です。このライブラリに対するEXECUTE権限が必要です。コールする外部プロシージャはfind_maxです。二重引用符で囲まれている場合、大文字と小文字は区別されます。LANGUAGEでは、外部プロシージャを作成した言語を指定します。

    CREATE OR REPLACE FUNCTION PLS_MAX(
      x BINARY_INTEGER,
      y BINARY_INTEGER)
    RETURN BINARY_INTEGER AS EXTERNAL
      LIBRARY externProcedures
      NAME "find_max"
      LANGUAGE C
      PARAMETERS (
        x long,                  -- stores value of x
        x_INDICATOR short,       -- used to determine if x is a NULL value
        y long,                  -- stores value of y
        y_INDICATOR short,        -- used to determine if y is a NULL value
      RETURN INDICATOR short );  -- need to pass pointer to return value's
                                 -- indicator variable to determine if NULL
    -- This means that my function is defined as:
        -- long max(long x, short x_indicator,
        -- long y, short y_indicator, short * ret_indicator)