powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
20 сообщений из 20, страница 1 из 1
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39322263
DBAshnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну то, что DDL-Time на таблице актуализируется, это я в курсе. Но пока инвалидных обьектов из-за этого я лично не видел! ( хотя коллеги утверждают типа как "в войну синус достигал 7" )) )

(Особую экзотку типа ddl-ей в ddl-триггерах не рассматриваем)
...
Рейтинг: 0 / 0
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39322282
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBAshnik,

Видишь в запросе индекс?
Код: plsql
1.
select distinct referenced_type from dba_dependencies where type = 'PACKAGE BODY'


Вообще удивляют товарищи которым коллеги шепчут о каком-то явлении и они потом бегут на форум выяснять.
Одно дело если б коллеги говорили что чего-то не может быть никогда, но если если оно бывает - пусть покажут, делов то.

PS. Есть тут один, ему часто "пацанчики на районе" шепчут про Оракл.
...
Рейтинг: 0 / 0
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39322362
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В старых версиях (до 11gR2?) удаление функционального индекса инвалидировало програмные единицы, зависящие от таблицы (FBI создает псевдостолбец в описании таблицы)
Код: 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.
74.
75.
76.
77.
78.
79.
80.
81.
SQL> create table t1(a number);

Table created.

SQL> create package p1 as
  2  procedure p1;
  3  end;
  4  /

Package created.

SQL> create package body p1 as
  2  procedure p1 is
  3      r1 t1%rowtype;
  4  begin select * into r1 from t1;
  5  end;
  6  end;
  7  /

Package body created.

SQL> select type, referenced_name, referenced_type, dependency_type from user_dependencies where name='P1';

TYPE              REFERENCED_NAME                                                  REFERENCED_TYPE   DEPE
----------------- ---------------------------------------------------------------- ----------------- ----
PACKAGE BODY      STANDARD                                                         PACKAGE           HARD
PACKAGE BODY      T1                                                               TABLE             HARD
PACKAGE BODY      P1                                                               PACKAGE           HARD

3 rows selected.

SQL> select object_type, status from user_objects where object_name='P1';

OBJECT_TYPE         STATUS
------------------- -------
PACKAGE             VALID
PACKAGE BODY        VALID

2 rows selected.

SQL> create index t1_idx on t1(a+1);

Index created.

SQL> select object_type, status from user_objects where object_name='P1';

OBJECT_TYPE         STATUS
------------------- -------
PACKAGE             VALID
PACKAGE BODY        VALID

2 rows selected.

SQL> drop index t1_idx;

Index dropped.

SQL> select object_type, status from user_objects where object_name='P1';

OBJECT_TYPE         STATUS
------------------- -------
PACKAGE             VALID
PACKAGE BODY        INVALID

2 rows selected.

SQL> drop package p1;

Package dropped.

SQL> drop table t1 purge;

Table dropped.

SQL> select * from v$version where rownum=1;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi

1 row 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.
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.
74.
75.
76.
77.
78.
79.
80.
81.
tst> create table t1(a number);

Table created.

tst> create index t1_idx on t1(a+1);

Index created.

tst> column data_type format a20
tst> select column_name, data_type from user_tab_cols where table_name='T1';

COLUMN_NAME                    DATA_TYPE
------------------------------ --------------------
A                              NUMBER
SYS_NC00002$                   NUMBER

tst> create package p1 as
  2  procedure p1;
  3  end;
  4  /

Package created.

tst> create package body p1 as
  2  procedure p1 is
  3      n number;
  4  begin select "SYS_NC00002$" into n from t1;
  5  end;
  6  end;
  7  /

Package body created.

tst> select type, referenced_name, referenced_type, dependency_type from user_dependencies where name='P1';

TYPE               REFERENCED_NAME                                                  REFERENCED_TYPE    DEPE
------------------ ---------------------------------------------------------------- ------------------ ----
PACKAGE BODY       STANDARD                                                         PACKAGE            HARD
PACKAGE BODY       P1                                                               PACKAGE            HARD
PACKAGE BODY       T1                                                               TABLE              HARD

tst> select object_type, status from user_objects where object_name='P1';

OBJECT_TYPE         STATUS
------------------- -------
PACKAGE             VALID
PACKAGE BODY        VALID

tst> drop index t1_idx;

Index dropped.

tst> select object_type, status from user_objects where object_name='P1';

OBJECT_TYPE         STATUS
------------------- -------
PACKAGE             VALID
PACKAGE BODY        VALID

tst> exec p1.p1
BEGIN p1.p1; END;

*
ERROR at line 1:
ORA-00904: "SYS_NC00002$": invalid identifier
ORA-06512: at "U1.P1", line 4
ORA-06512: at line 1


