如何在 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 才能看到消息。
我是 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 才能看到消息。