我们知道,SQLServer无论是函数还是存储过程,其返回结果集都是较为简单的,在这里我们就不多加说明了,下面我们将通过实例详细分析一下Oracle的函数和存储过程返回结果集的方法:
1、函数
首先创建某一个对象类型如下:
CREATE OR REPLACE TYPE "NS_FB_BUSINESS_SPECIALVAL_ROW" AS OBJECT
(
BID INTEGER,
BIZ_TYPE VARCHAR2(4),
CONTRACT_NO VARCHAR2(32),
DEBTOR INTEGER,
CURRENCY_NO VARCHAR2(4),
START_DATE DATE,
MATURITY DATE,
STATE INTEGER,
SUB_STATE INTEGER,
SPEVAL NUMBER(15,2),
special_list_id INTEGER,
ledger_type VARCHAR2(4),
loanTerm VARCHAR(64),
LOANTERMNAME VARCHAR(256),
CORPNO VARCHAR2(32),
CORPNAME VARCHAR2(100),
CRGRADE VARCHAR2(32),
self_support INTEGER
)
然后,创建一表类型如下:
CREATE OR REPLACE TYPE "NS_FB_BUSINESS_SPECIALVAL_TAB" AS TABLE OF NS_FB_BUSINESS_SPECIALVAL_ROW
紧接着我们要创建一函数如下:
CREATE OR REPLACE FUNCTION NS_FB_BUSINESS_SPECIAL_VAL(pDate_ IN DATE DEFAULT NULL)
RETURN NS_FB_BUSINESS_SPECIALVAL_TAB PIPELINED
IS
SepcialVal NS_FB_BUSINESS_SPECIALVAL_ROW :=
NS_FB_BUSINESS_SPECIALVAL_ROW(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
BEGIN
for rec in(
select fb.*,
sval.speval, --- 卖断余额
sval.special_list_id, --- 卖断明细id
sval.ledger_type, --- 卖断台帐类型
fb_ndqx_func.fb_calLoanTerm(fb.start_date, fb.maturity) as loanTerm,
--贷款期限 :1:三年以上; 2:三年; 3:一年;4:6个月;5:三个月;6:一个月;
fb_ndqx_func.fb_calLoanTermName(fb_ndqx_func.fb_calLoanTerm(fb.start_date,
fb.maturity)) as loanTermName,
b.corpno, --客户编号
b.corpname, --客户名称
b.crgrade, --信用等级
fc.self_support
From fb_business fb
inner join fb_contracts fc on fb.bid=fc.bid
inner join (select scl.bid,
scl.special_list_id,
sl.ledger_type,
sum(sl.amount * (case sl.dir_flag
when '+' then
1
else
-1
end)) as speval
From fb_special_contract sc
inner join fb_special_contract_list scl on sc.special_id =
scl.special_id
inner join fb_special_ledger sl on sc.special_id =
sl.special_id
where sc.biz_type = '114' and sl.ACT_DATE<=pDate_
group by scl.special_list_id, scl.bid, sl.ledger_type) sval on sval.bid =
fb.bid
join corporations b on fb.debtor = b.corpid
)
LOOP
SepcialVal.BID := rec.bid ;
SepcialVal.BIZ_TYPE := rec.BIZ_TYPE ;
SepcialVal.CONTRACT_NO := rec.CONTRACT_NO ;
SepcialVal.DEBTOR := rec.DEBTOR ;
SepcialVal.CURRENCY_NO := rec.CURRENCY_NO ;
SepcialVal.START_DATE := rec.START_DATE ;
SepcialVal.MATURITY := rec.MATURITY ;
SepcialVal.STATE := rec.STATE ;
SepcialVal.SUB_STATE := rec.SUB_STATE ;
SepcialVal.SPEVAL := rec.SPEVAL ;
SepcialVal.special_list_id := rec.special_list_id ;
SepcialVal.ledger_type := rec.ledger_type ;
SepcialVal.loanTerm := rec.loanTerm ;
SepcialVal.LOANTERMNAME := rec.LOANTERMNAME ;
SepcialVal.CORPNO := rec.CORPNO ;
SepcialVal.CORPNAME := rec.CORPNAME ;
SepcialVal.CRGRADE := rec.CRGRADE ;
SepcialVal.self_support := rec.self_support;
PIPE ROW(SepcialVal);
END LOOP;
RETURN;
END;
以上操作完成后,我们便可以做下面的查询操作了,
select * from table(NS_FB_BUSINESS_SPECIAL_VAL(temp_Date)) bs
2、存储过程
早期版本中可以使用package和ref cursor来返回,10g后可以直接使用SYS_REFCURSOR进行代替。
过程如下:
首先创建一package,
CREATE OR REPLACE PACKAGE GLOBALPKG
AS
TYPE RCT1 IS REF CURSOR;
TRANCOUNT INTEGER := 0;
IDENTITY INTEGER;
DBLINK VARCHAR2(2) := 'FN';
END;
然后,创建一存储过程,
CREATE OR REPLACE PROCEDURE NsWsGetCltClassList
(
Uid_ in int,
GroupNo in varchar2,
ClassNo varchar2,
RCT1 IN OUT GLOBALPKG.RCT1
)
/** 签名结果 **/
AS
CCId int;
CGNo varchar2 (2);
CCNo varchar2 (18) ;
CCName varchar2 (60) ;
TreeNo varchar2(18) ;
Level_ smallint ;
FullName varchar2(255) ;
Memo varchar (255);
UserId int;
ASSIGNMENTVARIABLE0 int;
CURSOR cur
IS
select a.CCId,a.CGNo,a.CCNo,a.CCName,a.TreeNo,a."LEVEL",a.FullName,a.Memo
from NsCltClass a
where a.cgNo = NsWsGetCltClassList.GroupNo
and a.CCNo like NsWsGetCltClassList.ClassNo || '%';
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE NsWsGetCltClassList_TBL';
OPEN cur;
while 1=1 loop
fetch cur into CCId,CGNo,CCNo,CCName,TreeNo,Level_,FullName,Memo ;
if cur%NOTFOUND then
exit;
end if;
BEGIN
select count(*) into ASSIGNMENTVARIABLE0 from WSClientACL
where ccid in ( select ccid from
NsCltClass
where CgNo = NsWsGetCltClassList.GroupNo
and Uid = NsWsGetCltClassList.Uid_
and NsWsGetCltClassList.TreeNo like TreeNo || '%' ) ;
EXCEPTION
WHEN NO_DATA_FOUND THEN
ASSIGNMENTVARIABLE0 := 0;
END;
if ASSIGNMENTVARIABLE0 >0 then
UserId := NsWsGetCltClassList.Uid_;
else
UserId :=0;
end if;
insert into NsWsGetCltClassList_TBL(CCId,CGNo,CCNo,CCName,TreeNo,Level_,FullName,Memo,UId_)
values(NsWsGetCltClassList.CCId,NsWsGetCltClassList.CGNo,NsWsGetCltClassList.CCNo,NsWsGetCltClassList.CCName,NsWsGetCltClassList.TreeNo,NsWsGetCltClassList.Level_,NsWsGetCltClassList.FullName,NsWsGetCltClassList.Memo,NsWsGetCltClassList.UserId);
end loop;
open RCT1 for
select * from NsWsGetCltClassList_TBL
order by TreeNo, Level_;
END;
以上操作完成后,便可以进行执行操作了。
本文介绍了在Oracle数据库中如何使用函数和存储过程返回复杂的结果集。具体包括通过定义对象类型和表类型实现函数返回多列数据,以及利用存储过程结合游标返回记录集合。
1万+

被折叠的 条评论
为什么被折叠?



