powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не работает условие IS [NOT] NULL
25 сообщений из 28, страница 1 из 2
Не работает условие IS [NOT] NULL
    #39985265
SilentMage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему может не работать условие "is not null" в последней строчке?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> select aid, aref, acod, bcod, id, nvl(id,0)
  2    from (select dept_id aid, dept_ref aref, dept_code acod,
  3                 df_card_id id, card_code bcod
  4            from hr_dept, df_card
  5           where dept_code = card_code(+)
  6          start with dept_id = 5744
  7          connect by prior dept_ref = dept_id)
  8   where id is not null;


Код: plaintext
1.
2.
3.
4.
5.
6.
       AID       AREF ACOD       BCOD           ID  NVL(ID,0)
---------- ---------- ---------- ------ ---------- ----------
      5744       5743 300701                                0
      5743       5494 3007       3007           37         37
      5494       5493 30         30              7          7
      5493       3413 У30                                   0
      3413            С01                                   0

"id is null", соответственно, возвращает 0 строк.
однако, условие nvl(id,0)<>0 работает!
так же работает без connect-by (подставлял "dept_id in (5744,5743,5494,5493,3413)" )

тестовый запрос работает нормально:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
with a as
(select 3413 aid, 'С01' acod, null aref from dual
 union all
 select 5493 aid, 'У30' acod, 3413 aref from dual
 union all
 select 5494 aid, '30' acod, 5493 aref from dual
 union all
 select 5743 aid, '3007' acod, 5494 aref from dual
 union all
 select 5744 aid, '300701' acod, 5743 aref from dual
), 
b as (
 select 7 id, '30' bcod from dual
 union all
 select 37 id, '3007' bcod from dual
)
select aid, aref, acod, bcod, id, nvl2(id,1,0)
  from (
select aid, aref, acod, bcod, id
  from a, b
 where acod= bcod(+)
 start with aid= 5744
 connect by prior aref= aid
) 
where id is not null


видимо, проблема с конкретными таблицами?
но что это может быть, даже представить не могу...
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985266
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SilentMage,

План запроса в студию. Ну и посмотреть в сторону no_query_transformation/materialize
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985269
SilentMage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
--------------------------------------------------------------------------------------------------
| Id   | Operation                         | Name               | Rows | Bytes | Cost | Time     |
--------------------------------------------------------------------------------------------------
|    0 | SELECT STATEMENT                  |                    |    2 |   102 |   10 | 00:00:01 |
|    1 |   VIEW                            |                    |    2 |   102 |   10 | 00:00:01 |
|  * 2 |    CONNECT BY WITH FILTERING      |                    |      |       |      |          |
|    3 |     NESTED LOOPS OUTER            |                    |    1 |    23 |    3 | 00:00:01 |
|    4 |      TABLE ACCESS BY INDEX ROWID  | HR_DEPT            |    1 |    14 |    2 | 00:00:01 |
|  * 5 |       INDEX UNIQUE SCAN           | PK_HR_DEPT         |    1 |       |    1 | 00:00:01 |
|    6 |      TABLE ACCESS BY INDEX ROWID  | DF_CARD            |    1 |     9 |    1 | 00:00:01 |
|  * 7 |       INDEX UNIQUE SCAN           | DF_CARD__CODE_UNIQ |    1 |       |    0 | 00:00:01 |
|    8 |     NESTED LOOPS OUTER            |                    |    1 |    36 |    5 | 00:00:01 |
|    9 |      NESTED LOOPS                 |                    |    1 |    27 |    4 | 00:00:01 |
|   10 |       CONNECT BY PUMP             |                    |      |       |      |          |
|   11 |       TABLE ACCESS BY INDEX ROWID | HR_DEPT            |    1 |    14 |    1 | 00:00:01 |
| * 12 |        INDEX UNIQUE SCAN          | PK_HR_DEPT         |    1 |       |    0 | 00:00:01 |
|   13 |      TABLE ACCESS BY INDEX ROWID  | DF_CARD            |    1 |     9 |    1 | 00:00:01 |
| * 14 |       INDEX UNIQUE SCAN           | DF_CARD__CODE_UNIQ |    1 |       |    0 | 00:00:01 |
--------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
------------------------------------------
* 2 - access("DEPT_ID"=PRIOR "DEPT_REF")
* 5 - access("DEPT_ID"=5744)
* 7 - access("DEPT_CODE"="CARD_CODE"(+))
* 12 - access("connect$_by$_pump$_004"."prior dept_ref "="DEPT_ID")
* 14 - access("DEPT_CODE"="CARD_CODE"(+))
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985274
SilentMage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хинты никак не влияют на результат
статистика таблиц и индексов актуальная
PS
Oracle 11.2.0.4.0
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985288
SilentMage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
создал тестовую таблицу
Код: plsql
1.
2.
3.
4.
5.
CREATE TABLE DF_CARD1
(
  DF_CARD_ID  NUMBER,
  CARD_CODE   VARCHAR2(4 CHAR)
)


