SQLファンクションとしての外部プロシージャの起動

データベース内のPL/SQLを使用して外部プロシージャを起動するステップを示します。

外部プロシージャの概要

外部プロシージャは、第3世代言語で記述されたファンクションで、PL/SQLルーチンまたはファンクションと同様に、PL/SQLまたはSQL内からコールできます。

外部プロシージャは、再利用性、効率性およびモジュール性を促進します。他の言語で記述された既存の動的リンク・ライブラリ(DLL)は、PL/SQLプログラムからコールできます。DLLは必要な場合にのみロードされ、コール・プログラムに影響を与えずに拡張できます。

また、外部プロシージャを使用するとパフォーマンスが向上します。これは、第3世代言語では、SQLトランザクション処理に適したPL/SQLよりも効率的に特定のタスクを実行するためです。

外部プロシージャは、次の場合に役立ちます。

  • 科学的問題や工学的問題の解決

  • データを分析しています

  • デバイスやプロセスのリアルタイム制御

詳細は、「外部プロシージャの概要」を参照してください。

Autonomous Databaseでの外部プロシージャの使用について

ユーザー定義ファンクションを使用して、Autonomous Databaseで外部プロシージャを起動および使用できます。

Autonomous Databaseインスタンスには外部プロシージャをインストールしません。外部プロシージャを使用するには、このプロシージャは、Oracle Cloud Infrastructure Virtual Cloud Network (VCN)で実行されているVMでリモートでホストされます。

外部プロシージャは、Autonomous Databaseがプライベート・エンドポイント上にある場合にのみサポートされます。EXTPROCエージェント・インスタンスはプライベート・サブネットでホストされ、Autonomous Databaseはリバース接続エンドポイント(RCE)を介してEXTPROCエージェントにアクセスします。

ノート

Autonomous Databaseでは、C言語の外部プロシージャのみがサポートされます。

外部プロシージャは、次のものを使用してデプロイされます。

  • Oracle Cloud Infrastructure (OCI) Marketplaceスタックの一部としてインストールおよび構成されたEXTPROCエージェントを含むOracle提供のコンテナ・イメージ。

    EXTPROCエージェント・インスタンスは、Oracle Cloud Infrastructure Virtual Cloud Network (VCN)で実行されているVMでリモートでホストされます。Autonomous DatabaseEXTPROCエージェント・インスタンス間のセキュアな通信は、プライベート・エンドポイントで実行されているAutonomous DatabaseインスタンスからEXTPROCエージェント・インスタンスへのトラフィックが許可されるようにネットワーク・セキュリティ・グループ(NSG)ルールを設定することで保証されます。

    EXTPROCエージェント・イメージは、ポート16000で外部プロシージャをホストおよび実行するように事前構成されています。

  • ライブラリを作成し、外部ファンクションおよびプロシージャを登録および起動するためのPL/SQLプロシージャ。

    詳細は、DBMS_CLOUD_FUNCTIONパッケージを参照してください。

Autonomous Databaseで外部プロシージャを起動するには、次のステップに従います:

Cプロシージャの定義

これらのプロトタイプのいずれかを使用し、Cプロシージャを定義します。

  • Kernighan & Ritchieスタイルのプロトタイプ。たとえば、次のとおりです。

    void UpdateSalary(x)
     float x;
    ...
    
  • 全角ではない数値データ型(floatshortcharなど)以外のISO/ANSIプロトタイプ。たとえば、次のとおりです。

    void UpdateSalary(double x)
    ...
    
  • デフォルトの引数昇格によってサイズが変更されないその他のデータ型。

    次の使用例は、デフォルトの引数昇格でサイズを変更します。

    void UpdateSalary(float x)
    ...

共有ライブラリ(.so)ファイルの作成

共有オブジェクト(.soファイル)ライブラリを作成します。共有オブジェクト・ライブラリには、前のステップで定義したCプロシージャ(外部プロシージャ)が含まれます。

