刚接触oracle存储过程,从网上找了些例子也试验成功了,例如返回记录集的例子,就有两种实现方式,这两种方式有什么区别吗?麻烦大家指点下:
1.创建一个packet的方式
CREATE OR REPLACE PACKAGE PKG_ReturnRecordCollection AS
/******************************************************************************
   NAME:       PKG_ReturnRecordCollection
   PURPOSE:   REVISIONS:
   Ver        Date        Author           Description
   ---------  ----------  ---------------  ------------------------------------
   1.0        2008-6-2             1. Created this package.
******************************************************************************/
  type myCursor is ref cursor;
  function get(p_id number) return myCursor;END PKG_ReturnRecordCollection;create or replace package body PKG_ReturnRecordCollection 
as
   function get(p_id number) return myCursor is
   rc myCursor;
   strsql varchar2(200);
    begin
        if p_id=0 then 
        open rc for select name,re from co2_region ; 
        else
        strsql:='select name,re from co2_region where id=:p_id';
        open rc for strsql using p_id;
        end if;
        return rc; 
    end get;end PKG_ReturnRecordCollection;2.游标方式
CREATE OR REPLACE PROCEDURE GMCC.ShowRecordCollectionByCursor
IS
tmpVar1 VARCHAR2(500);
tmpVar2 VARCHAR2(500);
CURSOR emp_cur IS
     SELECT NAME,REMARK FROM CO2_REGION; --轾亏靠昕罂标/******************************************************************************
   NAME:       ReturnRecordCollectionByCursor
   PURPOSE:    
   AuthorL     YeJian
   REVISIONS:
   Ver        Date        Author           Description
   ---------  ----------  ---------------  ------------------------------------
   1.0        2008-6-2          1. Created this procedure.   NOTES:   Automatically available Auto Replace Keywords:
      Object Name:     ReturnRecordCollectionByCursor
      Sysdate:         2008-6-2
      Date and Time:   2008-6-2, 13:18:13, and 2008-6-2 13:18:13
      Username:         (set in TOAD Options, Procedure Editor)
      Table Name:       (set in the "New PL/SQL Object" dialog)******************************************************************************/
BEGIN
     OPEN emp_cur;
     
     LOOP
        FETCH emp_cur
          INTO tmpVar1,tmpVar2; 
        EXIT WHEN emp_cur%NOTFOUND; 
        DBMS_OUTPUT.PUT_LINE(tmpVar1 || '' || tmpVar2); 
     END LOOP;
     CLOSE emp_cur; 
    
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       RAISE;
END ShowRecordCollectionByCursor;这两种方式有什么区别,在处理百万记录的情况下,用哪种更为有效呢,请大家指点。

解决方案 »

  1.   

    我感觉第二种开销小点,第一种get,open太频繁,而且对于百万的数据量只是取其中2列,业务逻辑太简单,这这么复杂没啥意义啊
      

  2.   

    应该是从应用的实现方式上有区别。
    如你程序的结构化规划有关系。
    首先,建立包的方式,更有助于逻辑功能的分离。
    楼主提供的代码只是提供了建立光标的函数部分,没有饮用这个函数的代码。
    其实他和之间使用光标的区别就在于此。
    package的方式更便于其他过程函数访问这个打开光标的过程,你可以在其他方法或者过程中读取处理数据。
    第2种方法,你就必须把处理数据的工作做到这个存储过程中,你的代码是没有办法复用的。
      

  3.   


    可不可以这么理解,package方式更有助于代码复用和逻辑功能的分离,这上面的只是举了个例子只查询了两例,实际过程中比这个要复杂很多,那就是说,这两种方式在性能方面应该没有多大区别,性能主要跟语句的写法有关系了。是不是可以这样认为呢?请高手赐教。谢谢。
      

  4.   

    对于你说get,open太频繁,好象只是在调用的时候才会进行一次get,open操作,为什么说很频繁呢?希望能给出解答,多谢。