Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 странный глюк ORA-30004: при использовании функции SYS_CONNECT_BY_PATH невозможно получить  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 52749
WITH T AS
(
SELECT 7960 ID, 5529 parent_id, 'Груз. ******. ППП- ********** д/о 7 дней'  NAME FROM dual UNION ALL
SELECT 7961 ID, 7960 parent_id, '*****'                                     NAME FROM dual UNION ALL
SELECT 7962 ID, 7961 parent_id, '******** наставник **-1'                   NAME FROM dual UNION ALL
SELECT 5530 ID, 5529 parent_id, 'Т**** ************ ********'               NAME FROM dual UNION ALL
SELECT 5531 ID, 5530 parent_id, '**** 2'                                    NAME FROM dual UNION ALL
SELECT 5536 ID, 5531 parent_id, 'ЗАКРЫТА----'                               NAME FROM dual
)
SELECT T.*,
       SYS_CONNECT_BY_PATH(NAME, '->')
  FROM T
 start WITH parent_id = 5529
connect BY parent_id = PRIOR ID
ORDER SIBLINGS BY parent_id NULLS FIRST,        NAME

ORA-30004: при использовании функции SYS_CONNECT_BY_PATH невозможно получить разделитель как часть значения столбца

если убрать сортировку или просто SIBLINGS
или в слове "ЗАКРЫТА----" убрать последний минус
или в слове "Т**** ************ ********" заменить букву Т на звездочку
-- то начинает работать


Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
NLS_SORT=RUSSIAN
5 ноя 19, 19:22    [22010213]     Ответить | Цитировать Сообщить модератору
 Re: странный глюк ORA-30004: при использовании функции SYS_CONNECT_BY_PATH невозможно получить  [new]
Maxim Demenko
Member

Откуда: Munich, Germany
Сообщений: 921
andreymx,
Похоже чето NLS зависимое.
на моей базе (в смысле - клиенте) NLS_LANG=AMERICAN_AMERICA.AL32UTF8 если че

+ не знаю, у меня работает
SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE    11.2.0.4.0      Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

SQL>
SQL> alter session set NLS_SORT=RUSSIAN;

Session altered.

SQL>
SQL> WITH T AS
  2  (
  3  SELECT 7960 ID, 5529 parent_id, 'Груз. ******. ППП- ********** д/о 7 дней'  NAME FROM dual UNION ALL
  4  SELECT 7961 ID, 7960 parent_id, '*****'                                     NAME FROM dual UNION ALL
  5  SELECT 7962 ID, 7961 parent_id, '******** наставник **-1'            NAME FROM dual UNION ALL
  6  SELECT 5530 ID, 5529 parent_id, 'Т**** ************ ********'                NAME FROM dual UNION ALL
  7  SELECT 5531 ID, 5530 parent_id, '**** 2'                                    NAME FROM dual UNION ALL
  8  SELECT 5536 ID, 5531 parent_id, 'ЗАКРЫТА----'                              NAME FROM dual
  9  )
 10  SELECT T.*,
 11         SYS_CONNECT_BY_PATH(NAME, '->')
 12    FROM T
 13   start WITH parent_id = 5529
 14  connect BY parent_id = PRIOR ID
 15  ORDER SIBLINGS BY parent_id NULLS FIRST,        NAME
 16  ;

        ID  PARENT_ID NAME
---------- ---------- --------------------
SYS_CONNECT_BY_PATH(NAME,'->')
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      7960       5529 Груз. ******. ППП- *
                      ********* д/о 7 дней
->Груз. ******. ППП- ********** д/о 7 дней

      7961       7960 *****
->Груз. ******. ППП- ********** д/о 7 дней->*****

      7962       7961 ******** наставник *
                      *-1
->Груз. ******. ППП- ********** д/о 7 дней->*****->******** наставник **-1

      5530       5529 Т**** ************ *
                      *******
->Т**** ************ ********

      5531       5530 **** 2
->Т**** ************ ********->**** 2

      5536       5531 ЗАКРЫТА----
->Т**** ************ ********->**** 2->ЗАКРЫТА----


6 rows selected.
5 ноя 19, 20:13    [22010228]     Ответить | Цитировать Сообщить модератору
 Re: странный глюк ORA-30004: при использовании функции SYS_CONNECT_BY_PATH невозможно получить  [new]
Maxim Demenko
Member