и заполнил теми двумя строками: условие в запросе работает
ставлю NOT NULL на DF_CARD_ID: условие снова не работает!
в плане при этом появляется и исчезает сноска:
* 1 - filter("ID" IS NOT NULL)
т.е. оракл почему-то игнорирует это условие?
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985293
artas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SilentMage, ищите ноту

Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production



AID AREF ACOD BCOD ID NVL2(ID,1,0)
---------- ---------- ------ ---- ---------- ------------
5743 5494 3007 3007 37 1
5494 5493 30 30 7 1
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985294
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SilentMage,

Причина бага ясна - оптимизатор считает, что то поле не может быть null, но чтобы тебе помочь дай полный минимальный тест кейс показывающий баг. Самому мне лень ваять.
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985300
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Впрочем уже понятно:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
create table a as
(select 3413 aid, 'С01' acod, null aref from dual
 union all
 select 5493 aid, 'У30' acod, 3413 aref from dual
 union all
 select 5494 aid, '30' acod, 5493 aref from dual
 union all
 select 5743 aid, '3007' acod, 5494 aref from dual
 union all
 select 5744 aid, '300701' acod, 5743 aref from dual
)
/
create table b as (
 select 7 id, '30' bcod from dual
 union all
 select 37 id, '3007' bcod from dual
)
/
alter table b modify id not null;

select aid, aref, acod, bcod, id, nvl2(id,1,0)
  from (
select aid, aref, acod, bcod, id
  from a, b
 where acod= bcod(+)
 start with aid= 5744
 connect by prior aref= aid
) 
where id is not null;

       AID       AREF ACOD   BCOD         ID NVL2(ID,1,0)
---------- ---------- ------ ---- ---------- ------------
      5744       5743 300701                            0
      5743       5494 3007   3007         37            1
      5494       5493 30     30            7            1
      5493       3413 У30                               0
      3413            С01                               0

select aid, aref, acod, bcod, id, nvl2(id,1,0)
  from (
   select
      aid, aref, acod, bcod, id
     from a, b
    where acod= bcod(+)
    start with aid= 5744
    connect by prior aref= aid
) 
where id+0 is not null;

       AID       AREF ACOD   BCOD         ID NVL2(ID,1,0)
---------- ---------- ------ ---- ---------- ------------
      5743       5494 3007   3007         37            1
      5494       5493 30     30            7            1

...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985301
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SilentMage
хинты никак не влияют на результат
статистика таблиц и индексов актуальная
PS
Oracle 11.2.0.4.0


и тут?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with t1 as (
    select --+ materialize
      dept_id aid, dept_ref aref, dept_code acod, df_card_id id, card_code bcod
      from hr_dept, df_card
     where dept_code = card_code(+)
start with dept_id = 5744
connect by prior dept_ref = dept_id
)
select aid, aref, acod, bcod, id, nvl(id,0)
  from t1
 where id is not null;
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985306
SilentMage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
orawish,

да, в таком виде тоже не работает, что с хинтом, что без...

xtender,

и вывод? очередной глюк версии 11.2.0.4 ?

PS: а что же он "+0" не оптимизировал? это еще более бесполезно должно выглядеть)))
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985307
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
orawish,

да, материализация тут не помогает. "Ненужные" предикаты CBO тупо удаляет и нет (по-крайней мере известных мне) никаких хинтов и параметров, позволяющих это отключить.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
with t as (
select--+ materialize
  aid, aref, acod, bcod, id
  from a, b
 where acod= bcod(+)
 start with aid= 5744
 connect by prior aref= aid
)
select aid, aref, acod, bcod, id, nvl2(id,1,0)
  from t
where id is not null;


       AID       AREF ACOD   BCOD         ID NVL2(ID,1,0)
