首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用临时表将SQL SERVER中的代码转换为使用游标的Oracle PLSQL

使用临时表将SQL SERVER中的代码转换为使用游标的Oracle PLSQL
EN

Stack Overflow用户
提问于 2017-02-24 02:34:42
回答 1查看 63关注 0票数 0

如何使用游标将SQL server中的临时表转换为PLSQL中的等效代码?

代码语言:javascript
复制
ALTER proc [dbo].[sp_lista] (@pcFI datetime, @pcFF datetime, @vSuma tinyint) as
    begin tran

    Declare @crLista Table (
        NEnt int,
        NEje int,
        NExp char(17),
        NAcu char(17),
        NSen char(17)
     )

     if @vSuma = 0
         begin
             insert into @crLista 
             select tablax.num_entrada, tablax.ejercicio,                                               tablax.num_expediente, tablax.num_acuerdo, tablax.num_sentencia,    tablax.descripcion
             from   tablax inner join tablaz on
                    tablaz.num_expediente = tablax.num_expediente
             where  tablax.est_suma = 0 and (EXISTS
                    ( SELECT 1
                      FROM   tablay
                      WHERE  tablay.cve_usuario = SESSION_USER
                      and    tablay.cve_region = tablaz.cve_region
                      and    tablay.cve_sala = tablaz.cve_sala
                      and    tablay.cve_mag = tablaz.cve_mag
                      and    tablay.cve_srio = tablaz.cve_srio) )

         update tablax 
                set notificado = 1,
                fec_notificado = getdate()
         from   @crLista MLista
         where  MLista.NEnt = tablax.num_entrada and
                MLista.NEje = tablax.ejercicio and tablax.est_suma = @vSuma     

在PL/SQL中,我有如下内容:

代码语言:javascript
复制
create or replace PROCEDURE sp_lista(
    v_pcFI IN DATE,
    v_pcFF   IN DATE,
    v_vSuma  IN NUMBER
)
AS
    vcMLista SYS_REFCURSOR;
BEGIN
    IF v_vSuma = 0 THEN
        BEGIN
            open vcMLista for
                SELECT tablax.num_entrada ,
                       tablax.ejercicio ,
                       tablax.num_expediente ,
                       tablax.num_acuerdo ,
                       tablax.num_sentencia
                FROM   tablax
                       JOIN tablaz
                       ON   tablaz.num_expediente = tablax.num_expediente
                WHERE  tablax.est_suma = 0
                AND    ( EXISTS
                         ( SELECT 1
                           FROM   tablay
                           WHERE  tablay.cve_usuario  = v_vcUsr_actual
                           AND    tablay.cve_region   =  tablaz.cve_region
                           AND    tablay.cve_sala     = tablaz.cve_sala
                           AND    tablay.cve_mag      = tablaz.cve_mag
                           AND    tablay.cve_srio     = tablaz.cve_srio
                         ) )
                FOR UPDATE;

随后,在SQL SERVER中使用临时表,并执行以下操作:

代码语言:javascript
复制
update tablax 
       set notificado = 1,
       fec_notificado = getdate()
from   @crLista MLista
where  MLista.NEnt = tablax.num_entrada and
       MLista.NEje = tablax.ejercicio and tablax.est_suma = @vSuma

update tablay set fmod =getdate()
where  ndoc in 
       ( select distinct NExp from @crLista )

如何使用游标执行等同于PLSQL的操作?我尝试过以下几种方法:

代码语言:javascript
复制
OPEN crLista;
FETCH crLista INTO reg;

WHILE crLista%FOUND LOOP
    UPDATE actm_lista SET  
           notificado = 1,
           FEC_NOTIFICADO = sysdate
    WHERE  CURRENT OF crLista;

    FETCH crLista INTO reg;
END LOOP;

OPEN crLista;
FETCH crLista INTO reg;

WHILE crLista%FOUND LOOP  
    UPDATE tablax
    SET    fmod = SYSDATE
    WHERE  ne IN
           ( SELECT DISTINCT reg.ne FROM crLista );

    FETCH crLista INTO reg;
END LOOP;    

UPDATE tablay
SET    fmod = SYSDATE
WHERE  ndoc IN
       ( SELECT DISTINCT ndoc FROM crLista );

但是,当尝试执行"from crLista“时,我得到错误消息”该表或视图不存在“。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-24 20:16:34

不能像查询表一样查询游标。它们是完全不同的东西。您对游标所能做的全部操作是打开、获取和关闭。

由于您需要在两个地方使用结果,因此创建一个global temporary table可能是值得的。您必须单独定义它,因为它的定义是永久的,就像一个普通的表一样--它只是您会话的私有内容。

您还可以考虑将结果批量获取到集合中,并使用两个forall语句,如下面的问题所示:

bulk collect using "for update"

(在该示例中,惟一的问题是添加for update子句,您可以忽略该子句。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42423585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档