0

所以这是我的代码:

CREATE OR REPLACE PROCEDURE UPDATE_USER
(
  updateColumn IN USERS.column_name%type,
  changeStr IN VARCHAR2,
  unID IN VARCHAR2
)
IS
BEGIN
  EXECUTE IMMEDIATE
    'UPDATE
      users
    SET :1 = :2
    WHERE
      uniqueID = :3'
  USING updateColumn, changeStr, unID; 
END;
/

我已经为此搜索了其他答案,据我所知,这应该可行。但是我收到错误:'错误(3,25):PLS-00302:必须声明组件'COLUMN_NAME''

谢谢。

4

1 回答 1

2

错误消息指定第 3 行,字符 25,它指向参数column_name的声明中updateColumn。您似乎正在尝试将要更新的列名作为参数传递,但这意味着在编译时该列是未知的,因此它的类型是未知的。这也没有任何意义——如果它是一个number列,那么你会尝试将列名传递给一个数字参数,这无论如何都行不通。如果您不想将其声明为 simple varchar2,则可以改用user_tab_columns.column_name%type.

但是您不能使用绑定变量在更新语句中动态设置列名。它会编译,但会ORA-01747从以冒号开头的明显名称开始执行。您需要将其连接起来,例如:

CREATE OR REPLACE PROCEDURE UPDATE_USER
(
  updateColumn IN user_tab_columns.column_name%type,
  changeStr IN VARCHAR2,
  unID IN VARCHAR2
)
IS
BEGIN
  EXECUTE IMMEDIATE
    'UPDATE
      users
    SET ' || updateColumn || ' = :1
    WHERE
      uniqueID = :2'
  USING changeStr, unID; 
END;
/

但是您需要清理列名以避免 SQL 注入。例如, APC对您链接到的问题的回答提到了使用DBMS_ASSERT包。

于 2012-12-12T11:21:30.303 回答