---------- ---------- ------ ---- ---------- ------------
      5494       5493 30     30            7            1
      5493       3413 У30                               0
      3413            С01                               0
      5744       5743 300701                            0
      5743       5494 3007   3007         37            1

SQL_ID  7j24w64ahuu4f, child number 0
-------------------------------------
with t as ( select--+ materialize   aid, aref, acod, bcod, id   from a,
b  where acod= bcod(+)  start with aid= 5744  connect by prior aref=
aid ) select aid, aref, acod, bcod, id, nvl2(id,1,0)   from t where id
is not null

Plan hash value: 466269960

---------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                 | Name                      | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |  OMem |  1Mem | Used-Mem |
---------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                          |                           |        |       |     9 (100)|          |       |       |          |
|   1 |  TEMP TABLE TRANSFORMATION                |                           |        |       |            |          |       |       |          |
|   2 |   LOAD AS SELECT (CURSOR DURATION MEMORY) | SYS_TEMP_0FD9DF5F7_17A84A |        |       |            |          |  1024 |  1024 |          |
|*  3 |    CONNECT BY NO FILTERING WITH START-WITH|                           |        |       |            |          |  2048 |  2048 | 2048  (0)|
|*  4 |     HASH JOIN OUTER                       |                           |      5 |    95 |     6   (0)| 00:00:01 |  1651K|  1651K| 1278K (0)|
|   5 |      TABLE ACCESS FULL                    | A                         |      5 |    60 |     3   (0)| 00:00:01 |       |       |          |
|   6 |      TABLE ACCESS FULL                    | B                         |      2 |    14 |     3   (0)| 00:00:01 |       |       |          |
|   7 |   VIEW                                    |                           |      2 |    96 |     2   (0)| 00:00:01 |       |       |          |
|   8 |    TABLE ACCESS FULL                      | SYS_TEMP_0FD9DF5F7_17A84A |      2 |    40 |     2   (0)| 00:00:01 |       |       |          |
---------------------------------------------------------------------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$5
   2 - SEL$1
   4 - SEL$2
   5 - SEL$2        / A@SEL$2
   6 - SEL$2        / B@SEL$2
   7 - SEL$D67CB2D2 / T@SEL$5
   8 - SEL$D67CB2D2 / T1@SEL$D67CB2D2

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("AID"=PRIOR NULL)
       filter("AID"=5744)
   4 - access("ACOD"="BCOD")

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - "AID"[NUMBER,22], "AREF"[NUMBER,22], "ACOD"[VARCHAR2,6], "BCOD"[VARCHAR2,4], "ID"[NUMBER,22]
   2 - SYSDEF[4], SYSDEF[0], SYSDEF[1], SYSDEF[120], SYSDEF[0]
   3 - "AID"[NUMBER,22], "AREF"[NUMBER,22], "BCOD"[VARCHAR2,4], "ACOD"[VARCHAR2,6], "ID"[NUMBER,22], PRIOR NULL[22], LEVEL[4]
   4 - (#keys=1) "ACOD"[VARCHAR2,6], "BCOD"[VARCHAR2,4], "AID"[NUMBER,22], "AREF"[NUMBER,22], "ID"[NUMBER,22]
   5 - (rowset=256) "AID"[NUMBER,22], "ACOD"[VARCHAR2,6], "AREF"[NUMBER,22]
   6 - "ID"[NUMBER,22], "BCOD"[VARCHAR2,4]
   7 - "AID"[NUMBER,22], "AREF"[NUMBER,22], "ACOD"[VARCHAR2,6], "BCOD"[VARCHAR2,4], "ID"[NUMBER,22]
   8 - "C0"[NUMBER,22], "C1"[NUMBER,22], "C2"[VARCHAR2,6], "C3"[VARCHAR2,4], "C4"[NUMBER,22]

...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985309
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SilentMage
и вывод? очередной глюк версии 11.2.0.4 ?
увы, повторяется и на 12, 18, но исправлено в 19, так что ищите баг/запрашивайте фикс на My Oracle Support
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985312
SilentMage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо всем! быстро разобрались

за 15+ лет работы с ораклом впервые такое вижу)))
проблему-то я сразу решил, варианты есть...
просто интересно стало
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985448
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SilentMage
спасибо всем! быстро разобрались

за 15+ лет работы с ораклом впервые такое вижу)))
проблему-то я сразу решил, варианты есть...
просто интересно стало
встречал ошибки в таких запросах на вполне конкретном наборе данных
Почти день убил, пока понял, что глюк
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985657
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
увы, повторяется и на 12, 18, но исправлено в 19, так что ищите баг/запрашивайте фикс на My Oracle Support


