【问题标题】:Using an out parameter from an execute immediate statement that calls a procedure使用调用过程的执行立即语句中的 out 参数
【发布时间】: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 参数?

【问题讨论】:

    标签: sql oracle stored-procedures plsql


    【解决方案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 类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多