使用调用过程的执行立即语句中的 out 参数

Posted

技术标签:

【中文标题】使用调用过程的执行立即语句中的 out 参数【英文标题】:Using an out parameter from an execute immediate statement that calls a procedure 【发布时间】:2014-06-12 18:14:39 【问题描述】:

我有一个包含立即执行语句的过程。在该执行立即语句中,调用具有两个输出参数的过程。我在尝试获取要在调用执行立即语句的过程中使用的那些输出参数时遇到问题。

execute_stmt := 'DECLARE pi_error_log_rec error_log%ROWTYPE; p_plan_id NUMBER; begin SCHEMA.PACKAGE_NAME.' ||
                PROCEDURE || '(' ||
                p_audit_log_id || ', ' ||
                V_PARAMETER1 || ', ' || '''' ||
                V_PARAMETER2 || '''' ||
                ', p_plan_id, pi_error_log_rec); end;';
execute immediate execute_stmt;

if(pi_error_log_rec.error_text IS NOT NULL) THEN
  --do stuff;
ELSE
  --do stuff;

out参数为p_plan_idpi_error_log_rec,其余为IN参数。因此,我需要获取这两个输出,以便在调用此立即执行的过程中使用。但它没有在变量中设置输出。我错过了一个步骤还是应该使用不同的方法来使用 out 参数?

【问题讨论】:

【参考方案1】:

试试这个:

execute_stmt := 'Begin SCHEMA.PACKAGE_NAME.PROCEDURE(:p_audit_log_id, :V_PARAMETER1, :V_PARAMETER2); END;';
execute immediate execute_stmt USING IN p_audit_log_id, OUT pi_error_log_rec, OUT p_plan_id;

从 Oracle 12c 开始,您还可以将 PL/SQL 数据类型(如 RECORDSBOOLEAN)提取到动态 SQL 中。在早期版本中,您仅限于 SQL 数据类型(如 NUMBERVARCHAR2 等)

【讨论】:

谢谢。这解决了我的问题。但我认为记录类型确实如此。我收到一个错误,说它必须使用 sql 类型。

以上是关于使用调用过程的执行立即语句中的 out 参数的主要内容,如果未能解决你的问题,请参考以下文章

赵强老师Oracle存储过程中的out参数

赵强老师Oracle存储过程中的out参数

如何执行存储过程

MySQL-进阶18 存储过程- 创建语句-参数模式(in/out/inout-对应三个例子) -调用语法-delimiter 结束标记'$'

oracle存储过程输入参数能否为空

使用JDBC从Java调用Oracle SQL中的存储过程的示例