我是 Oracle 11g 和这个论坛的新手。我只需要使用 Oracle Merge 语句运行一个简单的更新语句,因为我的 SQL 开发人员不会采取任何其他方式。
奇怪的是,无论我如何尝试更正该声明,即使在阅读了该论坛中的许多条目后,我仍然收到完全相同的错误消息。
有 2 种不同的错误消息,取决于我在 SQL Developer 中运行语句的方式。如果我将我的语句作为存储过程运行(更新语句是存储过程中的一小部分。我注释掉了其他 SQL 语句,只是将这个更新语句留在了存储过程中)我得到了这个错误:
我跑了这个:
create or replace
PROCEDURE ADDR_UPDATE_2
AS
/* other sql statements are commented out */
MERGE INTO (SELECT id,xseq,line_1,line_2,zip,tax FROM ADDR ) b
USING (SELECT id,xseq,line_1, line_2,NVL(zip, '') AS pos_10 , NVL(tax, '') AS pos_11
FROM TEMP_ADDR ) v
ON(b.id = v.id
AND b.xseq = v.xseq)
WHEN MATCHED THEN UPDATE SET b.line_1 = v.line_1,
b.line_2 = v.line_2,
b.zip = v.pos_10,
b.tax = v.pos_11
WHERE b.line_1 <> v.line_1
OR b.line_2 <> v.line_2
OR b.zip <> v.pos_10;
/* other sql statements are commented out */
END;
我得到了这个错误:
错误(23,9):PLS-00103:在预期以下情况之一时遇到符号“INTO”:常量异常表 long double ref char 时间时间戳间隔日期二进制国家字符 nchar
(我到处看,没有找到任何答案)
第 23 行指的是“INTO”这个词
- 但是,如果我自己运行上面的 Merge 语句,而不是作为 str 的一部分。proc.,我没有收到任何错误。我得到了一个结果:0 行合并。
现在我将 Merge 语句修改为:
create or replace
PROCEDURE ADDR_UPDATE_2
AS
/* other sql statements are commented out */
MERGE INTO ADDR b
USING (SELECT id,xseq, line_1, line_2, NVL(zip, '') AS pos_10,
NVL(tax, '') AS pos_11
FROM TEMP_ADDR) v
ON(b.id = v.id
AND b.xseq = v.xseq
AND b.line_1 <> v.line_1
OR b.line_2 <> v.line_2
OR b.zip <> v.pos_10)
WHEN MATCHED THEN UPDATE SET b.line_1 = v.line_1,
b.line_2 = v.line_2,
b.zip = v.pos_10,
b.tax = v.pos_11;
/*
other sql statements are commented out
*/
END;
我得到了同样的错误:
错误(23,9):PLS-00103:在预期以下情况之一时遇到符号“INTO”:常量异常表 long double ref char 时间时间戳间隔日期二进制国家字符 nchar
第 23 行指的是“INTO”这个词
当我运行该语句时,该语句不是 str 的一部分。过程:
我得到了一个不同的错误:
命令行错误:9 列:8
错误报告:SQL 错误:ORA-38104:无法更新 ON 子句中引用的列:“B”。“LINE_2”38104。00000 -“无法更新 ON 子句中引用的列: %s" *原因:UPDATE SET 的 LHS 包含 ON 子句中引用的列 *操作:
我从两天前开始尝试寻找答案,但没有结果,有没有人可以帮助解决这个问题?