Правильно ли я строю свой курсор SQL? - PullRequest
1 голос
/ 03 апреля 2012

Мой скрипт ниже будет использовать две внешние таблицы для заполнения двух отдельных таблиц, но я не уверен, правильно ли я использую курсор. Если я использую его неправильно, пожалуйста, помогите мне исправить ошибку.

// обновление Это для базы данных 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 ]

6 голосов
/ 03 апреля 2012

Синтаксис выглядит довольно хорошо, но доверяйте тестированию больше, чем моим глазам :)

Но что более важно;зачем использовать курсоры для этой задачи?Два оператора вставки будут выполнять одну и ту же работу, и код, основанный на наборе (а не процедурный), вероятно, будет работать лучше в большинстве СУБД.

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;
0 голосов
/ 03 апреля 2012

Полагаю, вы плохо используете курсор.

Использование курсоров в SQL-сервере можно найти здесь и здесь . Вы можете прочитать здесь о курсорах MySQL. Использование курсора отличается от типа RDBMS к типу RDBMS. Ваш технический вопрос будет более конкретным, если вы добавите СУБД, которую вы используете в качестве тега. Алгоритм использования курсора:

  • Объявите курсор и свяжите его с запросом
  • Откройте курсор
  • Обрабатывайте строки вашего курсора, разбивая его строки и обрабатывая их как вам нравится
  • Закройте курсор
  • Отменить выделение курсора

Точное использование можно найти в примерах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...