oracle packacged函数内的无限循环

时间:2014-06-25 14:37:22

标签: sql sql-server oracle oracle10g linked-server

以下函数进入无限循环..

    function ftCustomerCatalog(comno varchar2,cpls varchar2, cuno varchar2) return tblCustomerCatalog pipelined 
is
  c sys_refCursor;
  r recCustomerCatalog;
  sq varchar2(3000);
begin

  sq:='select  
        a.comno
        ,a.t$cpls
        ,coalesce(a.t$cuno,b.t$cuno) as t$cuno
    ,a.t$cpgs,a.t$item
        ,a.t$Upcd
        ,a.t$dsca
        ,a.t$wght
        ,a.t$ship
      ,coalesce(b.t$stdt,c.t$stdt,d.t$stdt,e.t$stdt,f.t$stdt) as T$STDT
      ,coalesce(b.t$tdat,c.t$tdat,d.t$tdat,e.t$tdat,f.t$tdat) as t$tdat
      ,coalesce(b.t$qanp,c.t$qanp,d.t$qanp,e.t$qanp,f.t$qanp) as t$qanp
      ,a.t$pric
      ,coalesce(b.t$disc,c.t$disc,d.t$disc,e.t$disc,f.t$disc) as t$disc
      ,coalesce(b.source,c.source,d.source,e.source,f.source) as Source 
      from  table(edi.ftPlBaseCatalog(:comno,:cpls,:cuno))  a
        left join table(edi.ft30ciDiscounts(:comno,:cpls,:cuno)) b on a.t$item=b.T$item and a.t$cuno=b.t$cuno
        Left Join table(edi.ft31CPGDiscounts(:comno,:cpls,:cuno))  c on a.t$cpgs=c.t$cpgs
        left Join table(edi.ft31Cdiscounts  (:comno,:cpls,:cuno)) d on d.t$cpgs is null
        left join table(edi.ft33plpgDiscounts(:comno,:cpls)) e on d.t$disc is null and a.t$cpgs=e.t$cpgs
        left join table(edi.ft33PlDiscount(:comno,:cpls)) f on e.t$disc is null 

       Order by A.T$CPGS, a.t$item';
  Open c for SQ using

      comno,cpls,cuno
      ,comno,cpls,cuno
      ,comno,cpls,cuno
      ,comno,cpls,cuno
      ,comno,cpls
      ,comno,cpls
      ;
   LOOP
    fetch c into r;
    exit when c%notfound;
    pipe row(r);
  END LOOP;
  close c;

end;

但是,如果我通过MS Sql 2008 R2服务器以这种方式执行它,它可以正常工作

set quoted_identifier off
--/*
select  
        a.comno
        ,a.t$cpls
        ,t$cuno=coalesce(a.t$cuno,b.t$cuno),a.t$cpgs,a.t$item
        ,a.t$Upcd
        ,a.t$dsca
        ,a.t$wght
        ,a.t$ship

      ,t$stdt=coalesce(b.t$stdt,c.t$stdt,d.t$stdt,e.t$stdt,f.t$stdt)
      ,t$tdat=coalesce(b.t$tdat,c.t$tdat,d.t$tdat,e.t$tdat,f.t$tdat)
      ,t$qanp=coalesce(b.t$qanp,c.t$qanp,d.t$qanp,e.t$qanp,f.t$qanp)
      ,a.t$pric
      ,t$disc=coalesce(b.t$disc,c.t$disc,d.t$disc,e.t$disc,f.t$disc)
      ,SOURCE=coalesce(b.source,c.source,c.source,d.source,e.source,f.source) 

      from openQuery(hades,"select * from table(edi.ftAllPlCatalogs('010','145')) where t$cuno='000164'") a
left join  openQuery(hades,"select * from table(edi.ft30ciDiscounts('010','145','000164'))") b on a.t$item=b.T$item and a.t$cuno=b.t$cuno
Left Join OpenQuery(hades,"select * from table(edi.ft31CPGDiscounts('010','145','000164'))") c on a.t$cpgs=c.t$cpgs
left Join openQuery(hades,"select * from table(edi.ft31Cdiscounts  ('010','145','000164'))") d on d.t$cpgs is null
left join openQuery(hades,"select * from table(edi.ft33plpgDiscounts('010','145'))") e on d.t$disc is null and a.t$cpgs=e.t$cpgs
left join openQuery(hades,"select * from table(edi.ft33PlDiscount('010','145'))") f on e.t$disc is null 
order by A.T$CPGS, a.t$item
--*/
--select * from edi.dbo.edicatalog where t$cuno='000164'

有什么问题?

0 个答案:

没有答案