А вот у меня не повторяется.

12C:


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
SQL> select banner from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production
CORE    12.2.0.1.0      Production
TNS for 64-bit Windows: Version 12.2.0.1.0 - Production
NLSRTL Version 12.2.0.1.0 - Production

SQL> create table a as
  2  (select 3413 aid, 'С01' acod, null aref from dual
  3   union all
  4   select 5493 aid, 'У30' acod, 3413 aref from dual
  5   union all
  6   select 5494 aid, '30' acod, 5493 aref from dual
  7   union all
  8   select 5743 aid, '3007' acod, 5494 aref from dual
  9   union all
 10   select 5744 aid, '300701' acod, 5743 aref from dual
 11  )
 12  /

Table created.

SQL> create table b as (
  2   select 7 id, '30' bcod from dual
  3   union all
  4   select 37 id, '3007' bcod from dual
  5  )
  6  /

Table created.

SQL> alter table b modify id not null;

Table altered.

SQL>
SQL> select aid, aref, acod, bcod, id, nvl2(id,1,0)
  2    from (
  3  select aid, aref, acod, bcod, id
  4    from a, b
  5   where acod= bcod(+)
  6   start with aid= 5744
  7   connect by prior aref= aid
  8  )
  9  where id is not null;

       AID       AREF ACOD   BCOD         ID NVL2(ID,1,0)
---------- ---------- ------ ---- ---------- ------------
      5743       5494 3007   3007         37            1
      5494       5493 30     30            7            1

SQL> select aid, aref, acod, bcod, id, nvl2(id,1,0)
  2    from (
  3     select
  4        aid, aref, acod, bcod, id
  5       from a, b
  6      where acod= bcod(+)
  7      start with aid= 5744
  8      connect by prior aref= aid
  9  )
 10  where id+0 is not null;

       AID       AREF ACOD   BCOD         ID NVL2(ID,1,0)
---------- ---------- ------ ---- ---------- ------------
      5743       5494 3007   3007         37            1
      5494       5493 30     30            7            1

SQL>




18C:


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
SQL> select banner from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production

SQL> create table a as
  2  (select 3413 aid, 'С01' acod, null aref from dual
  3   union all
  4   select 5493 aid, 'У30' acod, 3413 aref from dual
  5   union all
  6   select 5494 aid, '30' acod, 5493 aref from dual
  7   union all
  8   select 5743 aid, '3007' acod, 5494 aref from dual
  9   union all
 10   select 5744 aid, '300701' acod, 5743 aref from dual
 11  )
 12  /

Table created.

SQL> create table b as (
  2   select 7 id, '30' bcod from dual
  3   union all
  4   select 37 id, '3007' bcod from dual
  5  )
  6  /

Table created.

SQL> alter table b modify id not null;

Table altered.

SQL>
SQL> select aid, aref, acod, bcod, id, nvl2(id,1,0)
  2    from (
  3  select aid, aref, acod, bcod, id
  4    from a, b
  5   where acod= bcod(+)
  6   start with aid= 5744
  7   connect by prior aref= aid
  8  )
  9  where id is not null;

       AID       AREF ACOD   BCOD         ID NVL2(ID,1,0)
---------- ---------- ------ ---- ---------- ------------
      5743       5494 3007   3007         37            1
      5494       5493 30     30            7            1

SQL> select aid, aref, acod, bcod, id, nvl2(id,1,0)
  2    from (
  3     select
  4        aid, aref, acod, bcod, id
  5       from a, b
  6      where acod= bcod(+)
  7      start with aid= 5744
  8      connect by prior aref= aid
  9  )
 10  where id+0 is not null;

       AID       AREF ACOD   BCOD         ID NVL2(ID,1,0)
---------- ---------- ------ ---- ---------- ------------
      5743       5494 3007   3007         37            1
      5494       5493 30     30            7            1

SQL>



19C:


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
SQL> select banner from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

SQL> create table a as
  2  (select 3413 aid, 'С01' acod, null aref from dual
  3   union all
  4   select 5493 aid, 'У30' acod, 3413 aref from dual
  5   union all
  6   select 5494 aid, '30' acod, 5493 aref from dual
  7   union all
  8   select 5743 aid, '3007' acod, 5494 aref from dual
  9   union all
 10   select 5744 aid, '300701' acod, 5743 aref from dual
 11  )
 12  /

