3

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

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

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

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

到目前为止,我有:

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

2 回答 2

12

这是您想要实现的示例。

让我们创建一个对象类型,它将包含类似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);

或者,如果要插入的表的列数和插入的值相同,则尽量不要在插入语句中指定表的列名:

  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; 
于 2012-10-01T17:44:33.913 回答
0
insert into mytable(Name, phone)
select name, phone
from TABLE(v_my_data); 
于 2013-03-01T00:23:57.033 回答