tst> select object_type, status from user_objects where object_name='P1';

OBJECT_TYPE         STATUS
------------------- -------
PACKAGE             VALID
PACKAGE BODY        VALID

tst> select * from v$version where rownum=1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

...
Рейтинг: 0 / 0
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39322366
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,

Что и говорить, если заведомо невалидный PL/SQL успешно компилится.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL> create or replace package pkg is
  2  
  3    c integer := 1;
  4    c integer := 2;
  5  
  6  end pkg;
  7  /
 
Package created
...
Рейтинг: 0 / 0
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39322369
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не говорю, что компилится -- как раз откомпилиться он не может
Он содержит заведомо кривой 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
tst> insert into t1 values(1);

1 row created.

tst> select object_type, status from user_objects where object_name='P1';

OBJECT_TYPE         STATUS
------------------- -------
PACKAGE             VALID
PACKAGE BODY        VALID

tst> exec p1.p1

PL/SQL procedure successfully completed.

tst> drop index t1_idx;

Index dropped.

tst> exec p1.p1
BEGIN p1.p1; END;

*
ERROR at line 1:
ORA-00904: "SYS_NC00002$": invalid identifier
ORA-06512: at "U1.P1", line 4
ORA-06512: at line 1


tst> select object_type, status from user_objects where object_name='P1';

OBJECT_TYPE         STATUS
------------------- -------
PACKAGE             VALID
PACKAGE BODY        VALID

tst> alter package p1 compile body;

Warning: Package Body altered with compilation errors.

tst> sho err
Errors for PACKAGE BODY P1:

LINE/COL ERROR
-------- -----------------------------------------------------------------
4/7      PL/SQL: SQL Statement ignored
4/15     PL/SQL: ORA-00904: "SYS_NC00002$": invalid identifier
tst> select object_type, status from user_objects where object_name='P1';

OBJECT_TYPE         STATUS
------------------- -------
PACKAGE             VALID
PACKAGE BODY        INVALID

tst> 

...
Рейтинг: 0 / 0
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39322407
ого(
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав ЛюбомудровЯ не говорю, что компилится -- как раз откомпилиться он не может
Он содержит заведомо кривой SQL, но состояние это не отображает
и чем лечится? пересозданием пакета только?
...
Рейтинг: 0 / 0
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39322414
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, или возвращением взад индекса
Да и ясно, что обращение к этой колонке не совсем корректно
...
Рейтинг: 0 / 0
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39322416
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
tst> create table t1 as select 1 a from dual;

Table created.

tst> create index t1_idx on t1(a+1);

Index created.

tst> create function f1 return number as
  2      r number;
  3  begin select SYS_NC00002$ into r from t1;
  4        return r;
  5  end;
  6  /

Function created.

tst> select f1 from dual;

        F1
----------
         2

tst> drop index t1_idx;

Index dropped.

tst> select f1 from dual;
select f1 from dual
       *
ERROR at line 1:
ORA-00904: "SYS_NC00002$": invalid identifier
ORA-06512: at "U1.F1", line 3


tst> create index t1_idx on t1(a+10);

Index created.

tst> select f1 from dual;

        F1
----------
        11

...
Рейтинг: 0 / 0
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39324292
DBAshnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ребята! Про drop (alter и т.п.) речь не идёт. От слова "вооообще"! :-) Исключительно про create. Так что вопрос пока не отвечен, по-моему, sorry... (кстати, интересует только 11gR2, более раннее версии - нет!)
...
Рейтинг: 0 / 0
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39324300
DBAshnik,

показывай как индекс создаешь. тебе же Вячеслав намекнул, что создание FBI приводит к автоматическому добавлению в таблицу виртуальной колонки с результатом вычисления функции из индекса. Что в некоторых версиях рассматривалось как вполне себе реальное ALETR TABLE.
...
Рейтинг: 0 / 0
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39324406
DBAshnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх,

