Использование переменной в предложении Where, в скрипте - PullRequest
0 голосов
/ 08 июня 2018

Я не уверен в использовании этого поля в переменной строки, которая была загружена в цикл 'for'.

declare
    r_pers_rec   &appOwner..personsTbl%ROWTYPE;

    cursor getItems is
            SELECT Fld1, Fld2
            FROM srcTbl;
begin
    for Rec in getItems 
    loop
        BEGIN
            SELECT * INTO r_pers_rec
            FROM   &appOwner..personsTbl
            WHERE  personnel_id = Rec.Fld1;
        END;
    end loop;
end;

Можно ли использовать Rec.Fld1 таким образом?

1 Ответ

0 голосов
/ 09 июня 2018

Простой ответ на ваш вопрос: «Да, вы можете использовать rec.Fld1 в предложении WHERE, как показано».

Длинный ответ: «Да, но в целом ваш сценарий будет толькоработает правильно, если работает из SQL * Plus или другого клиента, который интерпретирует переменные подстановки (здесь &appOwner) таким же образом, как и SQL * Plus. Вероятно, у вас также должен быть обработчик исключений для NO_DATA_FOUND, как второй SELECTможет выдать это исключение, если для PERSONSTBL не задано значение для данного значения SRCTBL.FLD1 ".

Возможно, лучшим ответом будет" Просто избавьтесь от проблемы ".Перепишите сценарий, чтобы исключить второе SELECT, встроив его в курсор, следующим образом:

BEGIN
  FOR aRec IN (SELECT s.FLD1, s.FLD2, p.*
                 FROM srcTbl s
                 INNER JOIN &appOwner..personsTbl p
                   ON p.PERSONNEL_ID = s.FLD1)
  LOOP
    NULL;  -- Do whatever you need to do with your data here.
  END LOOP;
END;

Как заметил один человек, умнее меня: «Я знаю, что пишу код не тогда, когда естьдобавить нечего, но когда нечего убрать ".

Вышеприведенное будет работать так же, как ваш исходный код, за исключением того, что второй выбор не может вызвать исключение NO_DATA_FOUND - вместо этого,просто не будет возвращено ни одной строки, если значение SRCTBL.FLD1 не найдено в таблице PERSONSTBL.

Если вы действительно хотите, чтобы данные из SRCTBL в всегда возвращались,или в PERSONSTBL найдены несоответствующие данные, измените сценарий на

BEGIN
  FOR aRec IN (SELECT s.FLD1, s.FLD2, p.*
                 FROM srcTbl s
                 LEFT OUTER JOIN &appOwner..personsTbl p
                   ON p.PERSONNEL_ID = s.FLD1)
  LOOP
    NULL;  -- Do whatever you need to do with your data here. Note that in
           -- this case the PERSONSTBL values in aRec will not be populated
           -- (all will be NULL) if there is no matching row on PERSONSTBL
           -- for a given value of SRCTBL.FLD1
  END LOOP;
END;

Удачи.

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