如何使用游标将SQL server中的临时表转换为PLSQL中的等效代码?
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中,我有如下内容:
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中使用临时表,并执行以下操作:
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的操作?我尝试过以下几种方法:
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“时,我得到错误消息”该表或视图不存在“。
发布于 2017-02-24 20:16:34
不能像查询表一样查询游标。它们是完全不同的东西。您对游标所能做的全部操作是打开、获取和关闭。
由于您需要在两个地方使用结果,因此创建一个global temporary table可能是值得的。您必须单独定义它,因为它的定义是永久的,就像一个普通的表一样--它只是您会话的私有内容。
您还可以考虑将结果批量获取到集合中,并使用两个forall语句,如下面的问题所示:
bulk collect using "for update"
(在该示例中,惟一的问题是添加for update子句,您可以忽略该子句。)
https://stackoverflow.com/questions/42423585
复制相似问题