楼主实际上这个package里面的procedure是不能向package外面返回游标的,因为右边本来就不是个确定的东西,其实楼主这种功能完全可用动态SQL实现啊

解决方案 »

  1.   

    to screend(流浪小子)
    我个人觉得从程序设计的角度来讲,最好是单输入,单输出的,一个过程返回多行记录,确实oracle没有很好的办法,当然了,如果处理/返回 都在一个package里面处理的那也好办,直接使用sub procedure就可以了
    --------------------------那例如下面的例子我应该怎样写存储过程呢,是否把他分开写?
    select dept_name,dept_id,...from dept
        把用循环查询到的dept_name(部门),dept_id附值给$dept,$id在根据$id子循环查询另一个员工表select name,sex.... from staff where dept_id=$id 
    while{
         查询部门
         while{ 查询员工}
    }
    在网页显示格式是
    <tr>部门</tr>
    <tr><td>name</td>><td>sex</td></tr>
    <tr><td>name</td>><td>sex</td></tr>
    <tr>部门</tr>
    <tr><td>name</td>><td>sex</td></tr>
    ....
    }
    如果直接在前端程序里写就简单,但如果把查询数据库部分写在存储过程里,应该怎样呢?是不是把查询部门的写一个存储过程a,查询员工的有写一个存储过程b,然后在前端程序调用存储过程a,查到有多少个部门就调用多少次存储过程b,是否要这样啊?
      

  2.   

    楼主的意思我还不是很明白,不知道用存储过程而不直接写SQL可有什么其他方面的考虑,当oracle实现这样的存储过程确实不大容易,而关键问题是,也没必要.
    如果为了可重用,可定义一个php函数解决此问题啊,如果想隐藏SQL,这样恐怕也不行吧
    真的不行的话,不如直接调用procedure建一个view得了,然后查数据在这个view上面查
      

  3.   

    应该是直接调用存储过程,比直接写语句要好,存储过程的速度执行起来要快,oracle我也了解得不多,但是存储过程要比语句好!
      

  4.   

    考虑用存储过程 + 临时表吧, 直接返回 CURSOR 的可能性不大
      

  5.   

    to  alexzhang00(三角猫)大哥
    对临时表不太懂,是不是建一个表把数据临时放进去啊,然后在删除啊?
    能否解释一下,先谢啦
      

  6.   

    其实存储过程能提高速度的原理,就在于它已编译了,下次调用就不需要重新编译,速度当然也就快了,可是动态SQL也是一样的啊,这个SQL也编译了并放在内存中,在这里跟存储过程是一样的.临时表就不用了吧,view不是很好吗?
    create view TestView
    select * from youTable1,table2 where ....然后查询时直接查询该view就可以了