如何多次调用StoredProcedureQuery

时间:2016-11-24 08:07:43

标签: oracle jpa plsql

我需要多次调用一个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

执行此操作

2 个答案:

答案 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()。