同样的代码,调用别的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||') 这个地方出了问题,但没查出是什么问题,而通过报出的错,得到具体原因。
sqlstrCon:= 'select WM_CONCAT(''''''''||description||'''''''') from (select distinct _description from ('|| sqlExtrData ||')trt group by trt.description ) '; execute immediate sqlstrCon into sqlstr; distinct 后面多一个下划线,不知道是不是笔误单独在数据库环境下执行下,看看是否报错
游标本身是一个读取的接口,本身是不包含任何数据的,
不知道java执行cstmt.executeUpdate()之后是不是默认就断开连接了
如果断开连接的话,游标也就随之实效了
下面是我的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||')
这个地方出了问题,但没查出是什么问题,而通过报出的错,得到具体原因。
execute immediate sqlstrCon into sqlstr;
distinct 后面多一个下划线,不知道是不是笔误单独在数据库环境下执行下,看看是否报错