次のコマンドを使用して、共有オブジェクト・ライブラリを生成します。

gcc -I/u01/app/oracle/extproc_libs/ -shared -fPIC -o extproc.so UpdateSalary.c

これにより、共有オブジェクト(.so)、extproc.soライブラリが作成されます。前のステップで定義したUpdateSalaryプロシージャは、extproc.soライブラリに含まれています。共有オブジェクト(.so)ライブラリは、実行時に動的にロードされます。

OCI Marketplace EXTPROCスタック・アプリケーションの取得

OCI Marketplace EXTPROCスタック・アプリケーションを取得するステップを示します。

次のステップを実行します:
  1. http://cloud.oracle.comでOCIコンソールにサインインします。詳細は、Oracle Cloud Infrastructure Consoleへのサインインを参照してください。
  2. Oracle Cloud Infrastructureの左側のナビゲーション・メニューから「マーケットプレイス」をクリックし、「マーケットプレイス」「すべてのアプリケーション」をクリックします。これにより、「Marketplace All Applications」ダッシュボードに移動します。
  3. 検索フィールドにEXTPROCを入力し、「検索」をクリックします。
  4. 「タイプ: スタック」EXTPROCウィジェットをクリックします。

    adbs_extproc_application.pngの説明が続きます

これにより、Oracle Autonomous Database EXTPROC Agentの詳細ページに移動します。

EXTPROCスタック・アプリケーションの起動

EXTPROCアプリケーションの詳細ページからEXTPROCスタック・アプリケーションを起動します。

  1. 「Oracle Autonomous Database EXTPROCエージェント」ページの「タイプ・スタック」で、次を実行します:
    • 「バージョン」ドロップダウン・リストから、スタックのパッケージ・バージョンを選択します。デフォルトでは、メニューには最新バージョンが表示されます。

    • 「コンパートメント」ドロップダウン・リストから、インスタンスを起動するコンパートメントの名前を選択します。

      ノート

      選択したコンパートメントでインスタンスを起動する権限がない場合は、インスタンスがルート・コンパートメントで起動されます。
    • 「Oracle標準条件および制約事項を確認しました」チェック・ボックスを選択します。

  2. 「スタックの起動」をクリックします。

    adb_launch_stack.pngの説明が続きます

これにより、EXTPROCエージェントのスタックを作成できる「スタックの作成」ページに移動します。

EXTPROCエージェント・アプリケーションのスタックの作成

EXTPROCインスタンスのスタックを作成するステップを示します。

