Функция Oracle для выбора нескольких строк в одной строке не работает - PullRequest
0 голосов
/ 01 апреля 2019

Я загружаю файл в промежуточную запись, используя Application Engine. когда в BU, Deptid и т. д. когда-либо есть пробелы ... Я должен захватить все пустые столбцы и обновить текстовое поле ошибки этими значениями.

UPDATE SYSADM.PS_VI_EMP_TS SET ERR_TEXT = ВЫБРАТЬ ОШИБКУ ОТ (ВЫБРАТЬ * ОТ ( ВЫБЕРИТЕ СЛУЧАЙ, КОГДА BUSINESS_UNIT = '' THEN 'BUSINESS_UNIT НУЛЬ' 'ELSE' 'ОКОНЧАТЬ ОШИБКУ ОТ SYSADM.PS_VI_EMP_TS ГДЕ USERID =' JCOOPER 'И ДЕЙСТВИЕ =' E 'И PROCESS_INSTANCE =' 7852429 ' UNION ВЫБЕРИТЕ ДЕЛО, КОГДА DEPTID = '' THEN 'DEPTID НЕДЕЙСТВИТЕЛЬНО' ELSE '' КОНЕЦ ОШИБКИ ОТ SYSADM.PS_VI_EMP_TS WHERE USERID = 'JCOOPER' И ДЕЙСТВИЕ = 'E' И PROCESS_INSTANCE = '9852429' UNION ВЫБЕРИТЕ СЛУЧАЙ, КОГДА PROJECT_ID = '' THEN 'PROJECT_ID НУЛЬ' 'ELSE' 'ОКОНЧАТЬ ОШИБКУ ОТ SYSADM.PS_VI_EMP_TS ГДЕ USERID =' JCOOPER 'И ДЕЙСТВИЕ =' E 'И ПРОЦЕСС_INSTANCE =' 9852429 ' )) ГДЕ ОШИБКА <> '' ГДЕ USERID = 'JCOOPER' И ДЕЙСТВИЕ = 'E' И PROCESS_INSTANCE = '9852429'

Результат приведенного выше скрипта приведен ниже.

ERROR

BUSINESS_UNIT NULL DEPTID NULL

Я хочу получить результат, как показано ниже.

ERROR

BUSINESS_UNIT NULL, DEPTID NULL

Я использую функцию ListAgg, но сталкиваюсь с ошибками, как показано ниже. Любая помощь будет очень полезна.

SELECT LISTAGG(BUSINESS_UNIT, ';') WITHIN GROUP(ORDER BY USERID) 
FROM SYSADM.PS_VI_EMP_TS WHERE USERID='JCOOPER'
GROUP BY BUSINESS_UNIT

В случае ошибки:

ORA-00923: FROM keyword not found where expected
00923. 00000 -  "FROM keyword not found where expected"
*Cause:    
*Action:
Error at Line: 47 Column: 43

1 Ответ

0 голосов
/ 02 апреля 2019

Вы слишком усложнили вещи.Вам не нужны два союза и listagg вообще.Простое использование конкатенации case... when, напишите ваш выбор как здесь:

select case business_unit when ' ' then 'BUSINESS_UNIT IS NULL; ' end ||
       case deptid        when ' ' then 'DEPTID IS NULL; '        end ||
       case project_id    when ' ' then 'PROJECT_ID IS NULL; '    end as error
  from ps_vi_emp_ts 
  where userid = 'JCOOPER' and action = 'E' and process_instance = '9852429' 

демо

Если вашТаблица имеет первичный ключ, а затем использовать его для обновления.В противном случае вы можете использовать merge с rowid.Или сделайте это так, как вы, если это сработало для вас, особенно если существует только один критерий соответствия строки.

...