Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как изменить тип столбца если в нём есть данные? / 25 сообщений из 31, страница 1 из 2
02.06.2009, 09:02
    #36020415
_MOD_IF_Y_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
Доброго всем времени суток!
Возможно ли изменить тип столбца, с NUMBER на VARCHAR2, если столбец не пустой?

Делаю:
Код: plaintext
1.
ALTER TABLE TABLE_NAME
MODIFY(DOC_NO VARCHAR2( 250 ));
Пишет:
Код: plaintext
ORA- 01439 : модифицируемый столбец при смене типа данных должен быть пуст
Как можно это обойти, и возможно ли вообще?

Спасибо!
...
Рейтинг: 0 / 0
02.06.2009, 09:18
    #36020436
Alexey181
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
как вариант
Код: plaintext
1.
2.
3.
4.
create table tab1 as select * from tab where  0 = 1 ;
ALTER TABLE tab1
MODIFY(col1 VARCHAR2( 250 ));
insert into tab1 select * from tab;
commit;
...
Рейтинг: 0 / 0
02.06.2009, 09:20
    #36020440
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
_MOD_IF_Y_
Код: plaintext
ORA- 01439 : модифицируемый столбец при смене типа данных должен быть пуст
Как можно это обойти, и возможно ли вообще?Ведь по-русски же написано.
Сохраняешь, обнуляешь, модифицируешь столбец, восстанавливаешь. Либо переименовываешь, добавляешь, переносишь, удаляешь старый солбец.
...
Рейтинг: 0 / 0
02.06.2009, 09:28
    #36020455
_MOD_IF_Y_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
Alexey181как вариант
Код: plaintext
1.
2.
3.
4.
create table tab1 as select * from tab where  0 = 1 ;
ALTER TABLE tab1
MODIFY(col1 VARCHAR2( 250 ));
insert into tab1 select * from tab;
commit;


Да, а потом ещё
Код: plaintext
drop table tab;
и
Код: plaintext
rename tab1 to tab;
Это конечно хороший варриант, но таблиц слишком много, хотелось бы как-нибудь по проще сделать, если такое конечно возможно...
...
Рейтинг: 0 / 0
02.06.2009, 09:30
    #36020460
_MOD_IF_Y_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
ElicСохраняешь, обнуляешь, модифицируешь столбец, восстанавливаешь. Либо переименовываешь, добавляешь, переносишь, удаляешь старый солбец.
Хотелось без лишних заморочек сделать...
...
Рейтинг: 0 / 0
02.06.2009, 09:36
    #36020473
Alexey181
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
_MOD_IF_Y_ElicСохраняешь, обнуляешь, модифицируешь столбец, восстанавливаешь. Либо переименовываешь, добавляешь, переносишь, удаляешь старый солбец.
Хотелось без лишних заморочек сделать...
exp/imp в помощь
...
Рейтинг: 0 / 0
02.06.2009, 09:40
    #36020483
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
_MOD_IF_Y_Хотелось без лишних заморочек сделать..."Поздно пить боржоми, когда..." :)
Думать надо было во время дизайна.
...
Рейтинг: 0 / 0
02.06.2009, 09:42
    #36020489
Как изменить тип столбца если в нём есть данные?
_MOD_IF_Y_
Хотелось без лишних заморочек сделать...
"сим салабим" ептить скажи только громче и несколько раз.

если кто-то изначально не думает, то потом сам дурак.

авторexp/imp в помощь
думаю у товарища красненького только добавится
...
Рейтинг: 0 / 0
02.06.2009, 09:48
    #36020504
_MOD_IF_Y_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
Elic"Поздно пить боржоми, когда..." :)
Думать надо было во время дизайна.
Дизайном не я занимался, мне просто сказали: "А номер документа может быть не только нумбер, так что займись ка ты сменой типов..."
...
Рейтинг: 0 / 0
02.06.2009, 10:30
    #36020603
Andrey.L
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
_MOD_IF_Y_Elic"Поздно пить боржоми, когда..." :)
Думать надо было во время дизайна.
Дизайном не я занимался, мне просто сказали: "А номер документа может быть не только нумбер, так что займись ка ты сменой типов..."
Естественный ключ?
...
Рейтинг: 0 / 0
02.06.2009, 10:33
    #36020610
_MOD_IF_Y_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
Andrey.LЕстественный ключ?
Извиняюсь, но я не совсем понял вопрос...
...
Рейтинг: 0 / 0
02.06.2009, 10:35
    #36020615
Andrey.L
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
_MOD_IF_Y_Andrey.LЕстественный ключ?
Извиняюсь, но я не совсем понял вопрос...Ссылочная целостность обеспечивается по номеру документа.
...
Рейтинг: 0 / 0
02.06.2009, 10:41
    #36020629
