我是以正确的方式构建我的SQL游标吗?

时间:2012-04-03 09:40:44

标签: sql oracle cursor

我的下面的脚本将使用两个外部表填充两个单独的表,但我不确定我是否正确使用我的光标。如果我以不正确的方式使用它,请帮我纠正错误。

//更新 它适用于oracle数据库(ORACLE SQL)

DECLARE
L_volg_no1 NUMBER;
L_volg_no2 NUMBER;

CURSOR c_gip IS

SELECT
    artikelnummer,
    ingangsdatum,
    grossiersprijs
FROM dc_RMSSID_GIP;

CURSOR c_gip_promo IS

SELECT
    artikelnummer,
    ingangsdatum
    promo_nummer,
    actie_grossiersprijs    
FROM dc_RMSSID_GIPPromo;

     BEGIN
FOR r_sid1 in c_gip
LOOP

SELECT daa_imp_rms_gip_seq.NEXTVAL INTO L_volg_no1 FROM DUAL;

INSERT 
INTO daa_imp_rms_grossiersprijs (
    volg_nr
    ,importtijdstip
    ,importstatus
    ,artikelnummer
    ,ingangsdatum
    ,grossiersprijs         
)
VALUES (
    L_volg_no1,
    SYSDATE,
    'N',
    r_sid1.artikelnummer,
    r_sid1.ingangsdatum,
    r_sid1.grossiersprijs
);

END LOOP;

FOR r_sid2 in c_gip_promo
LOOP

SELECT daa_imp_rms_prm_gip_seq.NEXTVAL INTO L_volg_no2 FROM DUAL;

INSERT 
INTO daa_imp_rms_prm_grossiersprijs (
    volg_nr
    ,importtijdstip
    ,importstatus
    ,artikelnummer
    ,ingangsdatum
    ,promo_nummer
    ,grossiersprijs 
)
VALUES (
    L_volg_no2,
    SYSDATE,
    'N',
    r_sid2.artikelnummer,
    r_sid2.ingangsdatum,
    r_sid2.promo_nummer,
    r_sid2.grossiersprijs
);

END LOOP;

COMMIT;
END;

2 个答案:

答案 0 :(得分:6)

语法看起来相当不错但是比我的眼睛更信任你的测试:)

但更重要的是;为什么使用游标执行此任务?两个插入语句将执行相同的工作,并且基于集合(而不是程序)的代码可能在大多数RDBMS中表现更好。

Begin
    INSERT 
    INTO daa_imp_rms_grossiersprijs (
        volg_nr
        ,importtijdstip
        ,importstatus
        ,artikelnummer
        ,ingangsdatum
        ,grossiersprijs         
    )
        select  (
            daa_imp_rms_gip_seq.NEXTVAL,
            SYSDATE,
            'N',
            artikelnummer,
            ingangsdatum,
            grossiersprijs
    FROM dc_RMSSID_GIP;

    INSERT 
    INTO daa_imp_rms_prm_grossiersprijs (
        volg_nr
        ,importtijdstip
        ,importstatus
        ,artikelnummer
        ,ingangsdatum
        ,promo_nummer
        ,grossiersprijs 
    )
    select 
            daa_imp_rms_prm_gip_seq.NEXTVAL, 
            SYSDATE,
            'N',
            artikelnummer,
            ingangsdatum
            promo_nummer,
            actie_grossiersprijs    
    FROM dc_RMSSID_GIPPromo;

    commit;
end;

答案 1 :(得分:0)

我相信你不能很好地使用你的光标。

可以找到SQL-Server中的游标用法herehere。 您可以阅读有关MySQL游标的here。 游标用法从RDBMS类型到RDBMS类型不同。如果要添加用作标记的RDBMS,则技术问题会更具体。 游标使用算法:

  • 声明光标并将其链接到查询
  • 打开光标
  • 通过对其行进行处理并按照您的喜好处理它们来处理光标行
  • 关闭光标
  • 取消分配光标

可以从示例中找到确切的用法。