не, ничего похожего на FB! Всё примитивно как грабли:
автор create index idx_OrderState on seaAsDbX.tWELHOrderStore ( nOrderState )
...
Рейтинг: 0 / 0
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39325486
Jonhson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ого(Вячеслав ЛюбомудровЯ не говорю, что компилится -- как раз откомпилиться он не может
Он содержит заведомо кривой SQL, но состояние это не отображает
и чем лечится? пересозданием пакета только?

выпрямлением рук.

Код, предоставленный пользователем Вячеслав Любомудров некорректен (хоть и компилируется), посему и работает когда как.
...
Рейтинг: 0 / 0
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39325812
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет некорректности вопрос спорный, ведь мне никто не мешает переименовать этот столбец и юзать его как короткую замену выражения, причем как в SELECT-листе, так и в предикатах
Код: 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.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
tst> create table t1(a number);

Table created.

tst> select column_name, data_type from user_tab_cols where table_name='T1';

COLUMN_NAME                    DATA_TYPE
------------------------------ --------------------
A                              NUMBER

tst> create index t1_idx on t1(a+1);

Index created.

tst> select column_name, data_type from user_tab_cols where table_name='T1';

COLUMN_NAME                    DATA_TYPE
------------------------------ --------------------
A                              NUMBER
SYS_NC00002$                   NUMBER

tst> alter table t1 rename column SYS_NC00002$ to b;

Table altered.

tst> select column_name, data_type from user_tab_cols where table_name='T1';

COLUMN_NAME                    DATA_TYPE
------------------------------ --------------------
A                              NUMBER
B                              NUMBER

tst> insert into t1 values(2);

1 row created.

tst> select a, b from t1 where a+1=3;

         A          B
---------- ----------
         2          3

tst> select * from table(dbms_xplan.display_cursor);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
SQL_ID  5t8qgdcyj29gc, child number 0
-------------------------------------
select a, b from t1 where a+1=3

Plan hash value: 1720721055

--------------------------------------------------------------------------------------
| Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |       |       |     1 (100)|          |
|   1 |  TABLE ACCESS BY INDEX ROWID| T1     |     1 |    26 |     1   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | T1_IDX |     1 |       |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------------

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

   2 - access("T1"."B"=3)

Note
-----
   - dynamic sampling used for this statement (level=2)


23 rows selected.

tst> select a, b from t1 where a=2;

         A          B
---------- ----------
         2          3

tst> select * from table(dbms_xplan.display_cursor);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
SQL_ID  83g5u2bb6pbq6, child number 0
-------------------------------------
select a, b from t1 where a=2

Plan hash value: 838529891

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |       |       |     3 (100)|          |
|*  1 |  TABLE ACCESS FULL| T1   |     1 |    26 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

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

   1 - filter("A"=2)

Note
-----
   - dynamic sampling used for this statement (level=2)


22 rows selected.

...
Рейтинг: 0 / 0
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39325834
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудровведь мне никто не мешает переименовать этот столбецЗдравый смысл.
Есть сопровождаемо-тиражируемые способы - индексирование виртуального столбца.
...
Рейтинг: 0 / 0
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39500422
DBAshnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBAshnik, c тех пор этот миф так и прижился в нашей фирме... Ни подтвердить ни опровергнуть пока, похоже, никто так и не смог, да? ;-)
Думаю, а может из-за актуализации LAST-DDL на таблице какие-нибудь remote-процедуры (зависящие от сигнатуры) обламываются??? Какие вообще могут быть гипотезы по сабжу?? (как уже сказал, DROP и FBI можем больше не обсуждать - это не наш случай!)
...
Рейтинг: 0 / 0
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39500438
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
DBAshnik,

Думаю, кто-то просто накосячил и свалил всё на чужой индекс...
...
Рейтинг: 0 / 0
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39501120
DBAshnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderDBAshnik,

Думаю, кто-то просто накосячил и свалил всё на чужой индекс...

мда... склоняюсь уже к этой версии как к основной!
...
Рейтинг: 0 / 0
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39501259
Фотография DВА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBAshnikну то, что DDL-Time на таблице актуализируется, это я в курсе. Но пока инвалидных обьектов из-за этого я лично не видел! ( хотя коллеги утверждают типа как "в войну синус достигал 7" )) )

(Особую экзотку типа ddl-ей в ddl-триггерах не рассматриваем)

в военное время в 12 версии пакеты может инвалидизировать обычный сбор статистики ) вернее не совсем обычный )
ну а если допустить, что он вызван появлением нового индекса, то почему бы и нет
...
Рейтинг: 0 / 0
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39501366
DBAshnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DВАDBAshnikну то, что DDL-Time на таблице актуализируется, это я в курсе. Но пока инвалидных обьектов из-за этого я лично не видел! ( хотя коллеги утверждают типа как "в войну синус достигал 7" )) )

(Особую экзотку типа ddl-ей в ddl-триггерах не рассматриваем)

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

это я какбы даже знаю! (ext.statistic которая, да?) Но у нас тут по любому везде только 11g!
...
Рейтинг: 0 / 0
в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
    #39501927
девелопер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DBAshnikв каких случаях создания индекса...

Сколько раз ?


Например :
1)
CREATE INDEX IDX1 on T(id);

2)
CREATE INDEX IDX1 on T(id);
drop index IDX1;
CREATE INDEX IDX1 on T(id);
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / в каких случаях создания индекса на таблице приводит к инвалидным pl/sql-пакетам?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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