達成したい欲求の例を次に示します。
そのような属性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;