2012-10-01 52 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);