スタックの作成ウィザードで、次のステップを実行します:
  1. 「スタック情報」ページで、必要に応じて次の情報をレビューおよび編集します:
    • スタック情報

    • カスタム・プロバイダ

    • 名前(オプション): デフォルトのスタック名を編集できます。機密情報を入力しないでください。

    • 説明(オプション): デフォルトのスタックの説明を編集できます。機密情報を入力しないでください。

    • コンパートメントに作成

    • Terraformのバージョン

    • タグ: スタックにタグを割り当てるには、次を指定します。

      • タグ・ネームスペース: 定義済タグを追加するには、既存のネームスペースを選択します。解放元タグを追加するには、値を空白のままにします。

      • タグ・キー: 定義済タグを追加するには、既存のタグ・キーを選択します。フリーフォーム・タグを追加するには、必要なキー名を入力します。

      • タグ値: 必要なタグ値を入力します。

      タグの追加: 別のタグを追加する場合にクリックします。

      タグ付けの詳細は、リソース・タグを参照してください。


    adbs_extproc_createstack_updated.pngの説明が続きます

  2. 「次」をクリックします。
    これにより、「変数の構成」ページに移動し、この実行計画の適用ジョブの実行時にスタックによって作成されるインフラストラクチャ・リソースの変数を構成できます。
  3. 「変数の構成」ページで、「EXTPROCエージェントの構成」「ネットワーク構成」および「コンピュート構成」の各領域に情報を入力します。
    1. 「EXTPROCエージェントの構成」領域に情報を指定します。
      • 外部ライブラリ: Autonomous Databaseからの起動を許可するライブラリのリストをカンマ(、)で区切って指定します。たとえば、extproc.soextproc1.soです。

        スタックを作成したら、ライブラリをEXTPROCエージェントVMの/u01/app/oracle/extproc_libsディレクトリにコピーする必要があります。

      • Walletパスワード:ウォレット・パスワードを指定します。

        ウォレットと自己署名証明書は、Autonomous DatabaseEXTPROCエージェントVM間の相互TLS認証用に生成されます。ウォレットは、/u01/app/oracle/extproc_walletディレクトリに作成されます。
        ノート

        ウォレットの作成後は、ウォレット・パスワードを変更できません。

      adbs_configure_var_extproc_agent.pngの説明が続きます

    2. 「ネットワーク構成」領域に情報を指定します。
      • コンパートメント: ドロップダウン・リストから、構成を配置するコンパートメントを選択します。

      • ネットワーク戦略: ドロップダウン・リストから、「新規VCNおよびサブネットの作成」または「既存のVCNおよびサブネットの使用」のいずれかのオプションを選択します。

        • 新規VCNおよびサブネットの作成: プライベート・エンドポイントがAutonomous Database用に構成されていない場合は、このオプションを選択します。これにより、セキュリティ・ルールで事前構成されたパブリックおよびプライベート・サブネットを含む新しいVCNが作成されます。

          このオプションを選択すると、このページには「構成戦略」ドロップダウン・リストも表示されます。

          「構成戦略」ドロップダウン・リストから「推奨構成の使用」を選択します。


          adb_extproc_network_config.pngの説明が続きます

        • 既存のVCNおよびサブネットの使用: 既存のVCNを使用してEXTPROCエージェントを作成するには、このオプションを選択します。これにより、指定されたサブネットにEXTPROCエージェント・インスタンスが作成されます。

          このオプションを選択する場合は、既存のVCNおよびサブネットについて次の情報を指定します:

          • 「Virtual Cloud Network」で:

            「既存のVCN」ドロップダウン・リストから、既存のVCNを選択します。指定されたVCNが存在しない場合は、新しいVCNが作成されます。

          • 「EXTPROCサブネット」で、次のようにします:

            「既存のサブネット」ドロップダウン・リストから、既存のサブネットを選択します。

            既存のVCNおよびサブネットの使用を選択した場合は、EXTPROCエージェント・インスタンスのポート16000のイングレス・ルールを追加します。また、パブリック・サブネットにエグレス・ルールを追加します。

            詳細は、プライベート・エンドポイントを使用したネットワーク・アクセスの構成を参照してください。


          adbs_extproc_network_configuration_existing_vcn.pngの説明が続きます

      • EXTPROCエージェント・アクセス・タイプ: ドロップダウン・リストから次のいずれかのオプションを選択します。

        • VCN内の特定のADB-Sプライベート・エンドポイント・データベースからのセキュア・アクセス: Virtual Cloud Network (VCN)内の指定されたプライベート・エンドポイントIPのみをEXTPROCエージェントに接続できるようにするには、このオプションを選択します。

          このオプションを選択した場合、次のステップで許可されるプライベート・エンドポイントIPアドレスのリストを指定します。

        • VCN内のすべてのADB-Sプライベート・エンドポイント・データベースからのセキュア・アクセス: Virtual Cloud Network (VCN)内のプライベート・エンドポイントがEXTPROCエージェントに接続できるようにするには、このオプションを選択します。

      • プライベート・エンドポイントIPアドレス

        プライベート・エンドポイントIPアドレス変数のプライベート・エンドポイントIPアドレスのリストをカンマ(、)で区切って指定します。例、 10.0.0.010.0.0.1

        ノート

        このフィールドは、VCN内の特定のADB-Sプライベート・エンドポイント・データベースからのセキュア・アクセスEXTPROCエージェント・アクセス・タイプに対して選択した場合にのみ表示されます。
    3. コンピュート構成情報を指定します。
      • コンパートメント: スタックを作成するコンパートメントを選択します。

      • シェイプ: EXTPROCエージェント・インスタンスのワークロード要件に基づいてシェイプを選択します。シェイプによって、EXTPROCエージェント・インスタンスに割り当てられるリソースが決まります。

      • OCPUの数: EXTPROCエージェント・インスタンスに割り当てるOCPUの数を選択します。

      • メモリー・サイズ(GB): EXTPROCエージェント・インスタンスに割り当てるメモリーの量(GB)を選択します。

      • SSHキーの追加: SSH公開キーをアップロードするか、公開キーを貼り付けます。次のいずれかのオプションを選択します:
        • SSHキー・ファイルの選択: キー・ペアの公開キー部分をアップロードします。アップロードするキー・ファイルを参照して選択するか、ボックスにファイルをドラッグ・アンド・ドロップします。

        • SSHキーの貼付け: キー・ペアの公開キー部分をボックスに貼り付けます。


      adbs_extproc_compute_config.pngの説明が続きます

  4. 「次」をクリックします。

    これにより、「確認」ページに移動します。

  5. 「レビュー」ページで、次のステップを実行します:
    1. 構成変数を確認します。
    2. 「作成されたスタックで適用を実行しますか。」「適用の実行」チェック・ボックスを選択します
    3. 「作成」をクリックします。
    ノート

    この領域には、デフォルト値または変更していない変数は表示されません。

    adbs_extproc_review.pngの説明が続きます

    リソース・マネージャは、適用ジョブを実行して、それに応じてスタック・リソースを作成します。これにより、「ジョブ詳細」ページに移動し、ジョブの状態は「受入れ済」になります。適用ジョブが開始されると、ステータスは「進行中」に更新されます。


    adbs_extproc_job_details.pngの説明が続きます

    ノート

    スタックの一部として作成されたインスタンスに接続するために必要な情報は、「アプリケーション情報」タブで使用できます。

