在动态语句中使用记录属性时执行立即抛出错误

时间:2013-09-28 11:49:45

标签: sql oracle plsql oracle11g oracle-sqldeveloper

我正在执行以下代码片段

set serveroutput on;
DECLARE
  TYPE emp_rec_type IS record (emp_id NUMBER,salary NUMBER);
  emp_rec emp_rec_type;

  l_out number;
  l_statement varchar2(1000);

BEGIN
    emp_rec.emp_id := 1;
    emp_rec.salary := 1000;

    SELECT emp_rec.salary INTO l_out FROM dual WHERE 1=1;
    dbms_output.put_line(l_out);

    l_statement := 'select emp_rec.salary from dual where 1=1';
    execute immediate l_statement into l_out;
    dbms_output.put_line(l_out);
END;

我得到以下输出

  Error report:
       ORA-00904: "EMP_REC"."SALARY": invalid identifier
       ORA-06512: at line 23
       00904. 00000 -  "%s: invalid identifier"
       *Cause:    
         *Action:

       1000

我期待输出

1000
1000

为什么动态语句执行坚持emp_rec.salary是一个无效的标识符,而Select into语句工作正常? 我还需要做些什么才能让它发挥作用吗?

1 个答案:

答案 0 :(得分:2)

EXECUTE IMMEDIATE语句的内容在与PL / SQL代码的其余部分完全不同的范围内运行 - 您无法直接引用PL / SQL变量。

如果要在动态语句中使用emp_rec.salary的内容,则应该像这样绑定值:

l_statement := 'SELECT :1 FROM dual WHERE 1=1';
EXECUTE IMMEDIATE l_statement INTO l_out USING emp_rec.salary;