powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Многоходовочка
10 сообщений из 10, страница 1 из 1
Многоходовочка
    #39342790
Глупый Телевизор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напомните в каких сдучаях невозможно создать таблицу за одно выполнение?

Например, для получения скрипта
Код: plsql
1.
2.
3.
4.
5.
6.
create table t
(
a varchar2(100),
b varchar2(100),
c varchar2(100) generated always as (a||b) virtual
);


надо выполнить два шага
Код: plsql
1.
2.
3.
4.
5.
6.
create table t
(
a varchar2(100),
b varchar2(100),
c varchar2(200) generated always as (a||b) virtual
);

+
Код: plsql
1.
alter table t modify c varchar2(100);



Какие еще бывают случаи?

Хорошо известен пример про not null колонку с данными, которая создается в три шага: добавление колонки, заполнение, добавление ограничения.
Но особо интересуют примеры пустых таблиц.

Помню что-то orawish перечислял в топике про синхронизацию DDL лет пять назад, но не смог найти.
...
Рейтинг: 0 / 0
Многоходовочка
    #39342802
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глупый ТелевизорНапример, для получения скрипта
надо выполнить два шага


He надо:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> create table tbl
  2  (
  3  a varchar2(100),
  4  b varchar2(100),
  5  c varchar2(100) generated always as (a||b) virtual
  6  );
c varchar2(100) generated always as (a||b) virtual
*
ERROR at line 5:
ORA-12899: value too large for column "C" (actual: 100, maximum: 200)


SQL> create table tbl
  2  (
  3  a varchar2(100),
  4  b varchar2(100),
  5  c varchar2(100) generated always as (cast(a||b as varchar2(100))) virtual
  6  );

Table created.

SQL> 



Или просто:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> drop table tbl purge;

Table dropped.

SQL> create table tbl
  2  (
  3  a varchar2(100),
  4  b varchar2(100),
  5  c generated always as (cast(a||b as varchar2(100))) virtual
  6  );

Table created.

SQL> 



SY.
...
Рейтинг: 0 / 0
Многоходовочка
    #39342812
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

Что прикольно - таблицы создаюстся не эквивалентные. В случае каста - значение обрезается после первых 100 знаков, в случае с modify - похоже Oracle его по факту игнорирует, хотя в метаданных вроде бы ограничение и есть...

Regards

Maxim
...
Рейтинг: 0 / 0
Многоходовочка
    #39342815
Глупый Телевизор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

Ок. Принято.

На самом деле вопрос возник, когда не смогли применить результат dbms_metadata.get_ddl как есть.

Стало интересно на что еще можно напороться.
И вроде встречался с аналогичными проблемами ранее, но конкретные примеры пока не могу вспомнить.
...
Рейтинг: 0 / 0
Многоходовочка
    #39342839
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim DemenkoSY,

Что прикольно - таблицы создаюстся не эквивалентные.

Да, похоже на баг в ALTER TABLE MODIFY.

SY.
...
Рейтинг: 0 / 0
Многоходовочка
    #39342847
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

Да, условие на размерность виртуальной колонки проверяется только при создании таблицы, ну и насколько я понимаю - такие таблицы должны быть непереносимы штатными средствами (e.g. expdp/impdp).

Regards

Maxim
...
Рейтинг: 0 / 0
Многоходовочка
    #39342886
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim DemenkoДа, условие на размерность виртуальной колонки проверяется только при создании таблицы

Несовсем:

Код: 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.
SQL> create table tbl
  2  (
  3  a varchar2(100),
  4  b varchar2(100),
  5  c varchar2(200) generated always as (a||b) virtual
  6  );

Table created.

SQL> alter table tbl modify a varchar2(200);
alter table tbl modify a varchar2(200)
                       *
ERROR at line 1:
ORA-54031: column to be dropped or modified is used in a virtual column
expression


SQL> alter table tbl modify a number;
alter table tbl modify a number
                       *
ERROR at line 1:
ORA-54033: column to be modified is used in a virtual column expression


SQL> 



Т.e. MODIFY не дает изменить тип/размерность если поле используется в виртуальной колонке но почему-то не для самой виртуальной колонке. Хотя тут несколько иная ситуация. Уменьшить размерность можно только если размерность значений поля для всех строк <= новая размерность

Код: 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.
SQL> drop table tbl purge;

Table dropped.

SQL> create table tbl
  2  (
  3  a varchar2(100),
  4  b varchar2(100)
  5  );

Table created.

SQL> insert into tbl(a,b) values(rpad('X',75,'X'),rpad('Y',75,'Y'));

1 row created.

SQL> alter table tbl modify a varchar2(50);
alter table tbl modify a varchar2(50)
                       *
ERROR at line 1:
ORA-01441: cannot decrease column length because some value is too big


SQL> drop table tbl purge;

Table dropped.

SQL> create table tbl
  2  (
  3  a varchar2(100),
  4  b varchar2(100)
  5  );

Table created.

SQL> insert into tbl(a,b) values(rpad('X',75,'X'),rpad('Y',75,'Y'));

1 row created.

SQL> alter table tbl modify a varchar2(90);

Table altered.

SQL>



Т.e MODIFY ползает по блокам таблицы и проверяет хранящуюся в блоках длину поля VARCHAR2. Значения и соответственно длина виртуального поля нигде не хранится - значение вычиcляется каждый раз при SELECTe. Так что либо MODIFY не должен разрешать уменьшить размерность виртуального поля, либо INSERT/UPDATE должен его вычиcлять и выдавать ошибку длины. Но тогда по-другому станет работать и:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> create table tbl
  2  (
  3  a number,
  4  b number,
  5  c number generated always as (a / b) virtual
  6  );

Table created.

SQL> insert into tbl(a,b) values(1,0);

1 row created.

SQL> select * from tbl;
select * from tbl
   *
ERROR at line 1:
ORA-01476: divisor is equal to zero


SQL> 



Так-что MODIFY по-идее должен ползать по блокам таблицы и проверяет хранящуюся в блоках длину поля VARCHAR2 для обычных полей и SELECT поле для виртуальных.

SY.
...
Рейтинг: 0 / 0
Многоходовочка
    #39344874
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глупый Телевизор..

Помню что-то orawish перечислял в топике про синхронизацию DDL лет пять назад, но не смог найти.

про какой топик речь, к сожалению, нет у меня идей
попробуйте порыться там
...
Рейтинг: 0 / 0
Многоходовочка
    #39344891
Глупый Телевизор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orawishГлупый Телевизор..

Помню что-то orawish перечислял в топике про синхронизацию DDL лет пять назад, но не смог найти.

про какой топик речь, к сожалению, нет у меня идей
попробуйте порыться там Слова ddl там нет, но то что подразумевал нашел 4549736
Если таблицы пустые , то вся эта синхронизация автоматизируется без особых трудностей.
Для сиквенсов тоже уже добавили усовершенствования.
В чем проблема с pl/sql непонятно - все просто пересоздается, где надо с force.
...
Рейтинг: 0 / 0
Многоходовочка
    #39364884
Глупый Телевизор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глупый Телевизорorawishпропущено...


про какой топик речь, к сожалению, нет у меня идей
попробуйте порыться там Слова ddl там нет, но то что подразумевал нашел 4549736
Если таблицы пустые , то вся эта синхронизация автоматизируется без особых трудностей.
Для сиквенсов тоже уже добавили усовершенствования.
В чем проблема с pl/sql непонятно - все просто пересоздается, где надо с force.Еще один пример с вирт колонками
Таблица ссылается на саму себя по функции
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Многоходовочка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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