WalletのアップロードによるEXTPROCエージェント・インスタンスへのセキュアな接続の作成

自己署名ウォレットは、EXTPROCエージェント・アプリケーションの作成の一部として作成されます。このウォレットを使用すると、Extrpocエージェント・インスタンスにアクセスできます。

EXTPROCエージェント・インスタンスでリモート・プロシージャを実行するには、Autonomous DatabaseおよびEXTPROCエージェントが相互トランスポート層セキュリティ(mTLS)を使用して接続します。Mutual Transport Layer Security (mTLS)を使用する場合、クライアントは、標準のTLS 1.2を信頼できるクライアント認証局(CA)証明書とともに使用して、TCPS (セキュアTCP)データベース接続を介して接続します。詳細は、相互TLS (mTLS)認証についてを参照してください。
ノート

認証局(CA)によって発行されたパブリック証明書を取得して使用することもできます。

前提条件として、EXTPROCが実行されているVMの /u01/app/oracle/extproc_walletディレクトリからウォレットをオブジェクト・ストレージにエクスポートする必要があります。

Autonomous Databaseにウォレットをアップロードするには、次のステップに従います:

  1. EXTPROCエージェント・インスタンスの証明書を含むウォレットcwallet.ssoを、Autonomous Databaseのオブジェクト・ストレージからインポートします。ウォレット・ファイルについては、次の点に注意してください。
    • ウォレット・ファイルは、データベースのユーザーIDおよびパスワードによって、EXTPROCエージェント・インスタンスへのアクセスが可能になります。ウォレット・ファイルはセキュアな場所に格納し、権限のあるユーザーとのみ共有します。

    • ウォレット・ファイルの名前を変更しないでください。オブジェクト・ストレージのウォレット・ファイルには、cwallet.ssoという名前を付ける必要があります。

  2. ウォレット・ファイルcwallet.ssoを格納するオブジェクト・ストレージにアクセスするための資格証明を作成します。様々なオブジェクト・ストレージ・サービスのユーザー名およびパスワード・パラメータの詳細は、CREATE_CREDENTIALプロシージャを参照してください。
    リソース・プリンシパル資格証明を有効にする場合、Oracle Cloud Infrastructure Object Storeにアクセスするための資格証明を作成する必要はありません。詳細は、リソース・プリンシパルを使用したOracle Cloud Infrastructureリソースへのアクセスについてを参照してください。
  3. ウォレット・ファイルcwallet.ssoのディレクトリをAutonomous Databaseに作成します。
    CREATE DIRECTORY wallet_dir AS 'directory_location';

    ディレクトリの作成の詳細は、Autonomous Databaseのディレクトリの作成を参照してください。

  4. DBMS_CLOUD.GET_OBJECTを使用してウォレットをアップロードします。例:
    BEGIN
      DBMS_CLOUD.GET_OBJECT (
        credential_name     => 'DEF_CRED_NAME',
        object_uri          => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname/o/cwallet.sso',
        directory_name      => 'WALLET_DIR'
    );
    END;
    /

    この例では、namespace-stringはOracle Cloud Infrastructure Object Storageネームスペースで、bucketnameはバケット名です。詳細は、オブジェクト・ストレージ・ネームスペースを参照してください。

    ウォレットは、前のステップで作成したディレクトリWALLET_DIRにコピーされます。EXTPROCエージェント・インスタンスに接続できるウォレットが、Autonomous Databaseインスタンスで使用できるようになりました。

