2014-06-12 31 views
0

我有一个具有执行立即语句的过程。在那个执行即时语句中调用一个有两个输出参数的过程。我在尝试获取那些在调用execute immediate语句的过程中使用的参数时遇到了问题。从调用过程的立即执行语句中使用out参数

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; 

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

回答

3

试试这个:

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数据类型(如NUMBER,VARCHAR2等)

+0

谢谢。这解决了我的问题。但我认为这是关于记录类型的。我得到一个错误,说它必须使用SQL类型。 – Alkey29

+0

查看我关于记录类型的更新答案 –