Откуда: Munich, Germany
Сообщений: 921
Еще есть Bug 6392572 якобы пофикшеный в 11.2.0.2, вроде как workaround - материализовать
5 ноя 19, 20:34    [22010232]     Ответить | Цитировать Сообщить модератору
 Re: странный глюк ORA-30004: при использовании функции SYS_CONNECT_BY_PATH невозможно получить  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29406
andreymx
NLS_SORT=RUSSIAN
На 1251 падает, на utf8 - нет. На разных версиях. Вывод напрашивается.
5 ноя 19, 22:23    [22010265]     Ответить | Цитировать Сообщить модератору
 Re: странный глюк ORA-30004: при использовании функции SYS_CONNECT_BY_PATH невозможно получить  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 52749
пришлось юзера попросить убрать эти минусы
т.к. ему срочно, а запрос прописан в 4 разных прогах
и все ему оказались нужны сразу
5 ноя 19, 22:26    [22010266]     Ответить | Цитировать Сообщить модератору
 Re: странный глюк ORA-30004: при использовании функции SYS_CONNECT_BY_PATH невозможно получить  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29406
andreymx
срочн
Ну так поменял поменял бы NLS_SORT
5 ноя 19, 22:33    [22010269]     Ответить | Цитировать Сообщить модератору
 Re: странный глюк ORA-30004: при использовании функции SYS_CONNECT_BY_PATH невозможно получить  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 52749
Elic
andreymx
срочн
Ну так поменял поменял бы NLS_SORT
менять в сессии? не так просто
а запрос я и так уже переписал
5 ноя 19, 23:18    [22010289]     Ответить | Цитировать Сообщить модератору
 Re: странный глюк ORA-30004: при использовании функции SYS_CONNECT_BY_PATH невозможно получить  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29406
andreymx
Elic
Ну так поменял поменял бы NLS_SORT
менять в сессии? не так просто
Logon trigger. Но со своими толпами замшелых тараканов разбираться тебе самому.
6 ноя 19, 07:45    [22010360]     Ответить | Цитировать Сообщить модератору
 Re: странный глюк ORA-30004: при использовании функции SYS_CONNECT_BY_PATH невозможно получить  [new]
-2-
Member

Откуда:
Сообщений: 14995
andreymx
SYS_CONNECT_BY_PATH(NAME, '->')
В доке параметр обозначен как char, что намекает на единственность символа в разделителе. Использование минуса одновременно в разделителе и в данных - на свой страх и риск.
6 ноя 19, 08:01    [22010368]     Ответить | Цитировать Сообщить модератору
 Re: странный глюк ORA-30004: при использовании функции SYS_CONNECT_BY_PATH невозможно получить  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29406
-2-
В доке параметр обозначен как char, что намекает на единственность символа в разделителе.
Интересное наблюдение. Потенциально рушит многие использования SYS_CONNECT_BY_PATH :|
6 ноя 19, 08:12    [22010370]     Ответить | Цитировать Сообщить модератору
 Re: странный глюк ORA-30004: при использовании функции SYS_CONNECT_BY_PATH невозможно получить  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 52749
SYS_CONNECT_BY_PATH
Syntax

Description of sys_connect_by_path.gif follows
Description of the illustration sys_connect_by_path.gif

Purpose

SYS_CONNECT_BY_PATH is valid only in hierarchical queries. It returns the path of a column value from root to node, with column values separated by char for each row returned by CONNECT BY condition.

Both column and char can be any of the datatypes CHAR, VARCHAR2, NCHAR, or NVARCHAR2. The string returned is of VARCHAR2 datatype and is in the same character set as column.


Намёк есть, но явного ограничения на длину не нашёл
6 ноя 19, 08:16    [22010371]     Ответить | Цитировать Сообщить модератору
 Re: странный глюк ORA-30004: при использовании функции SYS_CONNECT_BY_PATH невозможно получить  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 52749
Сделал перед вызовом функции реплейс минуса в chr(1), а после обратно в минус
6 ноя 19, 08:17    [22010372]     Ответить | Цитировать Сообщить модератору
 Re: странный глюк ORA-30004: при использовании функции SYS_CONNECT_BY_PATH невозможно получить  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 52749
Щаз подумал
Лучше, наверное, в качестве чара передавать chr(1), а затем менять его на ->
6 ноя 19, 08:24    [22010374]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить