Простой ответ на ваш вопрос: «Да, вы можете использовать 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;
Удачи.