Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не работает условие IS [NOT] NULL / 25 сообщений из 28, страница 1 из 2
30.07.2020, 11:54
    #39985265
SilentMage
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
Почему может не работать условие "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
30.07.2020, 11:55
    #39985266
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
SilentMage,

План запроса в студию. Ну и посмотреть в сторону no_query_transformation/materialize
...
Рейтинг: 0 / 0
30.07.2020, 12:05
    #39985269
SilentMage
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
Код: 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
30.07.2020, 12:16
    #39985274
SilentMage
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
хинты никак не влияют на результат
статистика таблиц и индексов актуальная
PS
Oracle 11.2.0.4.0
...
Рейтинг: 0 / 0
30.07.2020, 12:49
    #39985288
SilentMage
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
создал тестовую таблицу
Код: 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
30.07.2020, 12:57
    #39985293
artas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
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
30.07.2020, 12:59
    #39985294
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
SilentMage,

Причина бага ясна - оптимизатор считает, что то поле не может быть null, но чтобы тебе помочь дай полный минимальный тест кейс показывающий баг. Самому мне лень ваять.
...
Рейтинг: 0 / 0
30.07.2020, 13:13
    #39985300
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
Впрочем уже понятно:
Код: 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
30.07.2020, 13:14
    #39985301
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
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
30.07.2020, 13:20
    #39985306
SilentMage
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
orawish,

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

xtender,

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

PS: а что же он "+0" не оптимизировал? это еще более бесполезно должно выглядеть)))
...
Рейтинг: 0 / 0
30.07.2020, 13:24
    #39985307
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
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
30.07.2020, 13:27
    #39985309
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
SilentMage
и вывод? очередной глюк версии 11.2.0.4 ?
увы, повторяется и на 12, 18, но исправлено в 19, так что ищите баг/запрашивайте фикс на My Oracle Support
...
Рейтинг: 0 / 0
30.07.2020, 13:34
    #39985312
SilentMage
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
спасибо всем! быстро разобрались

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

за 15+ лет работы с ораклом впервые такое вижу)))
проблему-то я сразу решил, варианты есть...
просто интересно стало
встречал ошибки в таких запросах на вполне конкретном наборе данных
Почти день убил, пока понял, что глюк
...
Рейтинг: 0 / 0
31.07.2020, 17:46
    #39985657
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
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
31.07.2020, 18:03
    #39985664
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
SY
12C, 18C
здорово, а какие патчи стоят?
...
Рейтинг: 0 / 0
01.08.2020, 00:49
    #39985720
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
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
01.08.2020, 01:25
    #39985722
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
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
01.08.2020, 02:45
    #39985727
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
Да странно:

Код: 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
01.08.2020, 02:47
    #39985728
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
Ну и:

Код: 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
01.08.2020, 03:16
    #39985731
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
SY,

реально интересно, что в оптимизаторе так выкручено, что позволило обойти баг. Можно трассу 10053 для него?
...
Рейтинг: 0 / 0
01.08.2020, 04:36
    #39985735
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
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
01.08.2020, 21:46
    #39985843
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
SY,

забавно так у меня еще билд новее
...
Рейтинг: 0 / 0
02.08.2020, 23:52
    #39986013
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
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
03.08.2020, 09:32
    #39986047
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает условие IS [NOT] NULL
оказывается, мой трейс не приложился в прошлый раз
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не работает условие IS [NOT] NULL / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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