Table created.

SQL> create table b as (
  2   select 7 id, '30' bcod from dual
  3   union all
  4   select 37 id, '3007' bcod from dual
  5  )
  6  /

Table created.

SQL> alter table b modify id not null;

Table altered.

SQL>
SQL> select aid, aref, acod, bcod, id, nvl2(id,1,0)
  2    from (
  3  select aid, aref, acod, bcod, id
  4    from a, b
  5   where acod= bcod(+)
  6   start with aid= 5744
  7   connect by prior aref= aid
  8  )
  9  where id is not null;

       AID       AREF ACOD   BCOD         ID NVL2(ID,1,0)
---------- ---------- ------ ---- ---------- ------------
      5743       5494 3007   3007         37            1
      5494       5493 30     30            7            1

SQL> select aid, aref, acod, bcod, id, nvl2(id,1,0)
  2    from (
  3     select
  4        aid, aref, acod, bcod, id
  5       from a, b
  6      where acod= bcod(+)
  7      start with aid= 5744
  8      connect by prior aref= aid
  9  )
 10  where id+0 is not null;

       AID       AREF ACOD   BCOD         ID NVL2(ID,1,0)
---------- ---------- ------ ---- ---------- ------------
      5743       5494 3007   3007         37            1
      5494       5493 30     30            7            1

SQL>



SY.
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985664
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SY
12C, 18C
здорово, а какие патчи стоят?
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985720
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
здорово, а какие патчи стоят?


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> SELECT BANNER FROM V$VERSION;

BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production
CORE    12.2.0.1.0      Production
TNS for 64-bit Windows: Version 12.2.0.1.0 - Production
NLSRTL Version 12.2.0.1.0 - Production

SQL> SELECT * FROM DBA_REGISTRY_HISTORY;

ACTION_TIME ACTION    NAMESPACE VERSION  ID COMMENTS
----------- --------- --------- -------- -- ----------------------------------------
            BOOTSTRAP DATAPATCH 12.2.0.1    RDBMS_12.2.0.1.0_WINDOWS.X64_170210.4

SQL> SELECT * FROM DBA_REGISTRY_SQLPATCH;

no rows selected

SQL>




Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
SQL> SELECT BANNER FROM V$VERSION;

BANNER
--------------------------------------------------------------------------------
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production

SQL> SELECT ACTION,VERSION,COMMENTS FROM DBA_REGISTRY_HISTORY ORDER BY ACTION_TIME;

ACTION     VERSION                COMMENTS
---------- ---------------------- ---------------------------------------------------------------------------
jvmpsu.sql 18.3.0.0.180717OJVMRU  RAN jvmpsu.sql
APPLY      18.3.0.0.180717OJVMRU  OJVM RU post-install
jvmpsu.sql 18.7.0.0.190716OJVMRU  RAN jvmpsu.sql
ROLLBACK   18.7.0.0.190716OJVMRU  OJVM RU post-deinstall
RU_APPLY   18.0.0.0.0             Patch applied from 18.3.0.0.0 to 18.7.0.0.0: Release_Update - 190624192000
jvmpsu.sql 18.7.0.0.190716OJVMRU  RAN jvmpsu.sql
APPLY      18.7.0.0.190716OJVMRU  OJVM RU post-install
jvmpsu.sql 18.8.0.0.191015OJVMRU  RAN jvmpsu.sql
ROLLBACK   18.8.0.0.191015OJVMRU  OJVM RU post-deinstall
RU_APPLY   18.0.0.0.0             Patch applied from 18.7.0.0.0 to 18.8.0.0.0: Release_Update - 190903212300
jvmpsu.sql 18.8.0.0.191015OJVMRU  RAN jvmpsu.sql
APPLY      18.8.0.0.191015OJVMRU  OJVM RU post-install
jvmpsu.sql 18.9.0.0.200114OJVMRU  RAN jvmpsu.sql
ROLLBACK   18.9.0.0.200114OJVMRU  OJVM RU post-deinstall
RU_APPLY   18.0.0.0.0             Patch applied from 18.8.0.0.0 to 18.9.0.0.0: Release_Update - 191210124400
jvmpsu.sql 18.9.0.0.200114OJVMRU  RAN jvmpsu.sql
APPLY      18.9.0.0.200114OJVMRU  OJVM RU post-install
jvmpsu.sql 18.10.0.0.200414OJVMRU RAN jvmpsu.sql
ROLLBACK   18.10.0.0.200414OJVMRU OJVM RU post-deinstall
jvmpsu.sql 18.10.0.0.200414OJVMRU RAN jvmpsu.sql
APPLY      18.10.0.0.200414OJVMRU OJVM RU post-install
RU_APPLY   18.0.0.0.0             Patch applied from 18.9.0.0.0 to 18.10.0.0.0: Release_Update - 200326084600
BOOTSTRAP  18                     RDBMS_18.10.0.0.0DBRU_LINUX.X64_200325

