0

我正在执行以下代码片段

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 语句工作正常?我还需要做些什么才能使其正常工作吗?

4

1 回答 1

3

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;
于 2013-09-28T11:56:02.790 回答