我需要多次调用一个PL / SQL过程。
例如:
我有一些Oracle的存储过程
procedure insData(a_ in varchar2, b_ in varchar2) is
begin
--some actions here
insert into tmp_table (a,b) values (a_, b_);
end;
和Java代码,应该多次调用此过程:
StoredProcedureQuery query = em.createStoredProcedureQuery("insData");
query.registerStoredProcedureParameter("a_", String.class, ParameterMode.IN);
query.registerStoredProcedureParameter("b_", String.class, ParameterMode.IN);
for (Entry entry : collection) {
query.setParameter("a_", entry.a);
query.setParameter("b_", entry.b);
query.execute();
}
但是表'tmp_table'只包含一条记录(集合的第一个条目)。 如果我将查询的构造函数移动到循环中,它将起作用,但它很难看。我认为,还有另一种方式。
如何多次调用此查询而不进行查询重新创建?
UPD:
主要思想是不循环运行程序,主要思想是使用不同的参数多次使用创建的程序而不重新创建。我可以使用em.createNativeQuery
执行此操作(创建一次查询并使用不同的参数多次使用它),但无法使用em.createStoredProcedureQuery
答案 0 :(得分:1)
正如Boniest所提到的,您可以使用集合并一次性传递值。见下文:
create type var_a is table of varchar2(30000) ;
create type var_b is table of varchar2(30000) ;
create table tmp_table(a varchar2(1000),b varchar2(100))
create or replace procedure insData(a_ in var_a, b_ in var_b) is
begin
FORALL i IN 1 .. a_.count
INSERT INTO tmp_table(a,b)
VALUES (a_(i),b_(i));
commit;
end;
执行:
exec insData(var_a('A','B'),var_b('C','D'));
答案 1 :(得分:0)
一个查询对象只能执行一次。丑陋的是在循环中调用query.execute()。