_MOD_IF_Y_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
Andrey.LСсылочная целостность обеспечивается по номеру документа.
Поле нот нулл, но ссылочной целостности нет.
Сейчас делаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table tab1 as (select * from tab);

ALTER TABLE tab
MODIFY("No"  NULL);

update tab set "No" = null;

ALTER TABLE tab
MODIFY("No" VARCHAR2( 250 ));

update tab set "No" = (SELECT "No" from tab1 where tab1."ObjectGUID" = tab."ObjectGUID"); 

drop table tab1;

ALTER TABLE tab
MODIFY("No"  NOT NULL);
...
Рейтинг: 0 / 0
02.06.2009, 10:46
    #36020643
SQLap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
_MOD_IF_Y_ но ссылочной целостности нет.


Это хорошо, что нет)
...
Рейтинг: 0 / 0
02.06.2009, 10:48
    #36020650
Andrey.L
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
_MOD_IF_Y_Andrey.LСсылочная целостность обеспечивается по номеру документа.
Поле нот нулл, но ссылочной целостности нет.
Сейчас делаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table tab1 as (select * from tab);

ALTER TABLE tab
MODIFY("No"  NULL);

update tab set "No" = null;

ALTER TABLE tab
MODIFY("No" VARCHAR2( 250 ));

update tab set "No" = (SELECT "No" from tab1 where tab1."ObjectGUID" = tab."ObjectGUID"); 

drop table tab1;

ALTER TABLE tab
MODIFY("No"  NOT NULL);
По-моему сильно много телодвижений...
Упрости...
...
Рейтинг: 0 / 0
02.06.2009, 10:56
    #36020665
_MOD_IF_Y_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
Всем спасибо!
Таблиц оказалось не так уж и много(23)... сделал так как описал выше.
...
Рейтинг: 0 / 0
02.06.2009, 11:21
    #36020742
ZVV
ZVV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
_MOD_IF_Y_,

Это у вас таблички маленькие и работа пользователей по боку... :)

А вообще есть более спортивные варианты:

Код: 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.
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.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
SQL*Plus: Release  9 . 2 . 0 . 8 . 0  - Production on Tue Jun  2   10 : 17 : 16   2009 

Copyright (c)  1982 ,  2002 , Oracle Corporation.  All rights reserved.

Connected to:
Oracle Database 10g Enterprise Edition Release  10 . 2 . 0 . 3 . 0  - Production
With the Partitioning, OLAP and Data Mining options

SQL> Create Table "неверная"
   2   ("столбец" Number)
   3   /

Table created.

SQL> Insert Into "неверная"
   2      Select     rownum /  2 
   3            From dual
   4      Connect By Level <  11 
   5   /

 10  rows created.

SQL> Select *
   2     From "неверная"
   3   /

   столбец                                                                      
----------                                                                      
        . 5                                                                       
          1                                                                       
        1 . 5                                                                       
          2                                                                       
        2 . 5                                                                       
          3                                                                       
        3 . 5                                                                       
          4                                                                       
        4 . 5                                                                       
          5                                                                       

 10  rows selected.

SQL> Drop Table "верная"
   2   /
Drop Table "верная"
           *
ERROR at line  1 :
ORA- 00942 : table or view does not exist 


SQL> Create Table "верная"
   2   ("столбец" Varchar( 10 ))
   3   /

Table created.

SQL> 
SQL> Begin
   2      dbms_redefinition.Can_redef_table ( Uname                         => User
   3                                         ,Tname                         => '"неверная"'
   4                                         ,Options_flag                  => dbms_redefinition.Cons_use_rowid
   5                                        );
   6   End;
   7   /

PL/SQL procedure successfully completed.

SQL> 
SQL> Begin
   2      dbms_redefinition.Start_redef_table ( Uname                         => User
   3                                           ,Orig_table                    => '"неверная"'
   4                                           ,Int_table                     => '"верная"'
   5                                           ,Options_flag                  => dbms_redefinition.Cons_use_rowid
   6                                           ,Col_mapping                   => 'to_char("столбец") "столбец"'
   7                                          );
   8   End;
   9   /

PL/SQL procedure successfully completed.

SQL> 
SQL> Rem COPY_TABLE_DEPENDENTS при необходимости...
SQL> 
SQL> Begin
   2      dbms_redefinition.Finish_redef_table ( Uname                         => User,
   3                                             Orig_table                    => '"неверная"'
   4                                            ,Int_table                     => '"верная"' );
   5   End;
   6   /

PL/SQL procedure successfully completed.

SQL> Drop Table "верная"
   2   /

Table dropped.

SQL> desc "неверная";
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 столбец                                            VARCHAR2( 10 )

SQL> Select *
   2     From "неверная"
   3   /

столбец                                                                         
----------                                                                      
. 5                                                                               
 1                                                                                
 1 . 5                                                                              
 2                                                                                
 2 . 5                                                                              
 3                                                                                
 3 . 5                                                                              
 4                                                                                
 4 . 5                                                                              
 5                                                                                

 10  rows selected.
