【发布时间】:2017-04-08 22:56:14
【问题描述】:
我从 3 或 4 个月开始学习 PLSQL,现在我正在练习动态 SQL,并且我编写了一个简单的程序来使用动态 SQL 更新员工的姓氏。我不知道是什么问题,因为当我调用该过程并插入参数时,我收到一个错误。
CREATE OR REPLACE PROCEDURE upd_emp_dyn(
p_tname VARCHAR2,
p_lname employees.last_name%TYPE,
p_empid employees.employee_id%TYPE)
IS
v_dyn_stmt VARCHAR2(200) := 'UPDATE ' || p_tname ||
' SET last_name = ' ||
p_lname || ' WHERE employee_id = ' ||
p_empid;
v_confirm_stmt VARCHAR2(200) := 'SELECT * FROM ' || p_tname ||
' WHERE employee_id = ' ||
p_empid;
BEGIN
EXECUTE IMMEDIATE v_dyn_stmt;
DBMS_OUTPUT.PUT_LINE(v_confirm_stmt);
END upd_emp_dyn;
/
SHOW ERRORS;
SET SERVEROUTPUT ON
BEGIN
upd_emp_dyn('employees', 'Rooney', 120);
END;
/
Error que empieza en la línea: 2 del comando :
BEGIN
upd_emp_dyn('employees', 'Rooney', 120);
END;
Informe de error -
ORA-00904: "ROONEY": invalid identifier
ORA-06512: at "HR.UPD_EMP_DYN", line 14
ORA-06512: at line 2
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:
【问题讨论】:
-
如果您在 v_dyn_stmt 中显示您的动态 SQL 语句(例如,使用 DBMS_OUTPUT.PUT_LINE 您会明白原因:
set lastname = Rooney... -
不应该
IS是AS吗?另外,除了/之外的行的目的是什么? -
不要将字符串连接到动态 SQL 中。使用占位符和参数。在您的情况下,
update缺少围绕p_lname值的所需单引号 -
@DanBracuk - 同意
AS在这里比IS读得更好,但两者都是有效的。某些工具(尤其是 SQL*Plus)需要/(斜杠)来终止 PL/SQL 块。
标签: sql plsql oracle11g dynamic-sql