从select语句中获取多个值到过程的变量中

时间:2015-10-23 09:32:47

标签: database plsql oracle11g

我正在尝试一个程序,其中程序的输入将是一个字符串,如' a,b,c,d'输出将是表中与IN sting中的逗号分隔值匹配的值。

为此 -

create table test (nm varchar2(10));

insert into test values ('a');
insert into test values ('b');
insert into test values ('c');
insert into test values ('d');

select * from test;

NM
------
a
b
c
d

现在我正在尝试创建一个过程,其中IN参数将是逗号分隔字符串中的TEST表的NM列的值,例如' a,b,c,d,x,w'也可能存在错误值。

因此,该过程将只返回与TEST表的NM列匹配的值,为此我创建了此过程---

create or replace procedure p_test (p_nm IN varchar2 /*, p_out OUT  sys_refcursor*/)

is
  l_len number;
  l_val varchar2(10);
  l_val1 varchar2(10);

begin
  l_len := length(p_nm);

 -- dbms_output.put_line(l_len);

  begin

  for i in 1..l_len

  loop

  select  REGEXP_SUBSTR (p_nm, '([^,]*)(,|$)',1, i , NULL, 1) into l_val  from dual;

 --  dbms_output.put_line(l_val);

 --  open p_out for

   select * into l_val1 from test where nm = l_val;

  dbms_output.put_line(l_val1);

  exit when l_len is null;

  end loop;

  exception

    when no_data_found then

    null;

   end;

  exception

  when others then

    dbms_output.put_line('Error reason :'||sqlerrm||' error code :'||sqlcode);

 end;

 EXECUTE p_test('a,,b,c,d,q,w');



 OUTPUT --

 a
 b
 c
 d

这个程序给出了我需要的输出,但是我需要将结果变成一个变量,该变量应该是这个过程的OUT参数,因为它将被我们应用程序的JAVA调用。

因为我已经尝试使用refcursor(请参阅注释部分)但是在调用时它没有给我输出。

当我使用refcursor时(通过删除注释)调用此过程。

 declare
  l_out sys_refcursor;
  l_val varchar2(20);
  l_str varchar2(20) := 'a,b,c,d';
begin
   p_test (l_str, l_out);
   loop
   fetch l_out into l_val;
    dbms_output.put_line(l_val);
    dbms_output.put_line('a');
  exit when l_out%notfound;

  end loop;

端;

所以在这里我一直坚持如何获得多个输出或者我在这里遗漏了一些东西,如果有更好的方法来满足这个要求,我已经来了,所以我在这里分享。

我正在使用---

Oracle Database 11g企业版11.2.0.1.0版 - 64位生产

由于

1 个答案:

答案 0 :(得分:0)

1)在oracle中创建集合。 create type list_of_varchar is table of varchar2(20);
2)使用批量收集。

declare 
 cursor c_obj is select object_name from user_objects where length(object_name) < 20;
 arrays list_of_varchar;
begin 
  open c_obj;
    fetch c_obj bulk collect into arrays;
  close c_obj;  
  dbms_output.put_line('Fetched '||arrays.count);
end;

3 *)并且相同的代码在java中执行。

public static void main(String[] args) throws SQLException, Exception {
    Connection con = ConnectionDefinition.getOracleConnection(); //my oracle connection

    String str = "declare " +
            " cursor c_obj is select object_name from user_objects where length(object_name) < 20;" +
            " arrays list_of_varchar;" +
            "begin " +
            "  open c_obj;" +
            "    fetch c_obj bulk collect into arrays;" +
            "  close c_obj;  " +
            "  dbms_output.put_line('Fetched '||arrays.count);"+
                             " ? := arrays;" +
            "end;";
   CallableStatement cs = con.prepareCall(str);
   cs.registerOutParameter(1, OracleTypes.ARRAY, "LIST_OF_VARCHAR");
   cs.execute();
   String[] strings = (String[])cs.getArray(1).getArray();
   for(String tmp : strings) {
       System.err.println(tmp);
   }
   cs.close();
   con.close();        
}