Конкат внезапно бросает ошибку

После выполнения этого запроса (который отлично работал, прежде чем мы обновили нашу версию Oracle до g11):

SELECT to_char(wm_concat(PRODUCT_CATEGORY_CODE) )  AS COMB , 
       case when   instr( to_char(wm_concat(PRODUCT_CATEGORY_CODE) ), 'T_V') > 0  then 1 else 0  end +
       case when   instr( to_char(wm_concat(PRODUCT_CATEGORY_CODE) ), 'INT') > 0  then 1 else 0  end +
       case when   instr( to_char(wm_concat(PRODUCT_CATEGORY_CODE) ), 'TEL') > 0  then 1 else 0  end category_count 
       ....
FROM ....     

Фактический запрос является огромным и беспорядочным, мне удалось обнаружить то, что вызывает эту ошибку ( COMB,CATEGORY_COUNTиз запроса выше).

PRODUCT_CATEGORY_CODEесть тип VARCHAR2(3).

Я получаю сообщение об ошибке:

ORA-22922: нет значения LOB

Что вызывает эту ошибку и почему внезапное изменение после обновления?

Благодарю.

sql,oracle,

1

Ответов: 2


1 принят

Ниже моя попытка ответить, почему это произошло. На этот ответ есть несколько уровней, и по мере их углубления они становятся более умозрительными.

Почему мой запрос перестает работать?

Не удалось выполнить запрос, поскольку WM_CONCATэто недокументированная функция, недоступная в вашей новой базе данных.

Почему он больше не доступен?

WM_CONCATбыл использован внутренне как часть Oracle Workspace Manager (OWM). OWM является необязательным компонентом в 10g и 11g. Некоторые базы данных, возможно, были установлены без него, или администратор баз данных, возможно, удалил его позже. Этот вариант не существует для Express Edition. И эта функция вообще не существует в Oracle 12c.

Давным-давно кто-то в Интернете обнаружил эту функцию, считал ее полезной, сказал людям, и идея распространилась. Но Oracle никогда не говорил людям использовать его и никогда не гарантировал, что он ни разу не исчезнет. Этот день настал.

Но ... почему это произойдет с такой популярной особенностью ?!

Это проблема отношения с корпорацией Oracle.

Oracle не ценит функции, которые явно полезны, если они также теоретически не нужны. Они подождали двадцать лет, чтобы создать удобную, официальную функцию, чтобы делать то, что каждый разработчик баз данных в мире делает все время.

Вам никогда не приходилось использовать WM_CONCAT. Вы могли бы использовать хаки с XMLAgg, Oracle Data Cartridge, MODEL, CAST(COLLECT...и т.д. Это были все ужасные решения, но они сделали работу, так почему бы вам не ленивые разработчики просто сделать ваше уникальное решение каждый раз , когда вам нужно решить общую проблему?

Такое отношение сводит меня с ума, и я вижу то же самое с простыми задачами, такими как разделение строк и типы Boolean.

Для продукта, который имеет подсказки, вы бы подумали, что разработчики Oracle лучше оценили бы идею добавления полезных функций, даже если они, возможно, не теоретически необходимы.


1

Мне удалось решить эту проблему, используя LISTAGG()вместо WM_CONCAT():

SELECT to_char(LISTAGG(PRODUCT_CATEGORY_CODE,',') WITHIN GROUP(ORDER BY PRODUCT_CATEGORY_CODE))  AS COMB,
       case when   instr( to_char(LISTAGG(PRODUCT_CATEGORY_CODE,',') WITHIN GROUP(ORDER BY PRODUCT_CATEGORY_CODE)), 'T_V') > 0  then 1 else 0  end +
       case when   instr( to_char(LISTAGG(PRODUCT_CATEGORY_CODE,',') WITHIN GROUP(ORDER BY PRODUCT_CATEGORY_CODE)), 'INT') > 0  then 1 else 0  end +
       case when   instr( to_char(LISTAGG(PRODUCT_CATEGORY_CODE,',') WITHIN GROUP(ORDER BY PRODUCT_CATEGORY_CODE)), 'TEL') > 0  then 1 else 0  end   category_count
FROM ...

Но я до сих пор не понял ПОЧЕМУ - Вопрос остается.

SQL, Oracle,
Похожие вопросы