DBMS_CLOUD_FUNCTION 程序包
通过 DBMS_CLOUD_FUNCTION 程序包,您可以在自治 AI 数据库中调用 OCI 和 AWS Lambda 远程函数作为 SQL 函数。
注意:
Oracle Database 19c(从版本 19.29 开始)和 Oracle AI Database 26ai(从版本 23.26 开始)提供了对DBMS_CLOUD_FUNCTION 的支持。
DBMS_CLOUD_FUNCTION 次级方案摘要
DBMS_CLOUD_FUNCTION 程序包中包含的子程序。
表 - DBMS_CLOUD_FUNCTION 子程序
| 子程序 | 描述 |
|---|---|
| CREATE_CATALOG 过程 | 此过程将创建目录。 |
| CREATE_FUNCTION 过程 | 此过程在目录中创建函数。 |
| DROP_CATALOG 过程 | 此过程将删除使用目录创建的目录和函数。 |
| DROP_FUNCTION 过程 | 此过程从目录中删除函数。 |
| LIST_FUNCTIONS 过程 | 此过程列出目录中的所有函数。 |
| SYNC_FUNCTIONS 过程 | 通过此过程,可以将新函数添加到目录并删除已从目录中删除的函数。 |
CREATE_CATALOG 过程
DBMS_CLOUD_FUNCTION.CREATE_CATALOG 过程在数据库中创建一个目录。目录是一组函数,用于创建执行子例程所需的基础结构。此过程已重载。
语法
DBMS_CLOUD_FUNCTION.CREATE_CATALOG (
credential_name IN VARCHAR2,
catalog_name IN VARCHAR2,
service_provider IN VARCHAR2,
cloud_params IN CLOB
);
参数
| Parameter (参数) | 说明 |
|---|---|
|
|
指定用于验证的身份证明的名称。 此参数是必需的。 |
|
|
指定服务提供方的类型。 此参数可以将 此参数是必需的。 |
|
|
指定目录名称。 此参数是必需的。 |
|
|
为函数提供参数。例如,区间 OCID 和区域。 此参数是必需的。 |
示例
BEGIN
DBMS_CLOUD_FUNCTION.CREATE_CATALOG (
credential_name => 'OCI_CREDENTIAL',
catalog_name => 'OCI_DEMO_CATALOG',
service_provider => 'OCI',
cloud_params => '{"region_id":"us-phoenix-1", "compartment_id":"compartment_id"}'
);
END;
/
BEGIN
DBMS_CLOUD_FUNCTION.CREATE_CATALOG (
credential_name => 'AWS_CREDENTIAL',
catalog_name => 'AWS_DEMO_CATALOG',
service_provider => 'AWS',
cloud_params => '{"region_id":"us-phoenix-1"}'
);
END;
/必须使用重载过程创建具有外部过程的库。此过程不需要身份证明对象。这些参数需要 EXTPROC VM 和包含外部过程的共享库的规范。请参见 External Procedures Overview 。
语法
DBMS_CLOUD_FUNCTION.CREATE_CATALOG (
library_name IN VARCHAR2,
library_listener_url IN VARCHAR2,
library_wallet_dir_name IN VARCHAR2,
library_ssl_server_cert_dn IN VARCHAR2,
library_remote_path IN VARCHAR2
);参数
| Parameter (参数) | 说明 |
|---|---|
|
|
指定为数据库中的目录/库提供的名称。 此参数是必需的。 |
|
|
指定承载共享库的 EXTPROC VM 的 FQDN(全限定域名),该共享库包含以第三代语言(如 C/C++)编写的外部过程,以及 EXTPROC VM 容器中运行的 SQL*Net 侦听器接受连接请求的端口号。 该参数以
此参数是必需的。 |
|
|
指定已将自签名 wallet 导入并存储的数据库中的 DIRECTORY 的名称。 |
|
|
指定从 wallet 获取的服务器证书标识名 (Distinguished Name,DN)。例如:
此参数是必需的。 |
|
|
指定 EXTPROC VM 中存储包含外部过程的库的目录的完整路径名。例如:
此参数是必需的。 |
示例
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;
/错误数
| 错误代码 | 说明 |
|---|---|
|
|
在以下情况下会引发此错误:
|
|
|
在以下情况下会引发此错误:
|
|
|
在以下情况下会引发此错误:
|
|
|
当服务提供商不存在时,将引发此错误。 |
用法附注
-
要创建目录,您必须以
ADMIN用户身份登录或具有以下权限:-
DBMS_CLOUD_OCI_FNC_FUNCTIONS_INVOKE -
DBMS_CLOUD_OCI_FNC_FUNCTIONS_INVOKE_INVOKE_FUNCTION_RESPONSE_T -
DBMS_CLOUD -
对
USER_CLOUD_FUNCTION的读取权限 -
对
USER_CLOUD_FUNCTION_CATALOG的读取权限
-
CREATE_FUNCTION 过程
可以手动创建在目录中调用其对应云功能的 SQL 函数。虽然 SYNC_FUNCTIONS 会自动检索和创建目录中所有云函数的包装,但 CREATE_FUNCTION 允许您创建具有定制返回类型和响应处理程序的函数。CREATE_FUNCTION 过程仅适用于云函数。
语法
仅云功能支持 DBMS_CLOUD_FUNCTION.CREATE_FUNCTION 过程。
DBMS_CLOUD_FUNCTION.CREATE_FUNCTION (
credential_name IN VARCHAR2,
catalog_name IN VARCHAR2,
function_name IN VARCHAR2,
function_id IN VARCHAR2,
input_args IN CLOB DEFAULT NULL,
return_type IN VARCHAR2 DEFAULT 'CLOB',
response_handler IN VARCHAR2 DEFAULT NULL
);
必须按以下格式定义 response_handler:
<USER DEFINED TYPE> response_handler_name(function_response in CLOB)RETURNS CLOB;response_handler 的返回值为 <User Defined Type>,response_json 是包含两个字段的 JSON 文档,格式如下:
'{
"status":"<response status>",
"response_body":"<response from the function>"
}'
参数
| Parameter (参数) | 说明 |
|---|---|
|
|
指定用于验证的身份证明的名称。 此参数是必需的。 |
|
|
指定目录名称。 此参数是必需的。 |
|
|
指定 PL/SQL 函数名。 此参数是必需的。 |
|
|
此参数是必需的。 |
|
|
指定接受输入参数及其类型的键值 JSON 对。 |
|
|
定义函数的返回类型。 返回类型为 |
|
|
指定用户定义的回调以处理响应。 |
错误数
| 错误代码 | 说明 |
|---|---|
|
|
当 |
|
|
如果指定的目录不存在,则会引发此错误。 |
|
|
当指定的函数已存在时,将引发此错误。 |
|
|
当函数 ID 或函数 Amazon 资源名称 (ARN) 不存在时,会引发此错误。 |
|
|
当输入参数无效时会引发此错误。 |
|
|
如果返回类型缺失或无效,则会引发此错误。 |
|
|
当响应处理程序缺失或无效时,将引发此错误。 |
范例
仅输入函数参数的简单情况:
VAR function_args CLOB;
EXEC :function_args := TO_CLOB('{"command": "VARCHAR2", "value": "VARCHAR2"}');
BEGIN
DBMS_CLOUD_FUNCTION.CREATE_FUNCTION (
credential_name => 'DEFAULT_CREDENTIAL',
catalog_name => 'OCI_DEMO_CATALOG',
function_name => 'demo_function',
function_id => 'ocid1.fnfunc.oc1.phx.aaaaaaaazkrbjv6ntowwxlbbp5ct4otsj4o2hdw4ayosyosv4sthmya2lyza',
input_args => :function_args);
);
END;
/
返回类型和响应处理程序的示例:
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;
/接下来,在手动创建 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;
/创建函数后,可以对函数执行 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 云函数。
使用说明
对于调用外部过程,可以使用与用户定义的函数相同的语法。例如,如果已在数据库中使用外部过程的 CREATE_CATALOG 过程创建了一个名为 EXTPROC_LIBRARY 的库,则可以定义一个 SQL 函数,如本示例中所示,然后从 SQL 语句调用该函数。
SQL> CREATE OR REPLACE FUNCTION HELLOCEXTPROC RETURN VARCHAR2 AS
LANGUAGE C
LIBRARY EXTPROC_LIBRARY
NAME "helloCextproc";
/
Function created.
SQL> SELECT HELLOCEXTPROC() FROM dual;
HELLOCEXTPROC()
----------------------------------------------------------------------------------
Hello C Extproc from FQDN: extproc-agent-170798.subnet-name.vcn-name.oraclevcn.comDROP_CATALOG 过程
DBMS_CLOUD_FUNCTION.DROP_CATALOG 过程删除使用目录创建的目录和函数。
语法
DBMS_CLOUD_FUNCTION.DROP_CATALOG (
catalog_name IN VARCHAR2
);
参数
| Parameter (参数) | 说明 |
|---|---|
|
|
指定目录名称。 此参数是必需的。 |
错误数
| 错误代码 | 说明 |
|---|---|
|
|
如果指定的目录不存在,则会引发此错误。 |
示例:
BEGIN
DBMS_CLOUD_FUNCTION.DROP_CATALOG (
catalog_name => 'OCI_DEMO_CATALOG'
);
END;
/
DROP_FUNCTION 过程
DBMS_CLOUD_FUNCTION.DROP_FUNCTION 过程将删除该函数。
语法
仅云功能支持 DBMS_CLOUD_FUNCTION.DROP_FUNCTION 过程。
DBMS_CLOUD_FUNCTION.DROP_FUNCTION (
catalog_name IN VARCHAR2,
function_name IN VARCHAR2
);
参数
| Parameter (参数) | 说明 |
|---|---|
|
|
指定目录名称。 此参数是必需的。 |
|
|
指定要删除的函数的名称。 此参数是必需的。 |
错误数
| 错误代码 | 说明 |
|---|---|
|
|
当指定的函数不存在时会引发此错误。 |
示例
BEGIN
DBMS_CLOUD_FUNCTION.DROP_FUNCTION (
catalog_name => 'OCI_DEMO_CATALOG',
function_name => 'demo_function');
END;
/
LIST_FUNCTIONS 过程
此过程列出目录中的所有函数。
注意:
LIST_FUNCTIONS 过程仅适用于云函数。
语法
DBMS_CLOUD_FUNCTION.LIST_FUNCTIONS (
credential_name IN VARCHAR2,
catalog_name IN VARCHAR2,
function_list OUT VARCHAR2
);
参数
| Parameter (参数) | 说明 |
|---|---|
|
|
指定用于验证的身份证明的名称。 此参数是必需的。 |
|
|
返回 JSON 格式的函数列表。 此参数是必需的。 |
|
|
指定目录名称。 此参数是必需的。 |
错误数
| 错误代码 | 说明 |
|---|---|
|
|
传递了不正确的参数值时会引发此错误。 |
|
|
当 |
|
|
如果指定的目录不存在,则会引发此错误。 |
示例:
VAR function_list CLOB;
BEGIN
DBMS_CLOUD_FUNCTION.LIST_FUNCTIONS (
credential_name => 'DEFAULT_CREDENTIAL',
catalog_name => 'OCI_DEMO_CATALOG',
function_list => :function_list);
);
END;
/
SELECT JSON_QUERY(:function_list, '$' RETURNING VARCHAR2(32676) pretty) AS search_results FROM dual;
SYNC_FUNCTIONS 过程
通过此过程,可以将新函数添加到目录并删除已从目录中删除的函数。
注意:
SYNC_FUNCTIONS 过程仅适用于云函数。
语法
DBMS_CLOUD_FUNCTION.SYNC_FUNCTIONS (
catalog_name IN VARCHAR2,
refresh_rate IN VARCHAR2 DEFAULT 'DAILY'
);
参数
| Parameter (参数) | 说明 |
|---|---|
|
|
指定目录名称。 此参数是必需的。 |
|
|
指定函数的刷新率。 refresh_rate 可以接受以下值:
此参数的默认值为 |
错误数
| 错误代码 | 说明 |
|---|---|
|
|
如果指定的目录不存在,则会引发此错误。 |
|
|
当为 |
示例:
BEGIN
DBMS_CLOUD_FUNCTION.SYNC_FUNCTIONS (
catalog_name => 'OCI_DEMO_CATALOG'
);
END;
/