有一个function,定义如下:
type cur is ref cursor;
function mytest return cur
is 
    c cur;
begin
    open c for (select * from mytable);
    return c;
end;非常简单,就是在function中返回了一个cursor。但是现在我需要在sql(注意,是普通的sql,不是pl/sql,也不是在java,c#等中使用)中使用这个cursor,打印出它的内容,这个sql怎么写?直接使用
select * from mytest()不行,是不是需要一个什么转换函数?

解决方案 »

  1.   

    不太明白你的意思,是不是你想要的是个sql语句?
      

  2.   

    是的,我需要一个sql。我是在c1report(一个报表工具)中做报表,它只能使用标准的sql从数据库中读取数据。因为逻辑有点复杂,所以我在数据库中写了一个function: get_data(...) return cursor。但是用标准的sql调用这个function,读出来的不是一行行的数据,有什么办法可以把那个cursor转换成一行行的数据
      

  3.   

    select mytest() from dual;
    不知道是不是你想要的。
      

  4.   

    一个范例:
    create package pkg_test
    is
        type cur is ref cursor;
    end;
    create or replace function mytest return pkg_test.cur
    is 
        c pkg_test.cur;
    begin
        open c for select * from emp;
        return c;
    end;select mytest() from dual;
      

  5.   

    to DragonBill(用户中文昵称------静观其变,以静制动)你的这段代码与我的基本上是一模一样,但是在toad中直接运行(按F9)
    select mytest() from dual
    在datagrid里只显示出一个单元格,里面写的是(CURSOR)如果按F5的话,在Script Output中到是可以显示出所有数据。但是我需要的是在F9的datagrid中显示出所有数据,不然我没有办法在c1report中使用
      

  6.   

    你可以使用Pipelined Table Functions
      

  7.   

    to sxfwang() 
    你所说的Pipelined Table Functions是不是先定义一个object,再定义一个table of object,然后在function中使用pipe row()?
    这样的方式我会,但是它太麻烦了,因为要一旦返回的字段要修改,就要修改那个object,非常不方便,所以最后还是在考虑cursor
      

  8.   

    你等更高版本的Oracle出来吧,目前我知道的好像只有这个方法.