#sql #oracle #plsql #case
#sql #Oracle #plsql #случай
Вопрос:
Я борюсь с оператором обращения как частью сценария PL / SQL.
Требование заключается в том, что у нас есть задание ETL, которое выполняет загрузку одной строки в таблицу с результатами. Это задание возвращает два столбца для разных сегментов, каждый из которых будет считываться с пропуском или ошибкой. Результаты этих столбцов отправляются по электронной почте команде, ответственной за эти данные. Поэтому, если они оба прочитали «Pass», они получают электронное письмо с сообщением, что все в порядке. Если в одном из столбцов указано «Сбой», они получают электронное письмо с сообщением, что им необходимо проверить данные.
Когда я тестирую этот скрипт, он просто не работает, либо сообщает, что команда SQL не завершена должным образом, либо выдает множество ошибок PL / SQL. Поскольку в таблице будет более одной строки данных, каждый из двух подзапросов select ищет последнюю строку, отсюда и разделы MAX(LOAD_KEY).
Я сделал это слишком сложным? Я слишком много думал об этом?
whenever sqlerror exit failure rollback
--
connect / as sysdba
set serverout on size 1000000
--set echo on
--
alter session set current_schema = amp;2;
--
--
-- executing function
--
DECLARE
RetVal Number;
--
--
-- Retrieve latest outcome records
--
BEGIN
select case
when (SELECT T4_VALIDATION_OUTCOME
FROM TABLE
WHERE LOAD_KEY = (select MAX(LOAD_KEY) from TABLE)) = 'Pass'
AND (SELECT T7_VALIDATION_OUTCOME
FROM TABLE
WHERE LOAD_KEY = (select MAX(LOAD_KEY) from TABLE)) = 'Pass'
THEN 0
ELSE 1
into RetVal
FROM TABLE;
--
if RetVal = 0 then
dbms_output.put_line('Pass'); -- T4/T7 Reconciled
ELSE
dbms_output.put_line('Fail'); -- Either T4 or T7 not reconciled
END IF;
--
END;
/
exit ```
Комментарии:
1. Пожалуйста, предоставьте образцы данных и желаемые результаты. Вопрос описывает одну таблицу, но в запросе используется три, что делает вещи довольно неясными.
2. Извините, все ссылки на ТАБЛИЦУ являются одной и той же таблицей. T4 и T7 — это два столбца в одной таблице. Вот почему я думаю, что я слишком усложнил это
3. Одна очевидная ошибка, которую я вижу в коде, заключается в том, что в вашем выражении CASE (вы используете выражение CASE, а не оператор CASE) отсутствует требуемое ключевое слово END в конце, прямо перед
into RetVal
. Не уверен, что это единственная ошибка, но она очевидна.4. Хорошо, добавив КОНЕЦ перед в RetVal, я получаю следующую ошибку при запуске: ORA-06550: строка 12, столбец 2: PL / SQL: ORA-00936: отсутствующее выражение
Ответ №1:
Я думаю, что этот запрос является более простой версией того, что вы хотите.
select
CASE
WHEN T4_VALIDATION_OUTCOME = 'Pass'
AND T7_VALIDATION_OUTCOME = 'Pass'
THEN 0
ELSE 1
END into RetVal
FROM TABLE
WHERE LOAD_KEY = (select MAX(LOAD_KEY) from TABLE);
Я предполагаю, что LOAD_KEY является уникальным столбцом — в противном случае это может привести к выбору более одной строки, что вызовет исключение.