在Oracle上,我有一个名称列表,例如'a','b','c',我想将它们插入表中。此列表的维度可能会更改。所以不能这样做:
insert all
into TEMP (name) values ('a')
into TEMP (name) values ('b')
into BBU (name) values ('b')
into BBU (name) values ('c')
select * from TEMP;
如何使插入更加动态? 感谢
答案 0 :(得分:1)
改用PL / SQL。并循环。
DECLARE
CURSOR myCur IS
SELECT name FROM myTable;
TYPE xTab IS TABLE OF myCur%ROWTYPE;
L_tab xTab;
BEGIN
OPEN myCur;
FETCH myCur INTO L_tab;
CLOSE myCur;
FORALL i IN 1..L_tab.COUNT
INSERT INTO myTab2 (name) VALUES (L_tab(i).name);
COMMIT;
END;
/
现在,如果你担心超过你的临时空间(redo logs
),那么列表就是数百万条记录,然后使用限制:
DECLARE
myLimit NUMBER := 32000;
myFlag BOOLEAN := FALSE;
CURSOR myCur IS
SELECT name FROM myTable;
TYPE xTab IS TABLE OF myCur%ROWTYPE;
L_tab xTab;
BEGIN
OPEN myCur;
LOOP
FETCH myCur INTO L_tab LIMIT myLimit;
IF myCur%NOTFOUND
THEN
IF L_tab.COUNT != 0
THEN
myFlag := TRUE;
ELSE
EXIT;
END IF;
END IF;
FORALL i IN 1..L_tab.COUNT
INSERT INTO myTab2 (name) VALUES (L_tab(i).name);
COMMIT;
EXIT WHEN myFlag = TRUE;
END LOOP;
CLOSE myCur;
END;
/
答案 1 :(得分:1)
使用VARRAY
或集合:
INSERT INTO TEMP ( name )
SELECT COLUMN_VALUE
FROM TABLE( SYS.ODCIVARCHAR2LIST( 'a', 'b', 'c', 'd', 'e' ) );
或者使用分隔列表然后使用split it(有多个解决方案可以在该链接上拆分分隔字符串,但其中一个是:)
INSERT INTO TEMP ( name )
SELECT x.item.getStringVal()
FROM XMLTABLE(
( '"a","b","c","d","e"' )
COLUMNS item XMLTYPE PATH '.'
) x;
答案 2 :(得分:0)
如果您的数据保存在给定表的某些列中,请使用此
insert into TEMP (name)
select name_column from given_table;
commit;