oracle pl/sql 循环中以表名作为参数的 UPDATE 语句
Posted
技术标签:
【中文标题】oracle pl/sql 循环中以表名作为参数的 UPDATE 语句【英文标题】:UPDATE statements in oracle pl/sql loop with tablenames as parameters 【发布时间】:2013-12-17 22:14:26 【问题描述】:我有一个要求,我需要在 for 循环中运行一组 UPDATE 语句。 在游标中有一个名为 PROPERTY_ID 的列,它是一个数字,并且有很多表 附加了这个数字。 例如:SELECT * FROM PC_ORG_EXT_111(其中 111 是 property_id)
这是代码,它正在抛出错误。 如果我在这里遗漏了什么,任何人都可以帮助我。
SET SERVEROUTPUT ON SIZE 1000000
SET LINESIZE 1000
SET PAGESIZE 0
DECLARE
V_PROP_ID VARCHAR(200);
V_CNT NUMBER(25);
V_SQL_STRING VARCHAR2(500);
CURSOR CUR_CON
IS
SELECT * FROM PRE_CONVERSION_UNMERGE_LIST;
BEGIN
FOR REC_CON IN CUR_CON
LOOP
V_PROP_ID := 'PROPARCH.PC_ORG_EXT_' || REC_CON.PROPERTY_ID;
dbms_output.put_line('Property Table Name ' || V_PROP_ID);
EXECUTE IMMEDIATE 'select COUNT(1) from ' ||V_PROP_ID;
EXECUTE IMMEDIATE '
UPDATE SIEBEL.S_ACCNT_POSTN
SET OU_EXT_ID = ' || REC_CON.VALID_SURVIVIR_REC ||'
WHERE OU_EXT_ID = ' || REC_CON.INVALID_SURVIVOR_REC||'
AND OU_EXT_ID IN (SELECT ISAC_ROW_ID
FROM ' || V_PROP_ID || '
WHERE INTEGRATION_ID = '||REC_CON.DELPHI_ID||')
AND POSITION_ID NOT IN
(SELECT POSITION_ID
FROM SIEBEL.S_ACCNT_POSTN
WHERE OU_EXT_ID = '||REC_CON.VALID_SURVIVIR_REC||')';
END LOOP;
END;
错误说: ORA-00933: SQL 命令未正确结束 ORA-06512:在第 20 行
如果有更好的方法,请告诉我。
谢谢,
【问题讨论】:
您有一些语法错误,可能缺少;
或)
。检查代码中第 20 行的内容。
调试的最佳方法,形成一个查询字符串。打印字符串,最后在EXECUTE IMMEDIATE
中使用。
COUNT(1) -- 与 COUNT(*) 没有区别
【参考方案1】:
请试试这个! - 单引号必须与转义字符一起使用!
EXECUTE IMMEDIATE '
UPDATE SIEBEL.S_ACCNT_POSTN
SET OU_EXT_ID = ''' || REC_CON.VALID_SURVIVIR_REC ||'''
WHERE OU_EXT_ID = ''' || REC_CON.INVALID_SURVIVOR_REC||'''
AND OU_EXT_ID IN (SELECT ISAC_ROW_ID
FROM ' || V_PROP_ID || '
WHERE INTEGRATION_ID = '''||REC_CON.DELPHI_ID||''')
AND POSITION_ID NOT IN
(SELECT POSITION_ID
FROM SIEBEL.S_ACCNT_POSTN
WHERE OU_EXT_ID = '''||REC_CON.VALID_SURVIVIR_REC||''')';
【讨论】:
进行更改后,它给出了不同的错误:ORA-00903:无效的表名 ORA-06512:在第 16 行我们可以使用 ''' || V_PROP_ID || FROM 子句中的 ''' 操作? @user2999377 该 ID 字段的数据类型是什么?如果不是 varchar/varchar2 那么这个答案是错误的,因为它会导致隐式类型转换。当然,您不需要将 V_PROP_ID 括在引号中。 我已经编辑了我的答案以避免表名使用单引号。 @user2999377 我的,很高兴,也请接受这个作为答案:)以上是关于oracle pl/sql 循环中以表名作为参数的 UPDATE 语句的主要内容,如果未能解决你的问题,请参考以下文章