23 rows selected.

SQL>



SY.
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985722
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SY
Код: plsql
1.
 RDBMS_12.2.0.1.0_WINDOWS.X64_170210.4

странно как-то
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
SQL> SELECT * FROM DBA_REGISTRY_HISTORY;

ACTION_TIME                 ACTION          NAMESPACE  VERSION             ID COMMENTS
--------------------------- --------------- ---------- ----------- ---------- -------------------------------------
                            BOOTSTRAP       DATAPATCH  12.2.0.1               RDBMS_12.2.0.1.0_WINDOWS.X64_170210.4
2017-09-15 15:46:17.010000  VIEW INVALIDATE                           8289601 view invalidation
2017-09-15 15:51:16.397000  UPGRADE         SERVER     12.2.0.1.0             Upgraded from 12.1.0.2.0

SQL> @test/null/null.sql
SQL> create table a as
  2  (select 3413 aid, 'С01' acod, null aref from dual
  3   union all
  4   select 5493 aid, 'У30' acod, 3413 aref from dual
  5   union all
  6   select 5494 aid, '30' acod, 5493 aref from dual
  7   union all
  8   select 5743 aid, '3007' acod, 5494 aref from dual
  9   union all
 10   select 5744 aid, '300701' acod, 5743 aref from dual
 11  )
 12  /

Table created.

SQL> create table b as (
  2   select 7 id, '30' bcod from dual
  3   union all
  4   select 37 id, '3007' bcod from dual
  5  )
  6  /

Table created.

SQL> alter table b modify id not null;

Table altered.

SQL>
SQL> select aid, aref, acod, bcod, id, nvl2(id,1,0)
  2    from (
  3  select aid, aref, acod, bcod, id
  4    from a, b
  5   where acod= bcod(+)
  6   start with aid= 5744
  7   connect by prior aref= aid
  8  )
  9  where id is not null;

       AID       AREF ACOD   BCOD         ID NVL2(ID,1,0)
---------- ---------- ------ ---- ---------- ------------
      5744       5743 300701                            0
      5743       5494 3007   3007         37            1
      5494       5493 30     30            7            1
      5493       3413 У30                                0
      3413            С01                                0
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985727
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да странно:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
SQL> @c:\temp\null.sql
SQL> drop table a purge
  2  /

Table dropped.

SQL> drop table b purge
  2  /

Table dropped.

SQL> SELECT * FROM DBA_REGISTRY_HISTORY;

ACTION_TIME ACTION     NAMESPACE VERSION                ID COMMENTS
----------- ---------- --------- ---------------------- -- ---------------------------------------------------------------------------
            BOOTSTRAP  DATAPATCH 12.2.0.1                  RDBMS_12.2.0.1.0_WINDOWS.X64_170210.4

SQL> create table a as
  2  (select 3413 aid, '&#9572;01' acod, null aref from dual
  3   union all
  4   select 5493 aid, '&#9561;30' acod, 3413 aref from dual
  5   union all
  6   select 5494 aid, '30' acod, 5493 aref from dual
  7   union all
  8   select 5743 aid, '3007' acod, 5494 aref from dual
  9   union all
 10   select 5744 aid, '300701' acod, 5743 aref from dual
 11  )
 12  /

Table created.

SQL> create table b as (
  2   select 7 id, '30' bcod from dual
  3   union all
  4   select 37 id, '3007' bcod from dual
  5  )
  6  /

Table created.

SQL> alter table b modify id not null;

Table altered.

SQL>
SQL> select aid, aref, acod, bcod, id, nvl2(id,1,0)
  2    from (
  3  select aid, aref, acod, bcod, id
  4    from a, b
  5   where acod= bcod(+)
  6   start with aid= 5744
  7   connect by prior aref= aid
  8  )
  9  where id is not null;

       AID       AREF ACOD   BCOD ID NVL2(ID,1,0)