...
Рейтинг: 0 / 0
02.06.2009, 13:57
    #36021185
_MOD_IF_Y_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
ZVVА вообще есть более спортивные варианты:

Спасибо за решение!
Попробовал ваш варриант с вашими таблицами, всё проходит хорошо, когда пытаюсь сделать на своих после прогона
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL*Plus: Release  9 . 2 . 0 . 8 . 0  - Production on Tue Jun  2   10 : 17 : 16   2009 
SQL> Begin
   2      dbms_redefinition.Start_redef_table ( Uname                         => User
   3                                           ,Orig_table                    => 'tab'
   4                                           ,Int_table                     => 'test_tab'
   5                                           ,Options_flag                  => dbms_redefinition.Cons_use_rowid
   6                                           ,Col_mapping                   => 'to_char("No") "No"'
   7                                          );
   8   End;
   9   /
пишет:
Код: plaintext
1.
2.
3.
4.
5.
6.
ORA- 12091 : невозможно интерактивно переопределить таблицу tab с материализованными представлениями
ORA- 06512 : на  "SYS.DBMS_REDEFINITION", line  8 
ORA- 06512 : на  "SYS.DBMS_REDEFINITION", line  146 
ORA- 06512 : на  line  1 

Begin dbms_redefinition.Start_redef_table ( Uname                         => User,
                                            Orig_table   
test_tab создаю следующим образом:
Код: plaintext
create table test_tab as (select * from tab where  0 = 1 );
Затем делаю:
Код: plaintext
1.
ALTER TABLE test_tab
MODIFY("No"  VARCHAR2( 250  char));
Почему выходит ошибка?
Спасибо!
...
Рейтинг: 0 / 0
02.06.2009, 15:28
    #36021465
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
_MOD_IF_Y_,
автор
Код: plaintext
ORA- 12091 : невозможно интерактивно переопределить таблицу tab с материализованными представлениями

Что в ошибке из написанного русским языком непонятно? Нельзя переопределить таблицу, если на ней основываются материализованные представления. Если всё равно хоцца - грохаем матвью и матлоги, переопределяем, создаём матвью и матлоги заново.
...
Рейтинг: 0 / 0
04.06.2009, 10:48
    #36025075
_MOD_IF_Y_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
suPPLerЧто в ошибке из написанного русским языком непонятно?
Не понятно то, что нет никаких матвью-шек привязанных к этой таблице.
...
Рейтинг: 0 / 0
04.06.2009, 11:09
    #36025143
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
_MOD_IF_Y_,

как определяем?
...
Рейтинг: 0 / 0
04.06.2009, 11:18
    #36025171
DВА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
и логов тоже нет?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
18.11.2021, 22:11
    #40112985
VIVIM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
Приветствую всех.
Столкнулся со схожей проблемой: нужно изменить number на varchar2 и добавить длину поля на 4 разряда, поле используется как естественный ключ. По постановке только последние 3 разряда могут принимать буквенные значения. В основной таблице, порядка 200 тысяч записей, в таблице где используется поле как ключ порядка 20 миллионов записей (накопили за 12 лет).
Про "думать заранее" тут не подходит, системе 20 лет и всё работало как часы, а тут заставляют "синхронизировать" справочники с новой системой, аргументы что "лучше у них там переделать" не работают - бизнесу удобнее как там.
Приведённый выше код скорее всего сработает, но я опасаюсь, что время исполнения может оказаться неприемлемо долгим, а мы можем остановить систему максимум на 2 дня в выходные.
Есть идеи как обойтись без конвертации или ускорить процесс?
Подумываю сделать отдельную таблицу для маппинга буквенных кодов в цифровые и в интерфейсе подменять, но основная идея минимально переписывать GUI.
...
Рейтинг: 0 / 0
18.11.2021, 22:35
    #40112991
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
VIVIM

Столкнулся со схожей проблемой: нужно изменить number на varchar2 и добавить длину поля на 4 разряда, поле используется как естественный ключ.


Использование естественных ключей раньше или позже аукается. Я бы просто добавил поле в родительскую таблицу и навесил на нее UNIQUE INDEX и продолжал использовать существующее поле.

SY.
...
Рейтинг: 0 / 0
19.11.2021, 16:15
    #40113163
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить тип столбца если в нём есть данные?
VIVIM
порядка 20 миллионов записей (накопили за 12 лет).
...
мы можем остановить систему максимум на 2 дня в выходные.

Даже париться не стоит.
Ладно бы 20 ярдов записей - еще было бы о чем говорить, но два дня на 20 лямов - овердофига.
Даже dbms_redefinition привлекать смысла особого нет.
Табличка секционированная или нет?
Свободное место в БД на копию есть?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как изменить тип столбца если в нём есть данные? / 25 сообщений из 31, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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