如何在插入中添加名称列表?

时间:2017-03-15 12:55:46

标签: oracle sql-insert

在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;

如何使插入更加动态? 感谢

3 个答案:

答案 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;
相关问题