2012-10-01 83 views
3

我一直在尋找一個清晰的例子,沒有運氣。很抱歉,如果它已被回答。使用數組作爲表插入的Oracle存儲過程

我想做一些非常簡單的事情 - 一個存儲過程,將採取輸入並將它們插入到表中。我希望它採用多行數組並一次完成插入。

我認爲這很簡單,但我還沒有找到一個例子顯示我。

在很多例子中,我看到人們創建一個函數來返回數組 - 是我必須做的嗎?

到目前爲止,我有:

CREATE OR REPLACE TYPE my_type is table of (name varchar2(20), phone varchar2(10)); 

CREATE OR REPLACE PROCEDURE customer.insert_mydata(v_my_data my_type) 
AS 
BEGIN 

    BEGIN 
insert into mytable(Name, phone) 
values (v_my_data.name, v_my_data.phone) ; 
     COMMIT; 
    END; 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     ROLLBACK; 
---error logging  ); 
END; 
+0

¿使用腳本時是否發現錯誤?基本上,方法是類似的:創建一個顯式的對象類型,然後將另一個類型作爲object_type的表格,然後使用table_of類型定義in參數。如果您告訴我們關於錯誤或失敗的信息,我會盡力幫忙。 – Alfabravo

+0

謝謝,我會收到錯誤信息併發布。再次感謝。 – user1707389

回答

11

這裏是想你想實現的例子。

讓我們創建一個包含namephone屬性的對象類型。

CREATE OR REPLACE TYPE my_object as object(
    name varchar2(20), 
    phone varchar2(10) 
); 

現在,讓我們創建一個集合,哪些元素是my_object類型:

CREATE OR REPLACE TYPE my_table is table of my_object; 

現在我們的過程,將插入一個特定的表傳過來的收集數據:

CREATE OR REPLACE PROCEDURE insert_mydata(v_my_data my_table) 
AS 
BEGIN 
    forall i in 1..v_my_data.count 
    insert into Some_Table(name, phone)   -- 
     values(v_my_data(i).name, v_my_data(i).phone); 
END; 

示範:

SQL> create table Some_table(
    2 name varchar2(20), 
    3 phone varchar2(10) 
    4 ); 

Table created 

SQL> select * from some_table; 

NAME     PHONE 
-------------------- ---------- 

SQL> 
SQL> declare 
    2 l_col_data my_table; 
    3 begin 
    4 select my_object('Name' 
    5     , '(123)23') bulk collect into l_col_data 
    6  from dual 
    7 connect by level <=11; 
    8 
    9 insert_mydata(l_col_data); 
10 end; 
11/

PL/SQL procedure successfully completed 

SQL> commit; 

Commit complete 

SQL> select * from some_table; 

NAME     PHONE 
-------------------- ---------- 
Name     (123)23 
Name     (123)23 
Name     (123)23 
Name     (123)23 
Name     (123)23 
Name     (123)23 
Name     (123)23 
Name     (123)23 
Name     (123)23 
Name     (123)23 
Name     (123)23 

11 rows selected 

答到註釋

我想你的Oracle版本11g之前。因此,爲了解決這個錯誤(PLS-00436 "implementation restriction".),您可以使用在線視圖中插入數據:

forall i in 1..v_my_data.count 
    insert into (select name, phone from some_table) <-- 
     values(v_my_data(i).name, v_my_data(i).phone); 

還是儘量不要在INSERT語句中指定表的列名,如果您是表的列數插入和插入的值是相同的:

forall i in 1..v_my_data.count 
    insert into some_table       <-- 
     values(v_my_data(i).name, v_my_data(i).phone); 

,或者使用FOR .. LOOP.. END LOOP構建體:

for i in 1..v_my_data.count 
    loop 
    insert into Some_Table(name, phone)   -- 
     values(v_my_data(i).name, v_my_data(i).phone); 
    end loop; 
+0

謝謝!絕對看起來像我需要的東西。創建過程insert_mydata時出現此錯誤:PROCEDURE CUSTOMER.INSERT_MYDATA 聯機時:6 PLS-00436:實施限制:無法引用BULK In-BIND記錄表字段 – user1707389

+0

感謝 - 仍使用任一方法獲得相同的錯誤的插入。我在10g 10.2.0.4.0上。 – user1707389

+1

奇怪......好吧,試試'For .. loop .. end construct'。我已經更新了答案。 –

0
insert into mytable(Name, phone) 
select name, phone 
from TABLE(v_my_data);