---------- ---------- ------ ---- -- ------------
      5743       5494 3007   3007 ##            1
      5494       5493 30     30    7            1

SQL>
SQL> set echo off;
SQL>



SY.
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985728
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
SQL> set autotrace on
SQL> /

       AID       AREF ACOD   BCOD ID NVL2(ID,1,0)
---------- ---------- ------ ---- -- ------------
      5743       5494 3007   3007 ##            1
      5494       5493 30     30    7            1


Execution Plan
----------------------------------------------------------
Plan hash value: 1325690365

-------------------------------------------------------------------------------------------------
| Id  | Operation                                | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                         |      |     2 |    96 |     7  (15)| 00:00:01 |
|*  1 |  VIEW                                    |      |     2 |    96 |     7  (15)| 00:00:01 |
|*  2 |   CONNECT BY NO FILTERING WITH START-WITH|      |       |       |            |          |
|*  3 |    HASH JOIN OUTER                       |      |     5 |    95 |     6   (0)| 00:00:01 |
|   4 |     TABLE ACCESS FULL                    | A    |     5 |    60 |     3   (0)| 00:00:01 |
|   5 |     TABLE ACCESS FULL                    | B    |     2 |    14 |     3   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("ID" IS NOT NULL)
   2 - access("AID"=PRIOR "AREF")
       filter("AID"=5744)
   3 - access("ACOD"="BCOD"(+))



SY.
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985731
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SY,

реально интересно, что в оптимизаторе так выкручено, что позволило обойти баг. Можно трассу 10053 для него?
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985735
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
SY,

реально интересно, что в оптимизаторе так выкручено, что позволило обойти баг. Можно трассу 10053 для него?


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SQL> alter session set events '10053 trace name context forever, level 1';

Session altered.

SQL> select aid, aref, acod, bcod, id, nvl2(id,1,0)
  2    from (
  3  select aid, aref, acod, bcod, id
  4    from a, b
  5   where acod= bcod(+)
  6   start with aid= 5744
  7   connect by prior aref= aid
  8  )
  9  where id is not null;

       AID       AREF ACOD   BCOD         ID NVL2(ID,1,0)
---------- ---------- ------ ---- ---------- ------------
      5743       5494 3007   3007         37            1
      5494       5493 30     30            7            1

SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

I:\>



SY.
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39985843
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SY,

забавно так у меня еще билд новее
...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39986013
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.7.0.0.0

PLATFORM_NAME
Linux x86 64-bit
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
SQL> select banner from v$version

BANNER                                                                          
--------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production          
1 row selected.

SQL> create table a as
  (select 3413 aid, 'С01' acod, null aref from dual
   union all
   select 5493 aid, 'У30' acod, 3413 aref from dual
   union all
   select 5494 aid, '30' acod, 5493 aref from dual
   union all
   select 5743 aid, '3007' acod, 5494 aref from dual
   union all
   select 5744 aid, '300701' acod, 5743 aref from dual
  )
Table created.
SQL> create table b as (
  select 7 id, '30' bcod from dual
  union all
  select 37 id, '3007' bcod from dual
 )
Table created.

SQL> alter table b modify id not null
Table altered.

SQL> select aid, aref, acod, bcod, id, nvl2(id,1,0)
    from (
  select aid, aref, acod, bcod, id
    from a, b
   where acod= bcod(+)
   start with aid= 5744
   connect by prior aref= aid
  )
  where id is not null

       AID       AREF ACOD   BCOD         ID NVL2(ID,1,0)
---------- ---------- ------ ---- ---------- ------------
      5743       5494 3007   3007         37            1
      5494       5493 30     30            7            1

2 rows selected.

SQL> select aid, aref, acod, bcod, id, nvl2(id,1,0)
   from (
    select
       aid, aref, acod, bcod, id
      from a, b
     where acod= bcod(+)
     start with aid= 5744
     connect by prior aref= aid
 )
 where id+0 is not null

       AID       AREF ACOD   BCOD         ID NVL2(ID,1,0)
---------- ---------- ------ ---- ---------- ------------
      5743       5494 3007   3007         37            1
      5494       5493 30     30            7            1

2 rows selected.

...
Рейтинг: 0 / 0
Не работает условие IS [NOT] NULL
    #39986047
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
оказывается, мой трейс не приложился в прошлый раз
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не работает условие IS [NOT] NULL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]