在循环中运行动态生成的 MERGE INTO 语句会抛出
ORA-01489: result of string concatenation is too long
错误。
生成的 MERGE INTO 语句为:
USING SOURCE S
ON (T.PK = S.PK)
WHEN NOT MATCHED THEN INSERT (T.PK, T.NAME, T.DESCRIPTION)
VALUES (S.PK, S.NAME, S.DESCRIPTION);
SQL 是使用以下方式生成并循环执行的:
SELECT
'MERGE INTO ' || DESTINATION_TABLE_NAME || ' T
USING ' || SOURCE_TABLE_NAME || ' S
ON (' || PK_COLS || ')
WHEN NOT MATCHED THEN INSERT (' || DESTINATION_COLS || ')
VALUES (' || SOURCE_COLS || ')'
INTO QUERYVAR
FROM DUAL;
EXECUTE IMMEDIATE QUERYVAR;
SOURCE 表中的数据使用以下方式插入:
INSERT INTO SOURCE (PK, NAME, DESCRIPTION) VALUES ('GUID_KEY', 'Name', 'Description');
表格具有以下结构:
CREATE TABLE SOURCE
("PK" VARCHAR2(32 BYTE) DEFAULT (SYS_GUID()) NOT NULL ENABLE,
"NAME" VARCHAR2(100 BYTE) NOT NULL ENABLE,
"DESCRIPTION" VARCHAR2(3999 BYTE) NOT NULL ENABLE,
CONSTRAINT "PK_PK" PRIMARY KEY ("PK"))
独立运行 MERGE INTO,而不是在循环中不会引发任何错误。但只有在循环运行时才会发生错误。在这个之后或之前的其他 MERGE INTO 运行得很好。即使源表中没有数据也会引发错误,这意味着不应插入任何内容。更有趣的是,如果目标表没有数据,但源表有数据,则运行语句会出现错误,并且数据会正确插入到源中。
错误原因是什么以及如何处理?预先感谢您。
重写 sql 生成
SELECT 'query' INTO QUERYVAR FROM DUAL;
至 QUERYVAR := 'query'
成功了。