调用DBMS_CLOUD.SEND_REQUEST遇PLS-00306参数错误,求排查建议
问题
尝试通过DBMS_CLOUD.SEND_REQUEST函数将OCI自治数据库中的审计日志数据发送至OCI控制台创建的日志服务,执行以下PL/SQL代码:
DECLARE log_endpoint VARCHAR2(4000); log_body CLOB; CURSOR audit_cursor IS SELECT EVENT_TIMESTAMP, DBUSERNAME, ACTION_NAME, RETURN_CODE FROM UNIFIED_AUDIT_TRAIL WHERE EVENT_TIMESTAMP > SYSTIMESTAMP - INTERVAL '1' DAY; BEGIN log_endpoint := 'https://logging.eu-frankfurt-1.oci.oraclecloud.com/20200531/logs/ocid1.log.oc1.eu-frankfurt-1.mysecretocid'; FOR rec IN audit_cursor LOOP log_body := '{ "specversion": "1.0", "source": "autonomous-database", "eventType": "db-audit-log", "data": { "timestamp": "' || TO_CHAR(rec.EVENT_TIMESTAMP, 'YYYY-MM-DD"T"HH24:MI:SS"Z"') || '", "dbusername": "' || rec.DBUSERNAME || '", "action": "' || rec.ACTION_NAME || '", "status": "' || CASE WHEN rec.RETURN_CODE = 0 THEN 'SUCCESS' ELSE 'FAILURE' END || '" } }'; DBMS_CLOUD.SEND_REQUEST( credential_name => 'MY_CRED', uri => log_endpoint, method => DBMS_CLOUD.METHOD_POST, body => log_body ); END LOOP; END; /
已创建该函数所需的凭据,但执行时出现以下错误:
ERROR at line 29: ORA-06550: line 29, column 5: PLS-00306: wrong number or types of arguments in call to 'SEND_REQUEST' ORA-06550: line 29, column 5: PL/SQL: Statement ignored
对照Oracle文档,DBMS_CLOUD.SEND_REQUEST的参数定义无问题,请求提供排查建议。
排查建议
- 检查参数兼容性与拼写:不同Oracle自治数据库版本的
DBMS_CLOUD.SEND_REQUEST参数可能存在差异,确认当前数据库版本的官方参数定义。尝试按文档指定的参数顺序传递(而非命名参数方式),排查是否因版本差异导致参数匹配失败。 - 验证
body参数类型:虽然代码中log_body定义为CLOB,部分版本的SEND_REQUEST对body类型支持有限。尝试将log_body转换为VARCHAR2(确保内容长度不超过限制)后传入,或使用DBMS_LOB包处理CLOB参数,排查类型转换问题。 - 确认凭据有效性:检查
MY_CRED凭据的权限是否允许访问目标日志服务端点,确认凭据配置的OCI密钥、租户ID等信息正确。可先通过极简GET请求测试端点连通性,验证凭据是否可用。 - 校验端点URL格式:OCI日志服务的Ingest API端点需符合官方规范,检查URL中的OCID是否完整,是否遗漏日志组等必要路径参数,确认URL格式与OCI文档要求一致。
- 测试简化调用:编写极简的
SEND_REQUEST调用(仅传递必要参数和简单JSON body),排除循环和复杂数据拼接的干扰,确认基础调用是否正常,逐步定位问题根源。
内容的提问来源于stack exchange,提问作者gurbelunder
相关产品推荐
相关产品推荐

