DYNAMIC SQL RETURNING子句在Oracle 10g中给出错误

时间:2013-06-29 14:06:16

标签: oracle plsql oracle10g

以下是匿名栏目:

DECLARE
v_tablename VARCHAR2(20);
sql_statement VARCHAR2(500);
v_empid emp.emp_id%TYPE := 11;
v_empname emp.emp_name%TYPE;
v_deptid emp.dept_id%TYPE;
v_age emp.age%TYPE;
v_sex emp.sex%TYPE;
BEGIN
v_tablename := '&table';
sql_statement := 'UPDATE ' || v_tablename || ' SET age = age + 1 WHERE emp_id = :1 RETURNING empname,deptid,age,sex INTO :2, :3, :4, :5';
EXECUTE IMMEDIATE sql_statement USING v_empid RETURNING INTO v_empname, v_deptid, v_age, v_sex;
DBMS_OUTPUT.PUT_LINE('Name: ' || v_empname);
DBMS_OUTPUT.PUT_LINE('Dept Id: ' || v_deptid);
DBMS_OUTPUT.PUT_LINE('Age: ' || v_age);
DBMS_OUTPUT.PUT_LINE('Sex: ' || v_sex);
END;

当我执行此操作时,我收到以下错误消息:

ORA-00904: "DEPTID": invalid identifier

错误出现在以下行中:

sql_statement := 'UPDATE ' || v_tablename || ' SET age = age + 1 WHERE emp_id = :1 RETURNING empname,deptid,age,sex INTO :2, :3, :4, :5';

这个错误听起来像变量尚未声明但是对于DML中的RETURNING(在我的情况下是UPDATE)我们真的需要声明变量吗?

请让我知道如何解决这个问题并使这块块工作。

1 个答案:

答案 0 :(得分:2)

当表格中的列为returningempname时,您的deptid子句会尝试返回列emp_namedept_id。问题所在的局部变量名称不是,或者在错误消息中提到。

所以你需要:

... RETURNING emp_id, dept_id, age, sex INTO ...

我不确定为什么你在本地变量名中删除了下划线;如果您拥有v_emp_idv_emp_namev_dept_id,则可能不那么令人困惑。

当然,无论如何都不需要使用动态SQL,但我认为你正在尝试。