我一直在寻找一个明确的例子,没有运气。对不起,如果它已被回答。
我正在尝试做一些非常简单的事情 - 一个存储过程,它将获取输入并将它们插入到表中。我希望它采用多行数组并一次完成插入。
我认为这很简单,但我没有找到一个向我展示的例子。
在很多例子中,我看到人们创建了一个函数来返回数组 - 这是我必须要做的吗?
到目前为止,我有:
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;
答案 0 :(得分:11)
这是一个想要实现的例子。
让我们创建一个包含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;
答案 1 :(得分:0)
insert into mytable(Name, phone)
select name, phone
from TABLE(v_my_data);