Insert using Union/Union All 无法插入所有行
Insert using Union/Union All fails to insert all rows
我正在尝试将 UNION 的结果插入到 table 中。虽然我无法在此处重现原始查询,但由于它处于受限环境中,它的结构看起来类似于:
WITH temp(X,Y,Z) AS(
SELECT....
)
SELECT X,Y,Z from TEMP --PART A
UNION
SELECT 'A','B','C' FROM DUAL;--PART B
查询的A部分returns大约1000条记录,而B部分只是一条记录。
当我将整个查询包装在一个过程中,以便将 select 语句的结果插入到 table 中时,我看到只有 B 部分,一条记录被插入目标 table.Here 是我将其包装在过程中时的样子。
CREATE OR REPLACE PROCEDURE PROC_INSERT
AS
BEGIN
INSERT INTO TABLENAME(COLUMN1,COLUMN2....)
WITH temp(X,Y,Z) AS(
SELECT....
)
SELECT X,Y,Z from TEMP
UNION
SELECT 'A','B','C' FROM DUAL;
COMMIT;
END;
我尝试同时使用 UNION 和 UNION ALL,但不知何故我没有看到将结果集的 A 部分插入 table。
出现这种情况的可能原因是什么?我试图复制相同的,但失败了。
你可以这样做
DECLARE
CURSOR CUR IS SELECT X, Y, Z FROM OG_TABLE UNION SELECT 'A', 'B', 'C' FROM DUAL;
BEGIN
FOR REC IN CUR
LOOP
INSERT INTO NEWTABLE (COL1, COL2, COL3) VALUES (REC.X, REC.Y, REC.Z);
END LOOP;
END;
替代优化代码
DECLARE
LIM PLS_INTEGER := 100;
CURSOR CUR IS SELECT X, Y, Z FROM OG_TABLE UNION SELECT 'A', 'B', 'C'
FROM DUAL;
TYPE OG_REC IS RECORD( X OG_TABLE.X%TYPE, Y OG_TABLE.Y%TYPE, Z
OG_TABLE%TYPE);
TYPE OGT IS TABLE OF OG_REC;
OG_TAB OGT;
BEGIN
OPEN CUR;
LOOP
FETCH CUR BULK COLLECT INTO OG_TAB LIMIT LIM;
BEGIN
FORALL i IN 1..OG_TAB.COUNT SAVE EXCEPTIONS
INSERT INTO NEWTABLE (COL1, COL2, COL3) VALUES (OG_TAB(i).X,
OG_TAB(i).Y, OG_TAB(i).Z);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
EXIT WHEN CUR%NOTFOUND;
END LOOP;
COMMIT;
CLOSE CUR;
END;
我正在尝试将 UNION 的结果插入到 table 中。虽然我无法在此处重现原始查询,但由于它处于受限环境中,它的结构看起来类似于:
WITH temp(X,Y,Z) AS(
SELECT....
)
SELECT X,Y,Z from TEMP --PART A
UNION
SELECT 'A','B','C' FROM DUAL;--PART B
查询的A部分returns大约1000条记录,而B部分只是一条记录。
当我将整个查询包装在一个过程中,以便将 select 语句的结果插入到 table 中时,我看到只有 B 部分,一条记录被插入目标 table.Here 是我将其包装在过程中时的样子。
CREATE OR REPLACE PROCEDURE PROC_INSERT
AS
BEGIN
INSERT INTO TABLENAME(COLUMN1,COLUMN2....)
WITH temp(X,Y,Z) AS(
SELECT....
)
SELECT X,Y,Z from TEMP
UNION
SELECT 'A','B','C' FROM DUAL;
COMMIT;
END;
我尝试同时使用 UNION 和 UNION ALL,但不知何故我没有看到将结果集的 A 部分插入 table。
出现这种情况的可能原因是什么?我试图复制相同的,但失败了。
你可以这样做
DECLARE
CURSOR CUR IS SELECT X, Y, Z FROM OG_TABLE UNION SELECT 'A', 'B', 'C' FROM DUAL;
BEGIN
FOR REC IN CUR
LOOP
INSERT INTO NEWTABLE (COL1, COL2, COL3) VALUES (REC.X, REC.Y, REC.Z);
END LOOP;
END;
替代优化代码
DECLARE
LIM PLS_INTEGER := 100;
CURSOR CUR IS SELECT X, Y, Z FROM OG_TABLE UNION SELECT 'A', 'B', 'C'
FROM DUAL;
TYPE OG_REC IS RECORD( X OG_TABLE.X%TYPE, Y OG_TABLE.Y%TYPE, Z
OG_TABLE%TYPE);
TYPE OGT IS TABLE OF OG_REC;
OG_TAB OGT;
BEGIN
OPEN CUR;
LOOP
FETCH CUR BULK COLLECT INTO OG_TAB LIMIT LIM;
BEGIN
FORALL i IN 1..OG_TAB.COUNT SAVE EXCEPTIONS
INSERT INTO NEWTABLE (COL1, COL2, COL3) VALUES (OG_TAB(i).X,
OG_TAB(i).Y, OG_TAB(i).Z);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
EXIT WHEN CUR%NOTFOUND;
END LOOP;
COMMIT;
CLOSE CUR;
END;