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

達成したい欲求の例を次に示します。

そのような属性nameを含むオブジェクトタイプを作成しましょう。phone

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; 
于 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 に答える