Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Многоходовочка / 10 сообщений из 10, страница 1 из 1
07.11.2016, 16:55
    #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
07.11.2016, 17:12
    #39342802
SY
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
07.11.2016, 17:28
    #39342812
Maxim Demenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоходовочка
SY,

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

Regards

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

Ок. Принято.

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

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

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

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

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

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

Regards

Maxim
...
Рейтинг: 0 / 0
07.11.2016, 18:40
    #39342886
SY
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
10.11.2016, 14:33
    #39344874
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоходовочка
Глупый Телевизор..

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

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

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

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


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


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