刚接触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.创建一个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;这两种方式有什么区别,在处理百万记录的情况下,用哪种更为有效呢,请大家指点。
如你程序的结构化规划有关系。
首先,建立包的方式,更有助于逻辑功能的分离。
楼主提供的代码只是提供了建立光标的函数部分,没有饮用这个函数的代码。
其实他和之间使用光标的区别就在于此。
package的方式更便于其他过程函数访问这个打开光标的过程,你可以在其他方法或者过程中读取处理数据。
第2种方法,你就必须把处理数据的工作做到这个存储过程中,你的代码是没有办法复用的。
可不可以这么理解,package方式更有助于代码复用和逻辑功能的分离,这上面的只是举了个例子只查询了两例,实际过程中比这个要复杂很多,那就是说,这两种方式在性能方面应该没有多大区别,性能主要跟语句的写法有关系了。是不是可以这样认为呢?请高手赐教。谢谢。