Oracle存储过程使用数组作为表插入的参数

时间:2012-10-01 17:02:47

标签: arrays oracle parameters

我一直在寻找一个明确的例子,没有运气。对不起,如果它已被回答。

我正在尝试做一些非常简单的事情 - 一个存储过程,它将获取输入并将它们插入到表中。我希望它采用多行数组并一次完成插入。

我认为这很简单,但我没有找到一个向我展示的例子。

在很多例子中,我看到人们创建了一个函数来返回数组 - 这是我必须要做的吗?

到目前为止,我有:

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;

2 个答案:

答案 0 :(得分: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; 

答案 1 :(得分:0)

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