查询具有LONG列的表

时间:2017-02-01 03:22:38

标签: oracle jdbc

我正在编写一个在字典视图ALL_VIEWS中搜索文本的函数。感兴趣的列,称为TEXT,是LONG(!)数据类型,这会产生一个主要问题:我无法查询视图文本模式。如果没有在服务器上执行的过程代码的帮助,我将不得不获取所有视图记录并过滤客户端上感兴趣的视图记录。这个解决方案不是出于性能原因。

更好的选择是调用匿名PL / SQL块对ALL_VIEWS执行查询,过滤所有有趣的视图,并将结果集返回给客户端。如何做到有几种可能性:

  1. 创建临时表,并返回迭代它的游标
  2. 创建集合数据类型,并将其绑定为返回值
  3. 将过滤后的记录转储到DBMS_OUTPUT中,并在后续JDBC调用中检查它
  4. 一个重要的限制是我不允许创建任何数据库对象。同样在第一种情况下,必须创建临时表权限。

    对于第二种情况,我尝试了以下方法:

        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拒绝绑定输出参数;这就是我被困的地方。

    最后,即使第三种解决方案是可行的,但它超出了我的接受阈值。

1 个答案:

答案 0 :(得分:1)

OracleCallableStatement上有一个API: registerIndexTableOutParameter 可用于将OUT参数定义为PLSQL关联数组。然后有一个getPlsqlIndexTable方法在程序执行完毕后检索值。在您的情况下,返回的对象应该是String []。