2017-03-15 33 views
0

在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

你是什麼意思的「我的名單」嗎?你以什麼方式「擁有」這份名單?它是否在一個表中(如果是這樣,以什麼形式 - 作爲單獨的行,每個名稱一個,或者只是一個逗號分隔的字符串)?這是用戶輸入嗎?它是否在數據庫之外的文本文件中? 「我有」不是很有幫助。 – mathguy

+0

我的意思是我有一個由另一個用戶在以下形式給出的值的列表:「'a','b','c'」 –

+0

所以,你的輸入是一個單一的字符串,形式爲'a', 'b','c''?你需要先分割它?你現在怎麼分開 - 手動? – mathguy

回答

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

現在,如果你擔心超過您TEMPSPACE(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; 
/
+0

我認爲你沒有足夠的來自OP的信息來決定PL/SQL是最好的答案。只有當普通SQL無法完成這項工作時才應使用PL/SQL。 – mathguy

+1

同意,儘管這只是一個建議,並且會起作用 –

0

如果您的數據保存在一個給定的表的一些列,使用此

insert into TEMP (name) 
select name_column from given_table; 
commit; 
+0

否將數據保存在給定表中 –

相關問題