如何在 Oracle 更新过程中将 table 名称作为参数传递?

How to pass table name as a parameter in update procedure in Oracle?

我是 Oracle 的新手,很抱歉这个问题对您来说似乎很简单。

我需要通过 UPDATE 查询和 replace 函数

获取以下过程
CREATE OR REPLACE PROCEDURE proc_replace_space_1
(
    p_table user_tables.table_name%TYPE,
    p_search IN varchar2,
    p_replace IN varchar2
)
IS 
BEGIN 
    EXECUTE IMMEDIATE 
            'update ' || p_table || 
            'set docnum = replace(docnum, :2, :3 )'
            USING p_search, p_replace;
END;

此过程删除所有空格。

但是当我调用它时

BEGIN 
    proc_replace_space_1('cm_risk.fct_loans_temp', ' ', '');
END;

我遇到了以下错误

SQL Error [971] [42000]: ORA-00971: missing SET keyword
ORA-06512: at "CM_RISK.PROC_REPLACE_SPACE_1", line 9
ORA-06512: at line 2

如何修改我的代码来处理这些问题?

谢谢。

你只需要在设置之前添加一个space。目前,您的 table 名称已附加到 set 关键字,并且假定它是 table 名称,即 MyTableSet

CREATE OR REPLACE PROCEDURE proc_replace_space_1
(
    p_table user_tables.table_name%TYPE,
    p_search IN varchar2,
    p_replace IN varchar2
)
IS 
BEGIN 
    EXECUTE IMMEDIATE 
            'update ' || p_table || 
            ' set docnum = replace(docnum, :2, :3 )'
            USING p_search, p_replace;
END;

动态 SQL 很难,因为它将 编译错误 变成 运行 时间错误 。因此,我敦促您养成将动态 SQL 组装为字符串变量的好习惯,如果您有这样的东西,您可以将其保存到日志 table 中(如果没有,那就是另一个养成的好习惯)或使用 dbms_output.put_line.

显示

因此您的程序将如下所示:

CREATE OR REPLACE PROCEDURE proc_replace_space_1
(
    p_table user_tables.table_name%TYPE,
    p_search IN varchar2,
    p_replace IN varchar2
)
IS

  l_sql varchar2(32767);
 
BEGIN 

  l_sql := 'update ' || p_table || 
            'set docnum = replace(docnum, :2, :3 )';

    EXECUTE IMMEDIATE 
            l_stmt
            USING p_search, p_replace;

exception
  when others then
    dbms_output.put_line(l_sql);
    raise;
END;

此方法允许您查看实际执行的 SQL 程序。您可能会立即发现语法错误(在本例中是 table 名称和 set 之间缺少的 space)。否则,您可以自己尝试 运行 该语句,然后查看 SQL 编译器突出显示的内容。


注意:根据您的环境,您可能需要启用 DBMS_OUTPUT 才能看到消息。