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

use*_*389 3 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;
Run Code Online (Sandbox Code Playgroud)

Nic*_*nov 11

这是一个想要实现的例子.

让我们创建一个包含namephone类似属性的对象类型.

CREATE OR REPLACE TYPE my_object as object(
   name varchar2(20),
   phone varchar2(10)
);
Run Code Online (Sandbox Code Playgroud)

现在让我们创建一个元素my_object类型为的集合:

CREATE OR REPLACE TYPE my_table is table of my_object;
Run Code Online (Sandbox Code Playgroud)

现在我们的程序将作为集合传入的数据插入到特定的表中:

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;
Run Code Online (Sandbox Code Playgroud)

示范:

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
Run Code Online (Sandbox Code Playgroud)

回答评论

我想你的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);
Run Code Online (Sandbox Code Playgroud)

或者,如果要插入的表的列数和插入的值相同,请尝试不在insert语句中指定表的列名:

  forall i in 1..v_my_data.count
    insert into some_table                           <--
      values(v_my_data(i).name, v_my_data(i).phone);
Run Code Online (Sandbox Code Playgroud)

或使用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; 
Run Code Online (Sandbox Code Playgroud)