我正在编写一个在字典视图ALL_VIEWS中搜索文本的函数。感兴趣的列,称为TEXT,是LONG(!)数据类型,这会产生一个主要问题:我无法查询视图文本模式。如果没有在服务器上执行的过程代码的帮助,我将不得不获取所有视图记录并过滤客户端上感兴趣的视图记录。这个解决方案不是出于性能原因。
更好的选择是调用匿名PL / SQL块对ALL_VIEWS执行查询,过滤所有有趣的视图,并将结果集返回给客户端。如何做到有几种可能性:
一个重要的限制是我不允许创建任何数据库对象。同样在第一种情况下,必须创建临时表权限。
对于第二种情况,我尝试了以下方法:
String sql = "declare\n"+
" l_search varchar2(1000) := 'union';\n"+
" l_char varchar2(32767);\n"+
" TYPE strtbl IS TABLE OF varchar2(1000) INDEX BY BINARY_INTEGER \n"+
" l_st strtbl; \n"+
" i integer; \n"+
"begin\n"+
" i := 1;"+
" for rec in (select * from all_views where rownum < 10)\n"+
" loop\n"+
" l_char := rec.text;\n"+
" if (instr(l_char, l_search) > 0) then\n"+
" l_st(i) := 'Match: ' || rec.owner || '.' || rec.view_name;\n"+
" i := i+1;\n"+
" end if;\n"+
" end loop;\n"+
" ? := l_st;\n"+
"end;";
final CallableStatement cs = conn.prepareCall(sql);
cs.registerOutParameter(1, OracleTypes.ARRAY);
cs.execute();
// cs.getObject(1); // cast to array, etc.
但是,JDBC拒绝绑定输出参数;这就是我被困的地方。
最后,即使第三种解决方案是可行的,但它超出了我的接受阈值。
答案 0 :(得分:1)
OracleCallableStatement上有一个API: registerIndexTableOutParameter 可用于将OUT参数定义为PLSQL关联数组。然后有一个getPlsqlIndexTable方法在程序执行完毕后检索值。在您的情况下,返回的对象应该是String []。