在循环中运行动态生成的 MERGE INTO 语句会抛出“ORA-01489:字符串连接的结果太长”错误

问题描述 投票:0回答:1

在循环中运行动态生成的 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 运行得很好。即使源表中没有数据也会引发错误,这意味着不应插入任何内容。更有趣的是,如果目标表没有数据,但源表有数据,则运行语句会出现错误,并且数据会正确插入到源中。

错误原因是什么以及如何处理?预先感谢您。

oracle-database plsql
1个回答
0
投票

重写 sql 生成

SELECT 'query' INTO QUERYVAR FROM DUAL;
QUERYVAR := 'query'
成功了。

© www.soinside.com 2019 - 2024. All rights reserved.