[英]How to load data from SQL Server into Oracle Table using PLSQL Developer
[英]Translate code from SQL SERVER using temporary table to Oracle PLSQL using Cursor
我如何转换临时表以在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”时,出现错误“表或视图不存在”。
您不能像游标一样查询游标。 他们是完全不同的东西。 您可以使用游标进行的所有操作都是打开,获取和关闭。
由于您需要在两个地方使用结果,因此值得创建一个全局临时表 。 您必须分别定义它,因为该定义像普通表一样是永久性的-它只是会话专用的内容。
您可能还会看到将结果批量提取到集合中并使用两个forall
语句,如下所示:
(在该示例中,唯一的问题是围绕添加for update
子句,您可以忽略该子句。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.