呼叫雲端函數與外部程序
在內部部署的 Oracle Database (Enterprise、Standard、Express、Personal Editions) 中,您可以編寫在 PL/SQL、Java 或 C 中的使用者定義函數,以提供 SQL 或 SQL 內建函數中無法使用的功能。您可以在 SQL 敘述句中呼叫這些使用者定義的函數,只要發生表示式即可。請參閱關於使用者定義函數。
從 Oracle Database 19c 開始,您可以使用 SQL 中的 Embedded Python 執行功能建立、儲存和執行 Python 程序檔。請參閱使用 OML4Py 的內嵌 Python 執行。
Oracle Autonomous AI Database on Dedicated Exadata Infrastructure 透過讓您能夠撰寫在雲端中呼叫無伺服器運算服務的 SQL Functions (例如 OCI),將使用者定義的函數擴展至雲端 Functions 與 AWS Lambda Functions 或 External Procedures - 包括 C/C++ 常式、Shell 或 Python 命令檔 - 在 Autonomous AI Database 外部的 OCI 運算 VM 中執行。
關於雲端函數與外部程序
使用者定義的函數可讓您從資料庫內的 PL/SQL 或 SQL 程式碼呼叫外部可用的函數。您可以使用使用者定義函數來呼叫下列外部函數:
- Oracle Cloud Infrastructure Functions :Oracle Cloud Infrastructure Functions 是完全託管、多租用戶、可高度擴展、隨選、函數即服務平台。Oracle Cloud Infrastructure Functions 建置在企業級 Oracle Cloud Infrastructure 上,並由 Fn Project 開放原始碼引擎提供技術支援。如需詳細資訊,請參閱 OCI Functions 簡介。
- AWS Lambda Functions :AWS Lambda 是無伺服器、事件導向的運算服務,可讓您幾乎執行任何應用程式或後端服務的程式碼,而不需佈建或管理伺服器。如需詳細資訊,請參閱 AWS Lambda 。
- 外部程序:外部程序是以第三代語言 (例如 C) 撰寫的函數,或是可以當作 SQL 函數或 PL/SQL 程序或函數呼叫的作業系統 Shell 命令檔或 Python 命令檔。請參閱何謂外部程序以瞭解詳細資訊。
以 SQL 函數呼叫 OCI 雲端函數
顯示在專用 Exadata 基礎架構上的自治式 AI 資料庫中,呼叫 OCI 雲端函數作為 SQL 函數的步驟。
在您繼續進行這些步驟之前,會假設您已在 OCI 租用戶和區間中建立及部署 OCI 函數。請參閱 OCI 函數瞭解詳細資訊。
一旦您使用 OCI 函數,您將使用 DBMS_CLOUD 和 DBMS_CLOUD_FUNCTION PL/SQL API 在 Autonomous AI Database 中建立 SQL 包裝函式目錄,該目錄會透過 API 端點參考並呼叫其各自的雲端函數。您將使用 DBMS_CLOUD_FUNCTION API 來管理資料庫應用程式的函數。
-
使用 DBMS_CLOUD.CREATE_CREDENTIAL 程序建立證明資料。
提供 OCI 租用戶使用者的 API 私密金鑰 (您在建立 API 金鑰時下載的點對點檔案內容) 作為證明資料物件、金鑰的指紋、租用戶 OCID 以及使用者 OCID。請參閱必要的金鑰和 OCID 。
SET DEFINE OFF BEGIN DBMS_CLOUD.CREATE_CREDENTIAL ( credential_name => 'OCI_CRED', -- provide a string as the name user_ocid => 'user_ocid', -- provide the OCID string for the user, obtained from OCI Console User Profile tenancy_ocid => 'tenancy_ocid', -- provide the OCID string for the tenancy, obtained from OCI Console User Profile private_key => 'private_key', -- provide the content of the dot-pem file that you downloaded when you created the API Key fingerprint => 'fingerprint' -- provide the fingerprint string for the API key ); END; /這會建立 OCI_CRED 證明資料物件。
如需詳細資訊,請參閱 CREATE_CREDENTIAL 程序。
-
使用 DBMS_CLOUD_FUNCTION.CREATE_CATALOG 程序建立 Catalog 物件。
目錄是包裝函式的集合,透過 API 端點參考和呼叫其各自的雲端函數。提供證明資料物件、雲端服務提供者名稱 - 在此情況下為 OCI,以及 OCI 區域 ID (此範例中的 PHX),以及 OCI 函數所在的 OCI 區間 ID。
BEGIN DBMS_CLOUD_FUNCTION.CREATE_CATALOG ( credential_name => 'OCI_CRED', catalog_name => 'OCI_DEMO_CATALOG', service_provider => 'OCI', cloud_params => '{"region_id":"phx", "compartment_id":"compartment_id"}' ); END; /這會建立 OCI_DEMO_CATALOG 目錄物件。
如需詳細資訊,請參閱 CREATE_CATALOG 程序。您可以查詢 DBA_CLOUD_FUNCTION_CATALOG 檢視和 USER_CLOUD_FUNCTION_CATALOG 檢視,以擷取資料庫中所有雲端功能目錄的清單。
-
您可以使用 DBMS_CLOUD_FUNCTION.LIST_FUNCTIONS 程序列出目錄中的所有雲端函數。
SET PAGESIZE 1000 VAR function_list CLOB; BEGIN DBMS_CLOUD_FUNCTION.LIST_FUNCTIONS ( credential_name => 'OCI_CRED', catalog_name => 'OCI_DEMO_CATALOG', function_list => :function_list ); END; / PL/SQL procedure successfully completed. SELECT JSON_QUERY (:function_list, '$' RETURNING VARCHAR2(32676) pretty) AS search_results FROM dual; SEARCH_RESULTS ------------------------------------------------------------------------------------------------ [ { "functionName" : "create_par", "functionId" : "ocid.funfc.oc1.phx.aaaa_example", "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud_example.com" }, { "functionName" : "fintech", "functionId" : "ocid.funfc.oc1.phx.bbbb_example" "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud.com_example" }, { "functionName" : "jwt_codec", "functionId" : "ocid.funfc.oc1.phx.jwt_code_example", "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud_example.com" }, { "functionName" : "oci-objectstorage-create-par-python", "functionId" : "ocid.funfc.oc1.phx.aaaaaaaas_example", "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud_example.com" }, { "functionName" : "run_dbt", "functionId" : "ocid.funfc.oc1.phx.aaaaaaaav_example", "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud_example.com" } ]如需詳細資訊,請參閱 LIST_FUNCTIONS 程序。
-
建立「SQL 包裝函式函數」。您可以使用下列兩種方法其中之一,從目錄建立包裝函式 SQL 函數,以呼叫其各自的雲端函數:
- 您可以使用 DBMS_CLOUD_FUNCTION。SYNC_FUNCTIONS 從目錄物件產生 SQL 包裝程式的程序。
- 您可以使用 DBMS_CLOUD_FUNCTION 手動建立個別包裝函式。CREATE_FUNCTION 程序。
- SYNC_FUNCTIONS :SYNC_FUNCTIONS 會自動將目錄中的包裝函式 (建立和 (或) 更新) 與目錄建立所在區域、區間和租用戶中所定義的雲端函式完整清單同步。
BEGIN DBMS_CLOUD_FUNCTION.SYNC_FUNCTIONS ( catalog_name => 'OCI_DEMO_CATALOG' ); END; /這會建立用於新增函數至目錄的 PL/SQL 包裝程式,以及移除已從目錄刪除之函數的包裝程式。
您可以針對指定的目前使用者,使用下列查詢來驗證同步結果。
SHOW user TEST_USER SELECT object_name FROM sys.all_objects WHERE owner='TEST_USER' AND object_type='FUNCTION'; OBJECT_NAME -------------------------------------------------------------------------------- CREATE_PAR FINTECH JWT_CODEC OCI-OBJECTSTORAGE-CREATE-PAR-PYTHON RUN_DBT如需詳細資訊,請參閱 SYNC_FUNCTIONS 程序。
-
CREATE_FUNCTION :您可以在目錄中手動建立 SQL 函數,使用 DBMS_CLOUD.CREATE_FUNCTION 呼叫其各自的雲端函數。
VAR function_args CLOB; EXEC :function_args := TO_CLOB('{"command": "VARCHAR2", "value": "VARCHAR2"}'); BEGIN DBMS_CLOUD_FUNCTION.CREATE_FUNCTION ( credential_name => 'OCI_CRED', catalog_name => 'OCI_DEMO_CATALOG', function_name => 'FINTECH_FUNCTION', function_id => 'ocid1.fnfunc.oc1.phx.aaabbbcccc_example', input_args => :function_args ); END; /這會在 OCI_DEMO_CATALOG 目錄中建立 FINTECH_FUN 函數,作為 FUNCTION_ID 參數參照其端點之個別雲端函數的參照。呼叫目錄中的函數及其引數會在 OCI 中執行對應的雲端函數,並提供雲端函數所傳回的輸出。
附註:
OCI 函數的名稱可以與 FINTECH_FUNCTION 完全不同。只會考慮您提供作為 function_id 參數輸入之 OCI 函數的 OCID,以建立此參照。 -
CREATE_FUNCTION (含自訂傳回類型和回應處理程式) :手動建立函數可讓您建立自訂傳回類型和回應處理程式,並顯示在下列範例中。
請先建立傳回類型和函數的回應處理程式。
CREATE OR REPLACE TYPE fintech_rt AS OBJECT ( status VARCHAR2(1000), output CLOB ); / Type created. CREATE OR REPLACE FUNCTION fintech_response_handler(function_response IN CLOB) RETURN fintech_rt IS l_comp fintech_rt; l_json_obj JSON_OBJECT_T; status VARCHAR2(1000); output CLOB; BEGIN l_json_obj := JSON_OBJECT_T.parse(function_response); status := l_json_obj.get('STATUS').to_string; output := l_json_obj.get('RESPONSE_BODY').to_string; l_comp := fintech_rt(status,output); RETURN l_comp; END; / Function created.接著,在手動建立「SQL 包裝函式函數」時,使用此類型和回應處理程式。
VAR input_param CLOB; VAR l_return_type VARCHAR2(100); VAR l_response_handler VARCHAR2(1000); -- Define function parameters exec :input_param := TO_CLOB('{"command": "VARCHAR2", "value": "VARCHAR2"}'); PL/SQL procedure successfully completed. exec :l_return_type := 'fintech_rt'; PL/SQL procedure successfully completed. exec :l_response_handler := 'fintech_response_handler'; PL/SQL procedure successfully completed. BEGIN DBMS_CLOUD_FUNCTION.CREATE_FUNCTION ( credential_name => 'OCI_CRED', catalog_name => 'OCI_DEMO_CATALOG', function_name => 'FINTECH_FUNCTION', function_id => 'ocid1.fnfunc.oc1.phx.aaabbbcccc_example', input_args => :input_param, return_type => :l_return_type, response_handler => :l_response_handler ); END; /您可以查詢 DBA_CLOUD_FUNCTION 視觀表和 USER_CLOUD_FUNCTION 視觀表視觀表,以擷取資料庫中所有功能的清單。
如需詳細資訊,請參閱 CREATE_FUNCTION 程序。
建立函數之後,您可以 DESCRIBE 函數來取得其傳回詳細資訊。
DESC fintech_fun COLUMN STATUS format a30 COLUMN OUTPUT format a30接著,您可以呼叫函數,提供輸入參數的值。
SET SERVEROUTPUT ON DECLARE l_comp fintech_rt; BEGIN l_comp := fintech_fun(command=>'tokenize',value => 'PHI_INFORMATION'); DBMS_OUTPUT.put_line ('Status of the function = '|| l_comp.status); DBMS_OUTPUT.put_line ('Response of the function = '|| l_comp.output); END; /這會呼叫
OCI_DEMO_CATALOG目錄中的函數參照oocid1.funfn.oci.phx.aaaaaa_example來呼叫fintech_fun雲端函數。
-
您可以使用 DROP_FUNCTION 程序來刪除現有的函數。
BEGIN DBMS_CLOUD_FUNCTION.DROP_FUNCTION ( catalog_name => 'OCI_DEMO_CATALOG', function_name => 'fintech_fun'); END; /這會刪除
OCI_DEMO_CATALOG目錄中的FINTECH_FUN函數。如需詳細資訊,請參閱 DROP_FUNCTION 程序。
-
您可以使用 DROP_CATALOG 程序來刪除現有的目錄。
BEGIN DBMS_CLOUD_FUNCTION.DROP_CATALOG ( catalog_name => 'OCI_DEMO_CATALOG' ); END; /這會從您的資料庫刪除
OCI_DEMO_CATALOG。如需詳細資訊,請參閱 DROP_CATALOG 程序。
呼叫 AWS Lambda 函數作為 SQL 函數
顯示在專用 Exadata 基礎架構上的自治式 AI 資料庫中,呼叫 AWS 遠端函數作為 SQL 函數的步驟。
在您繼續進行這些步驟之前,會假設您已在 AWS 租用戶中建立並部署 AWS Lambda 函數。請參閱 AWS Lambda 瞭解詳細資訊。
若要存取 AWS lambda 功能,您需要在 Oracle Cloud Infrastructure 中設定必要的原則。請參閱建立存取 AWS Lambda 資源的 IAM 原則和使用 Lambda 的資源型原則以瞭解詳細資訊。
工作 AWS Lambda 函數之後,您將使用 DBMS_CLOUD 和 DBMS_CLOUD_FUNCTION PL/SQL API 在 Autonomous AI Database 中建立 SQL 包裝函式目錄,該目錄會透過 API 端點參照並呼叫其各自的雲端函數。您將使用 DBMS_CLOUD_FUNCTION API 來管理資料庫應用程式的函數。
- 使用 DBMS_CLOUD.CREATE_CREDENTIAL 程序以 AWS 加密密碼金鑰作為證明資料物件來建立證明資料。
SET DEFINE OFF BEGIN DBMS_CLOUD.CREATE_CREDENTIAL ( credential_name => 'AWS_CRED', username => 'access_key_ID', -- ID of Secret Key password => 'secret_access_key' -- Secret Key password ); END; /這會建立
AWS_CRED證明資料物件。如需詳細資訊,請參閱 CREATE_CREDENTIAL 程序。
-
使用 DBMS_CLOUD_FUNCTION.CREATE_CATALOG 程序建立 Catalog 物件。
目錄是包裝函式的集合,透過 API 端點參考和呼叫其各自的雲端函數。提供證明資料物件、雲端服務提供者名稱 - 在此情況下為 AWS,以及 AWS Lambda 函數所在的 AWS 區域 ID (本範例中的
ap-northeast-1)。BEGIN DBMS_CLOUD_FUNCTION.CREATE_CATALOG ( credential_name => 'AWS_CRED', catalog_name => 'AWS_DEMO_CATALOG', service_provider => 'AWS', cloud_params => '{"region_id":"ap-northeast-1"}' ); END; /這會建立
AWS_DEMO_CATALOG目錄物件。如需詳細資訊,請參閱 CREATE_CATALOG 程序。您可以查詢 DBA_CLOUD_FUNCTION_CATALOG 檢視和 USER_CLOUD_FUNCTION_CATALOG 檢視,以擷取資料庫中所有目錄的清單。
其餘步驟 / 作業 (即 LIST_FUNCTIONS 程序、SYNC_FUNCTIONS 程序、CREATE_FUNCTION 程序、DROP_FUNCTION 程序及 DROP_CATALOG 程序) 的使用方式與 OCI 雲端函數的說明相同。請參閱呼叫 OCI 雲端函數作為 SQL 函數。
外部程序總覽
提供外部程序的簡介,以及它們在專用基礎架構應用程式上的自治式 AI 資料庫中使用。
外部程序是以第三代語言撰寫的函數,並以 SQL 函數或 PL/SQL 程序或函數呼叫。SQL 和 PL/SQL 最適合在資料庫中進行快速且有效率的資料和交易處理。外部程序可以透過在專用、外部 VM 中執行需要大量運算和記憶體的作業,以及將結果傳回資料庫,來補充 SQL 和 PL/SQL。典型的這類作業範例包括科學與工程問題,其運算程式庫存在於 Linux 作業系統中 (且無法輕易地移植到資料平台)、離線資料分析、即時裝置與程序控制等等。
您可以使用使用者定義的函數,在 Autonomous AI Database 中呼叫及使用外部程序。您不需要在資料庫內執行這些程序,而是將可執行程式碼放置在專用的自訂 OCI Linux VM 中,該 VM 佈建了容器和程式實際執行來執行 C 程式、Shell 命令檔和 Python 命令檔,以及 Oracle SQL*Net 程式庫,以便從資料庫啟用遠端 SQL 執行。
附註:
外部程序的遠端主機必須是從 OCI 市集佈建的 OCI Linux EXTPROC VM,並且在適當的 OCI 虛擬雲端網路 (VCN) 中設定。請參閱 OCI 中的外部程序和命令檔系統組態以瞭解詳細資訊。
OCI Linux EXTPROC VM 上的遠端執行僅支援 Oracle Public Cloud 上的 Autonomous AI Database on Dedicated Exadata Infrastructure (從版本 19.30 開始) 和 Oracle Database 26ai (從版本 23.26.1 開始)。Exadata Cloud@Customer (ExaCC) 上的 Autonomous AI Database on Dedicated Exadata Infrastructure 資料庫尚不支援此功能。
外部程序和程序檔的系統組態
顯示佈建 EXTPROC VM 的步驟,以及設定 OCI 網路和運算以執行外部程序的步驟。
最少,架構由下列資源組成:
- OCI 虛擬雲端網路佈建於 OCI 租用戶的 OCI 區間中。
- 自治式 AI 資料庫是在自治式容器資料庫 (ACD) 下建立,此資料庫是從在 Oracle Public Cloud 上的 Exadata 基礎架構上建立的自治式 Exadata VM 叢集 (AVMC) 佈建的執行處理。
- 作為 OCI 市集 EXTPROC 堆疊一部分佈建的 EXTPROC VM。
最佳做法是,AVM 叢集將會放置在 VCN 的專用子網路中。預設路由表和 VCN 的安全清單將根據 OCI 租用戶中的自治式 AI 資料庫需求進行設定。VCN 可能有一個「預設路由」表格和一個「預設安全清單」,您可以在其中定義所有路由和安全規則。如果 Autonomous AI Database 應用程式和專用子網路中的其他資源需要網際網路的傳出存取權,則可以選擇性地將 VCN 設定為 NAT 閘道。
將 ExtProc VM 引入此拓樸時,請遵循這些最基本的 OCI 網路組態步驟。
- 您必須能夠登入您的 ExtProc VM,以便使用 C/C++ 中實行的外部程序來建置共用磁帶櫃 (點對點),以及檢查與設定 VM 和容器,然後執行其他此類作業。
- 一般做法是將 EXTPROC VM 設定為位於 VCN 的公用子網路中。在此情況下,您必須在 VCN 中建立網際網路閘道 (如果尚未由管理員設定)。
附註:
EXTPROC VM 不得位於 CIDR 範圍為 10.x.x.x 的子網路中。如果 EXPROC VM 的 IP 位址是 10.x.x,它將無法與 Autonomous AI Database 通訊。
- 您必須在 VCN 的安全清單中定義傳入規則,以允許透過連接埠 22 使用 SSH 登入 VM。此外,您還必須在 VCN 的安全清單中定義傳出規則,以允許 ADBD 存取目標連接埠 16000 為特定連接埠或所有目的地連接埠。請參閱 OCI 網路存取與安全性。
- 在佈建 EXTPROC VM 堆疊的過程中,您將提供 AVMC 的所有從屬端 IP 位址。您將從 AVM 叢集的 OCI 儀表板取得這些 IPv4 從屬端 IP 位址。
- 接著,啟動設定工具會自動建立一個名為 nsg_acl 的網路安全群組 (NSG)。此 NSG 會有傳入規則,允許 Autonomous Database Dedicated Client IP 位址作為唯一可以存取 Port 16000 目的地的來源。
運用外部程序導入使用者定義的函數
-
從 OCI MarketPlace 佈建及設定 EXTPROC VM
- 請至 http://cloud.oracle.com 登入 OCI 主控台。請參閱登入 Oracle Cloud Infrastructure 主控台以瞭解詳細資訊。
- 從 Oracle Cloud Infrastructure 左側導覽功能表中,下拉至市集,然後在 Marketplace 下按一下所有應用程式。
- 在搜尋列中輸入 "EXTPROC",然後按一下「搜尋」。您會看到兩個小工具 - 一個標籤為「堆疊」,另一個標籤為「影像」。
- 選擇名為 Stack 的小工具 (這很重要)。這會將您帶到 Oracle Autonomous Database EXTPROC Agent 詳細資訊頁面,其中提供有關堆疊的堆疊版本、發行日期和版本注意事項。在此頁面上,按一下投放堆疊按鈕。這會將您帶到下一個「啟動堆疊」頁面。
-
在「啟動堆疊」頁面上:
- 從版本下拉式清單中,選擇堆疊的套裝程式版本。
- 從區間下拉式清單中,選取您要佈建 EXTPROC VM 的區間名稱。除非您有特定原因,否則請選擇與 ADBD 相同的區間 (最佳做法是避免任何資源的根區間)。複查外部程序和命令檔的系統組態,為區間做出適當的選擇。
- 接受條款及條件,然後按一下啟動堆疊。
這會將您帶到下一頁 -「建立堆疊」精靈。
- 在此頁面中,提供名稱、說明、區間名稱、Terraform 版本以及任何標記資訊。此頁面中的區間名稱是必要的,最重要的是輸入精靈。按下一步。
- 這會將您帶到 EXTPROC VM (也稱為 EXTPROC 代理程式) 的組態變數頁面。此頁面的第一個部分會收集 EXTPROC 程式庫和公事包密碼的資訊。
- 若為外部程式庫,請提供要允許從專用基礎架構上的自治式 AI 資料庫呼叫的程式庫清單 (使用逗號 (,) 區隔)。這些共用程式庫將包含以 C/C++ 撰寫的外部程序,這些程序在 VM 本身最好編譯和建置 (以符合架構和環境)。
附註:
由於您仍在建立 EXTPROC VM,請記下您在此處提供的共用程式庫名稱。當 VM 可使用時,您必須記得在 C/C++ 中開發外部程序,才能編譯和建置具有上述完整名稱的磁帶櫃 / 磁帶櫃。 - 針對公事包密碼,提供將在 ExtProc VM 中建立之公事包檔案的密碼。針對專用基礎架構上的自治式 AI 資料庫與 EXTPROC 代理程式 VM 之間的相互 TLS 認證,會產生公事包和自行簽署憑證。
- 若為外部程式庫,請提供要允許從專用基礎架構上的自治式 AI 資料庫呼叫的程式庫清單 (使用逗號 (,) 區隔)。這些共用程式庫將包含以 C/C++ 撰寫的外部程序,這些程序在 VM 本身最好編譯和建置 (以符合架構和環境)。
- 組態變數頁面的第二部分涉及 EXTPROC VM 的網路組態。
- 對於區間,請從下拉式功能表中選擇 VCN 的區間名稱。在上述範例中,它會顯示為 adbd。理想情況下,自治式 AI 資料庫和 EXTPROC VM 將共置於相同的 VCN 中,即使位於不同的 (專用和公用) 子網路也一樣。
- 在網路策略中,選擇使用現有的 VCN 和子網路。如上一節所述,在您 ExtProc 開發工作的這個階段,您可能會有 VCN、AVMC 和 Autonomous AI Database 的系統架構。
附註:
另一個選擇是針對 EXTPROC VM 代理程式,使用自己的組態策略建立新的 VCN 和子網路。如外部程序和命令檔的系統組態所述,如果您選擇將 EXTPROC VM 放置在與自治式 AI 資料庫不同的 VCN 中,則必須對等 VCN。 - 略過 EXTPROC 代理程式存取類型的下一個項目。此欄位不適用於專用 Exadata 基礎架構上的自治式 AI 資料庫。
- 接著,在標示為「專用端點 IP 位址」的欄位中,輸入設定資料庫之 AVMC 的所有從屬端 IP 位址。您可以從 AVMC 的 OCI 主控台儀表板取得這些從屬端 IP 位址。
- 若為虛擬雲端網路,請提供您要在其中建立 EXTPROC VM 代理程式的 VCN 名稱。請複查外部程序和命令檔的系統組態,為 VCN 提供適當的選擇。
- 針對 EXTPROC 子網路,提供您要在其中建立 EXTPROC VM 代理程式的子網路名稱。請檢閱外部程序和程序檔的系統組態,以便為子網路做出適當的選擇。
- 接下來,提供 VCN 和子網路的詳細資訊。
附註:
EXTPROC VM 不得位於 CIDR 範圍為 10.x.x.x 的子網路中。如果 EXPROC VM 的 IP 位址是 10.x.x,它將無法與 Autonomous AI Database 通訊。 - 組態頁面的最後一個部分包含 EXTPROC VM 代理程式的運算組態。
- 若為區間,請從下拉式功能表中選擇區間名稱。建議您將 VM 共置於與專用基礎架構上的自治式 AI 資料庫、VCN 和子網路相同的區間中,以將疑難排解降到最低。
- 對於資源配置、 OCPU 數目和記憶體大小 (GB) ,請根據外部程序的工作負載特性輸入值。
- 若為新增 SSH 金鑰,請在您的 Linux 作業系統、MacOS 或 Windows 系統中產生 SSH 公用金鑰和私密金鑰檔案。開啟終端機視窗,然後執行下列其中一個指令 (ED25519 是現代化的安全演算法;舊版系統支援 RSA 加密演算法):
ssh-keygen -t ed25519 -C "your_email@example.com" (OR) ssh-keygen -t rsa -b 4096 -C "your_email@example.com"這會產生私密金鑰檔案 ssh-key-<date-time-id>.key 和公開金鑰檔案 ssh-key-<date-time-id>。key.pub。將 SSH 公開金鑰的內容複製至視窗中,或將 .pub 檔案拖放至視窗中。
- 按一下下一步。
-
這會將您帶到「複查頁面」。複查所有輸入,然後選取執行套用核取方塊,再按一下建立。
這會啟動 OCI 資源管理程式以建立 EXTPROC VM 堆疊。ORM 工作順利完成之後,就會建立並執行 EXTPROC VM。
- 收集 DBMS_CLOUD_FUNCTION API 輸入的 EXTPROC VM 系統資訊
您必須提供 EXTPROC VM 系統資訊作為 Autonomous AI Database 中 DBMS_CLOUD_FUNCTION API 的輸入值,才能從資料庫呼叫外部程序。
- 從 Oracle Cloud Infrastructure 左側導覽功能表的下拉式功能表中,選擇您為 EXTPROC VM 佈建指定的區間,然後複查列出區間中所有 VM 的儀表板。ORM 工作將會建立具有正規名稱 EXTPROC-agent 或 EXTPROC-agent-<setofnumbers> 的 EXTPROC VM。這是您 EXTPROC VM 執行處理的主機名稱。按一下此項目即可移至顯示系統詳細資訊的頁面 - IPV4 公用位址和專用位址 (IPv4 和 IPv6)、子網路以及影像詳細資訊。
- 使用您在建立 ExtProc 堆疊時提供的 SSH 金鑰和 IP 位址登入 ExtProc VM。VM 上的預設使用者是 opc. sudo 將成為使用者 oracle。
➜ ~ ssh -i ssh-key-<date-time-id>.key opc@<Public-IP-Address> Wed Nov 19 10:46:25 GMT 2025: EXTPROC Agent intialization completed. Activate the web console with: systemctl enable --now cockpit.socket Last login: Thu Nov 20 20:10:54 2025 from <client-IP-address> [opc@extproc-agent-170798 ~]$ whoami opc [opc@extproc-agent-170798 ~]$ sudo su - oracle Last login: Wed Nov 19 19:07:24 GMT 2025 on pts/0EXTPROC VM 會有執行中的 Podman 容器與 Oracle SQL*Net 監聽器。在容器內,將會提供包含必要組態檔 (例如 sqlnet.ora、listener.ora) 的 Oracle 從屬端環境,以及公事包檔案,以便與 Autonomous AI Database 進行安全通訊。
- 從 VM 中設定的 Podman 容器,在作業系統層次收集 PL/SQL API 所需的系統資訊,接下來收集。容器會執行 Oracle Listener,以接收來自 Autonomous AI Database 上 SQL 和 PL/SQL 應用程式的遠端執行要求,也是外部程序的執行時期執行引擎。
- 從 Linux 作業系統,EXTPROC VM 主機的 FQDN (完整網域名稱)。
- 從 Podman 容器,從監聽器狀態,資料庫連線到 VM 之 EXTPROC VM 上的連接埠。
- 從 Podman 容器的 sqlnet.ora 規格中,公事包檔案的位置。
- 從使用 orapki 工具檢查公事包檔案,公事包憑證的「辨別名稱 (DN)」參數值。
[oracle@extproc-agent-170798 ~]$ hostname -f extproc-agent-170798.subnet-name.vcn-name.oraclevcn.com [oracle@extproc-agent-170798 ~]$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 86d81c4df6ff ghcr.io/oracle/adb-extproc:latest 23 hours ago Up 23 hours (healthy) adb-extproc [oracle@extproc-agent-170798 ~]$ podman exec -it 86d81c4df6ff bash (base) [oracle@extproc-agent-170798 admin]$ lsnrctl status LSNRCTL for Linux: Version 23.26.0.0.0 - for Oracle Cloud and Engineered Systems on 20-NOV-2025 09:25:54 Copyright (c) 1991, 2025, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 23.26.0.0.0 - for Oracle Cloud and Engineered Systems Start Date 19-NOV-2025 17:19:58 Uptime 0 days 16 hr. 5 min. 55 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/23.0.0.0/client_1/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/extproc-agent-170798/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=0.0.0.0)(PORT=16000))) Services Summary... Service "extproccontainer.com" has 1 instance(s). Instance "extproccontainer", status UNKNOWN, has 1 handler(s) for this service... The command completed successfully (base) [oracle@extproc-agent-170798 /]$ cd $ORACLE_HOME/network/admin (base) [oracle@extproc-agent-170798 admin]$ cat sqlnet.ora NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) WALLET_LOCATION =(SOURCE = (METHOD = FILE)(METHOD_DATA = (DIRECTORY = /u01/app/oracle/wallets/extproc_wallet))) tcp.invited_nodes=(20.63.19.141,20.63.19.141,20.63.19.143,20.63.19.144) tcp.validnode_checking=yes (base) [oracle@extproc-agent-170798 admin]$ orapki wallet display -wallet /u01/app/oracle/wallets/extproc_wallet/cwallet.sso Oracle PKI Tool Release 23.0.0.0.0 - Production Version 23.0.0.0.0 Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved. Requested Certificates: User Certificates: Subject: CN=extproc-agent-170798 Trusted Certificates: Subject: CN=extproc-agent-170798 (base) [oracle@extproc-agent-170798 admin]$ exit exit在上述範例中,我們收集了 DBMS_CLOUD_FUNCTION.CREATE_CATALOG API 的下列輸入。- 由 FQDN + 連接埠號碼形成的字串將會是
library_listener_url參數的輸入。在此範例中,它是 'extproc-agent-170798.subnet-name.vcn-name.oraclevcn.com:16000'。 - sqlnet.ora 包含 VM 中公事包檔案的位置:/u01/app/oracle/wallets/extproc_wallet/cwallet.sso。請注意
tcp.invited_nodes的 IP 位址清單。其中必須包含您在建立 EXTPROC VM 堆疊時,提供作為網路組態輸入的從屬端 IP 位址清單。 - 「憑證辨別名稱 (DN)」將是
library_ssl_server_cert_dn參數的輸入 : 」CN=extproc-agent-170798」。
- 建立 C 函式庫並將它放置在 EXTPROC VM 檔案系統的指定位置
編寫 C 函數的程式碼、建立函數,然後將程式庫置於 ExtProc 代理程式 VM 檔案系統的指定目錄中。
程式庫的名稱必須完全符合您在建立 ExtProc 堆疊時所提供的名稱。如果錯置它,您可以在 ExtProc 容器 initextproccontainer.ora 檔案的 EXTPROC_DLLS 項目中找到它,如下所示,或在建立 ExtProc 堆疊之 ORM (Oracle 資源管理程式) 工作的「變數」段落中找到它。您必須將程式庫複製到 EXTPROC 代理程式 VM 上的/u01/app/oracle/extproc_libs目錄。- 完整檔案路徑名稱 (在此範例中為 "/u01/app/oracle/extproc_libs/helloCextproc.so ") 將會是 DBMS_CLOUD_FUNCTION.CREATE_CATALOG() 參數 library_remote_path 的輸入。
(base) [oracle@extproc-agent-170798 client_1]$ cat $ORACLE_HOME/hs/admin/initextproccontainer.ora SET TRACE_LEVEL=ON SET _EXTPROC_REMOTE=TRUE SET WHOAMI=FROMDOCKER SET LD_LIBRARY_PATH=/u01/app/oracle/product/23.0.0.0/client_1/lib:/u01/app/oracle/extproc_libs:/opt/conda/lib SET EXTPROC_DLLS=ONLY:/u01/app/oracle/product/extprocutils.so:/u01/app/oracle/product/23.0.0.0/client_1/lib/libgsfextproc.so:/u01/app/oracle/extproc_libs/helloCextproc.so SET PYTHONHOME=/opt/conda SET SCRIPTS_FOLDER_LOC_ENV=/u01/app/oracle/extproc_scripts SET TRACE_FILE_LOC_ENV=/u01/app/oracle/extproc_logs SET PYTHONPATH=/tmp:/u01/app/oracle/extproc_scripts (base) [oracle@extproc-agent-170798 client_1]$ exit [oracle@extproc-agent-170798 ~]$ cat > helloCextproc.c #include <stdio.h> const char* helloCextproc() { return ("\nHello C Extproc from FQDN: extproc-agent-170798.subnet-name.vcn-name.oraclevcn.com\n"); } ^D [oracle@extproc-agent-170798 ~]$ gcc -shared -fPIC -o /u01/app/oracle/extproc_libs/helloCextproc.so helloCextproc.c [oracle@extproc-agent-170798 ~]$ ls -al /u01/app/oracle/extproc_libs/ total 8 drwxr-xr-x. 2 oracle oinstall 30 Nov 19 11:14 . drwxr-xr-x. 6 root root 91 Nov 14 02:19 .. -rwxr-xr-x. 1 oracle oinstall 8184 Nov 19 11:14 helloCextproc.so [oracle@extproc-agent-170798 ~]$這會完成在資料庫應用程式中建立 Catalog/Library 物件所需的所有參數輸入。
- 將公事包檔案從 ExtProc VM 上傳至 OCI 物件儲存
在建立 EXTPROC 代理程式應用程式時,會建立自行簽署的公事包。此公事包可讓您存取
Extproc代理程式執行處理。若要在 EXTPROC 代理程式執行處理執行遠端程序, Autonomous AI Database 和 EXTPROC 代理程式會使用「相互傳輸層安全 (MTLS)」進行連線。使用「相互傳輸層安全 (mTLS)」時,從屬端會使用標準 TLS 1.2 與信任的從屬端憑證授權機構 (CA) 憑證,透過 TCPS (安全 TCP) 資料庫連線進行連線。附註:
您也可以取得和使用憑證授權機構 (CA) 所發行的公用憑證。您必須先從執行 EXTPROC 之 VM 上的
/u01/app/oracle/extproc_wallet目錄,將公事包匯出至 OCI Object Storage。附註:
- 保護公事包檔案。公事包檔案以及資料庫使用者 ID 和密碼,可讓您存取 EXTPROC 代理程式執行處理。將公事包檔案存放在安全的位置,並且僅與授權的使用者共用。
- 請勿重新命名公事包檔案。物件儲存中的公事包檔案必須命名為
cwallet.sso。
- 建立目錄、定義 SQL 函數以及將外部程序呼叫為 SQL 函數
從先前的步驟中,我們擁有 DBMS_CLOUD_FUNCTION API 執行 SQL 或 PL/SQL 資料庫應用程式之遠端程序所需的所有輸入。
接著,將包含 EXTPROC 代理程式執行處理憑證的公事包
cwallet.sso,從物件儲存匯入至您 Autonomous AI Database 中的 DIRECTORY。建立證明資料以存取您儲存公事包檔案 cwallet.sso 的物件儲存。如需有關不同物件儲存服務之使用者名稱和密碼參數的資訊,請參閱 CREATE_CREDENTIAL 程序。
在資料庫中建立 DIRECTORY 物件,然後使用 DBMS_CLOUD.GET_OBJECT API 將公事包下載至目錄。
SQL> SET DEFINE OFF SQL> BEGIN DBMS_CLOUD.CREATE_CREDENTIAL ( credential_name => 'OCI_CREDENTIAL', user_ocid => '<oci_user_ocid>', tenancy_ocid => '<oci_tenancy_ocid>', private_key => '<API-key-dot-pem-file-contents>', fingerprint => '<fingerprint-created-with-API-key>'); END; / SQL> CREATE DIRECTORY extprocwalletdir AS 'extprocwalletdir'; Directory created. SQL> SELECT directory_name, directory_path FROM dba_directories WHERE directory_name LIKE '%EXTPROC%'; DIRECTORY_NAME DIRECTORY_PATH ---------------- ------------------------------------------------------------------------- EXTPROCWALLETDIR /u02/data/dbfs/<adbd-name>/42E945D608E16DF9E0630301000AF88D/extprocwalletdir SQL> BEGIN DBMS_CLOUD.GET_OBJECT ( credential_name => 'OCI_CREDENTIAL', object_uri => 'https://objectstorage.us-ashburn-1.oraclecloud.com/p/aN.../n/zr.../b/bucket-name-20260129/o/cwallet.sso', directory_name => 'EXTPROCWALLETDIR' ); END; /接著,在資料庫中建立代表 ExtProc 中「C 程式庫」的「程式庫物件」,其中包含您在上一個步驟中收集的輸入參數。
SQL> BEGIN DBMS_CLOUD_FUNCTION.CREATE_CATALOG ( library_name => 'EXTPROC_LIBRARY', library_listener_url => 'extproc-agent-170798.subnet-name.vcn-name.oraclevcn.com:16000', library_wallet_dir_name => 'EXTPROCWALLETDIR', library_ssl_server_cert_dn => 'CN=extproc-agent-170798', library_remote_path => '/u01/app/oracle/extproc_libs/helloCextproc.so' ); END; / PL/SQL procedure successfully completed. SQL> SELECT catalog_name from DBA_CLOUD_FUNCTION_CATALOG WHERE catalog_name LIKE '%EXTPROC%'; CATALOG_NAME --------------- EXTPROC_LIBRARY建立對應至 ExtProc C 函數的 SQL 函數。從上述撰寫的程式中,查看 C 函式的名稱。
SQL> CREATE OR REPLACE FUNCTION HELLOCEXTPROC RETURN VARCHAR2 AS LANGUAGE C LIBRARY EXTPROC_LIBRARY NAME "helloCextproc"; / Function created. SQL>呼叫 SQL 函數。它是成功的執行 (請參閱上述 C 常式的 C 函式主體)。
SQL> SELECT HELLOCEXTPROC() FROM dual; HELLOCEXTPROC() ---------------------------------------------------------------------------------- Hello C Extproc from FQDN: extproc-agent-170798.subnet-name.vcn-name.oraclevcn.com
For information about Oracle's commitment to accessibility, visit the Oracle Accessibility Program website at http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc.
取得 Oracle 支援
Oracle 客戶對於 Oracle 支援服務的取得及使用,應以其 Oracle 訂單中針對適用服務所指定的條款與條件為依據。