外部プロシージャをSQLファンクションとして起動するステップ

外部プロシージャをSQLファンクションとして起動するステップを示します。

OCI MarketplaceのEXTPROCスタック・アプリケーションを起動し、外部プロシージャを実行するように構成したら、それぞれの外部プロシージャを参照およびコールするSQLラッパー関数のライブラリを作成します。

前提条件として、ホワイトリスト・ライブラリをEXTPROC VMの/u01/app/oracle/extproc_libsディレクトリにコピーする必要があります。

Autonomous Databaseにライブラリを作成し、Cルーチンをライブラリの外部プロシージャとして登録するには、次のステップに従います:
  1. ライブラリを作成します。

    外部プロシージャは、ライブラリに格納されているC言語ルーチンです。Autonomous Databaseで外部プロシージャを起動するには、ライブラリを作成します。

    DBMS_CLOUD_FUNCTION.CREATE_CATALOGを実行してライブラリを作成します。たとえば:

    BEGIN
        DBMS_CLOUD_FUNCTION.CREATE_CATALOG (
            library_name               => 'demolib',
            library_listener_url       => 'remote_extproc_hostname:16000',
            library_wallet_dir_name    => 'wallet_dir',
            library_ssl_server_cert_dn => 'CN=VM Hostname',
            library_remote_path        => '/u01/app/oracle/extproc_libs/library name'
    );
    END;
    /
    

    これにより、Autonomous Databasedemolibライブラリが作成され、データベースに動的リンク・ライブラリが登録されます。EXTPROCエージェント・インスタンスは、ポート16000で外部プロシージャをホストするように事前構成されています。

    詳細は、CREATE_CATALOGプロシージャを参照してください。

    DBA_CLOUD_FUNCTION_CATALOGビューおよびUSER_CLOUD_FUNCTION_CATALOGビュー・ビューを問い合せて、データベース内のすべてのカタログおよびライブラリのリストを取得します。

    USER_CLOUD_FUNCTION_ERRORSビュー・ビューを問い合せて、リモート・ライブラリの場所への接続の検証中に生成されたエラーをリストします。

  2. ライブラリを作成したら、DBMS_CLOUD_FUNCTION.CREATE_FUNCTIONを使用して、外部プロシージャ(Cファンクション)を参照するPL/SQLラッパー・ファンクションを作成します。

    例:

    DECLARE
        plsql_params clob    := TO_CLOB('{"sal": "IN, FLOAT", "comm" :"IN, FLOAT"}');
        external_params clob := TO_CLOB('sal FLOAT, sal INDICATOR SHORT, comm FLOAT, comm INDICATOR SHORT,
        RETURN INDICATOR SHORT, RETURN FLOAT');
    BEGIN
    DBMS_CLOUD_FUNCTION.CREATE_FUNCTION (
        LIBRARY_NAME    => 'demolib',
        FUNCTION_NAME   => '"PercentComm"',
        PLSQL_PARAMS    => plsql_params,
        EXTERNAL_PARAMS => external_params,
        API_TYPE        => 'FUNCTION',
        WITH_CONTEXT    => FALSE,
        RETURN_TYPE     => 'FLOAT'
    );
    END;
    /
    

    これにより、PercentCommファンクションが作成され、PercentComm外部プロシージャがDEMOLIBライブラリに登録されます。

    ライブラリ内のPercentComm関数は、FUNCTION_IDパラメータによって名前が参照されるそれぞれの外部プロシージャへの参照です。

    この例では、FUNCTION_IDパラメータが指定されていません。FUNCTION_NAMEパラメータに指定された値は、FUNCTION_IDとして使用されます。

    例:

    DECLARE
        plsql_params clob := TO_CLOB('{"row_id": "IN,CHAR"}');
        external_params clob := TO_CLOB('CONTEXT, row_id STRING, row_id LENGTH SB4');
    BEGIN
    DBMS_CLOUD_FUNCTION.CREATE_FUNCTION (
        LIBRARY_NAME    => 'demolib',
        FUNCTION_NAME   => 'UpdateSalary_local',
        FUNCTION_ID     => '"UpdateSalary"',
        PLSQL_PARAMS    => plsql_params,
        EXTERNAL_PARAMS => external_params,
        API_TYPE        => 'PROCEDURE',
        WITH_CONTEXT    => TRUE
    );
    END;
    /
    

    これにより、UPDATESALARY_LOCALプロシージャが作成され、UpdateSalaryプロシージャがDEMOLIBライブラリに登録されます。

    ライブラリ内のUPDATESALARY_LOCALプロシージャは、FUNCTION_IDパラメータによって名前が参照されるそれぞれの外部プロシージャUpdateSalaryへの参照です。

    DBA_CLOUD_FUNCTIONビューおよびUSER_CLOUD_FUNCTIONビュー・ビューを問い合せると、データベースで使用可能なすべての関数のリストを取得できます。

    詳細は、CREATE_FUNCTIONプロシージャを参照してください。

  3. ファンクションを作成したら、DESCRIBEできます。例:
    DESC "PercentComm";
  4. DROP_FUNCTIONプロシージャを使用して、既存のファンクションを削除できます。例:
    EXEC DBMS_CLOUD_FUNCTION.DROP_FUNCTION (LIBRARY_NAME => 'demolib', FUNCTION_NAME => '"PercentComm"');
    

    これにより、DEMOLIBライブラリからPercentComm関数が削除されます。

    詳細は、DROP_FUNCTIONプロシージャを参照してください。

  5. DROP_CATALOGプロシージャを使用して、既存のライブラリを削除できます。例:
    BEGIN
        DBMS_CLOUD_FUNCTION.DROP_CATALOG (
          LIBRARY_NAME  => 'demolib'
      );
    END;
    /
    

    これにより、DEMOLIBライブラリが削除されます。

    詳細は、DROP_CATALOGプロシージャを参照してください。