这是您想要实现的示例。
让我们创建一个对象类型,它将包含类似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);
或者,如果要插入的表的列数和插入的值相同,则尽量不要在插入语句中指定表的列名:
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;