Oracle和SQLServer分别使用函数和存储过程返回结果集

本文介绍了在Oracle数据库中如何使用函数和存储过程返回复杂的结果集。具体包括通过定义对象类型和表类型实现函数返回多列数据,以及利用存储过程结合游标返回记录集合。

我们知道,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;

以上操作完成后,便可以进行执行操作了。


 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值