-------------------------------定义部分
create or replace package fun_hlzh
as
type mycursor is ref cursor;
function hlzh(strsql in varchar2) return mycursor;
end;
/
create or replace package body fun_hlzh
as 
  function hlzh(strsql in varchar2) return mycursor 
  as
    rc mycursor;
  begin
    open rc for strsql;
    return rc;
  end;
end;----------------------- 执行部分
declare
ssql varchar(8000);
begin
 ssql:='select name';
for m in (select ',sum(case km when '''||rtrim(a.km)||''' then cj end;) ['||rtrim(a.km)||']' l from (select distinct km from test) a) loop
    ssql:=ssql||m.l;
end loop;
 ssql:=ssql||' from test group by name;';
 --dbms_output.put_line(ssql);
 execute immediate fun_hlzh.hlzh(ssql);
end;
--------------------------
定义部分和执行部分在plsql developer的sql窗口中各自分别执行.定义部分总是有错误出现.请帮我看看是哪里有问题,我实在看不出来???  如果定义部分成功,在ssql的字符串没有问题的情况下,执行部分可成功运行吗?如果不行,要怎么修改呢?

解决方案 »

  1.   

    create or replace package fun_hlzh
    as
    type mycursor is ref cursor;
    function hlzh(strsql in varchar2) return mycursor;
    end fun_hlzh;
    /
    create or replace package body fun_hlzh
    as 
      function hlzh(strsql in varchar2) return mycursor 
      as
        rc mycursor;
      begin
        open rc for strsql;
        return rc;
      end hlzh;
    end fun_hlzh;
      

  2.   

    不行,运行时没有提示,正常结束.但是在plsql developer中的package对象中出现的这个fun_hlzh上打了一把小叉.不知道是为什么造成这种情况?
      

  3.   

    定义部分我已搞定,在plsql developer中编译总是有问题,在sqlplus中编译成功.不知道为何?在执行运行部分时提示:提示:
    ERROR 位于第 10 行:
    ORA-06550: 第 10 行, 第 20 列:
    PLS-00382: 表达式类型错误
    ORA-06550: 第 10 行, 第 2 列:
    PL/SQL: Statement ignored
    ------------------------------------
    我改写成如下语句进行测试:
    begin
    execute immediate fun_hlzh.hlzh('select * from test');
    end;
    执行后仍然有类似的提示:
    ERROR 位于第 2 行:
    ORA-06550: 第 2 行, 第 19 列:
    PLS-00382: 表达式类型错误
    ORA-06550: 第 2 行, 第 1 列:
    PL/SQL: Statement ignored
    这是怎么回事????
      

  4.   

    当然会报错了,你fun_hlzh.hlzh('select * from test')返回的是cursor,看你接下来要怎么用了。
    cursor怎么用它就怎么用
      

  5.   

    create or replace package fun_hlzh
    as
    type mycursor is ref cursor;
    function hlzh(strsql in varchar2) return mycursor;
    end fun_hlzh;
    /
    create or replace package body fun_hlzh
    as 
      function hlzh(strsql in varchar2) return mycursor 
      as
        rc mycursor;
      begin
        open rc for strsql;
        return rc;
      end hlzh; ------去掉hlzh
    end fun_hlzh;一楼的去掉hlzh就检测通过的