Оператор обращения PLSQL, сравнивающий два столбца

#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 является уникальным столбцом — в противном случае это может привести к выбору более одной строки, что вызовет исключение.