0

下面是匿名块:

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';

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

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

4

1 回答 1

2

当表中的列是 and 时,您的returning子句试图返回列empnameand 。问题不是局部变量名称,也不是错误消息中提到的。deptidemp_namedept_id

所以你需要:

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

我不确定您为什么在局部变量名称中删除了下划线;v_emp_id如果你有,v_emp_name和,它可能不会那么混乱v_dept_id

当然,无论如何这都不需要使用动态 SQL 来完成,但我假设您正在试验。

于 2013-06-29T14:19:39.870 回答