解决方案 »

  1.   

    rs.next()是获取下一条记录,而不是判断是否还有记录,函数使用的不太对
      

  2.   

    仔细看了下你的代码,rs获取的是cursor游标类型,感觉不太对
    游标本身是一个读取的接口,本身是不包含任何数据的,
    不知道java执行cstmt.executeUpdate()之后是不是默认就断开连接了
    如果断开连接的话,游标也就随之实效了
      

  3.   

    建议返回游标的创建语句,然后通过rs=stmt.executeQuery(sql)的方式获取数据
      

  4.   

    同样的代码,调用别的procedure 是可以的,应该是在sql 语句上有问题。
    下面是我的sql代码:create or replace package body pkg_Report IS
      procedure procSIURawDataReport(startDate in varchar2, endDate in varchar2, retCursor IN OUT rcTypeCursor) IS
        sqlstr Clob := '';
        sqlExtrData Clob := '';
        sqlstrCon Clob:='';
        --test
        strTest varchar2(200):='';
        len number:=0;
        sqlstrCp Clob := '';
        --test
        begin
       sqlExtrData := ' select tw.*
      from T_TABLE1                  tw,
           t_TABLE2                         tu,
           T_TABLE3                     tc,
           t_TABLE4 ths,
           T_TABLE5 trih,
           T_TABLE6   tin
     where tw.type_id = 100
       and tw.case_id = tc.case_id
       and tu.user_id = tw.user_id
       and ths.instance_id = tw.instance_id
       and tw.instance_id = trih.instance_id
       and tin._id = trih._id
       and tw.create_date >= to_date('''||startDate||''', ''yyyy-mm-dd'')
       and tw.create_date <= to_date('''||endDate||''', ''yyyy-mm-dd'') ';  sqlstrCon:= 'select WM_CONCAT(''''''''||description||'''''''')  from (select distinct _description   from ('|| sqlExtrData ||')trt  group by trt.description )  ';
        execute immediate sqlstrCon into sqlstr;      sqlstr:='select * from
         ('||sqlExtrData||')
          PIVOT (
          MAX(FLAG)
          FOR DESCRIPTION
          IN  ('||sqlstr||')
          )  ';
        -- execute immediate sqlstr;
        --test-----------------
        sqlstrCp:=sqlstr;
          len:=length(sqlstr);
          if len>=100 then
          while length(sqlstrCp)>=100 loop      strTest:=substr(sqlstrCp,0,100);
           dbms_output.put_line(strTest);
          sqlstrCp:=substr(sqlstrCp,101,length(sqlstrCp)-100);
          end loop;      end if;
          if length(sqlstrCp)>0 then
          dbms_output.put_line(sqlstrCp);
          end if;
          --test----------------
        open retCursor for sqlstr;
        return;
      end;其中在pl/sql中已经执行成功了,能查出结果。
    里面用到了行转列,其中转换的字段的值包含了许多特殊字符。
    我认为是在FOR DESCRIPTION
          IN  ('||sqlstr||')
    这个地方出了问题,但没查出是什么问题,而通过报出的错,得到具体原因。
      

  5.   

    sqlstrCon:= 'select WM_CONCAT(''''''''||description||'''''''')  from (select distinct _description   from ('|| sqlExtrData ||')trt  group by trt.description )  ';
    execute immediate sqlstrCon into sqlstr;
    distinct 后面多一个下划线,不知道是不是笔误单独在数据库环境下执行下,看看是否报错
      

  6.   

    是笔误,已经单独在pl/sql下执行过,确定sql 语句是没有错的。