Переставить столбец в ORACLE

 
0
 
Oracle
ava
Song | 03.08.2005, 09:37
Сабж.
Необходимо поменять местами столбцы.
Comments (9)
ava
LSD | 03.08.2005, 09:49 #
По моему без потери данных нельзя это можно сделать только правкой словаря, что не есть гут. А с потерей так:
create table COL_RENAME
(
ID RAW(16) default sys_guid() primary key,
TEXT_COL VARCHAR2(50),
NUMBER_COL NUMBER
);

alter table COL_RENAME rename column TEXT_COL to NUMBER_COL_NEW;

alter table COL_RENAME rename column NUMBER_COL to TEXT_COL;

alter table COL_RENAME rename column NUMBER_COL_NEW to NUMBER_COL;

alter table COL_RENAME modify (NUMBER_COL number, TEXT_COL varchar2(50));

ну или drop column и add column.
ava
AntonSaburov | 03.08.2005, 12:04 #
А зачем ?

Теория баз данных как раз подразумевает, что порядок столбцов не должен иметь значения. Я помню в том же FoxPro (7-й версии) ответ на запрос не гарантировал тот же порядок полей, что и порядок полей в запросе. Не совсем наверно это корректно, но тем не менее.

Так что не вижу смысла.
ava
igon | 04.08.2005, 02:28 #

Create Table column_order
(One NUMBER(9),
Two VARCHAR2(30),
Three DATE)
...
Create Table column_order_new As
Select Three, Two, One From column_order

Drop column_order

Create Table column_order As
Select * From column_order_new

Drop colunm_order_new

Constraints, Indexes и пр. на отдельные поля и таблицу придется пересоздавать.
Понятно, что вариант далеко не самый элегантный...
ava
Song | 04.08.2005, 14:23 #
Смысл в том, что открывая таблицу в PL/SQL Developer'е, делается такой запрос SELECT * FROM ...
И столбцы выводятся в порядке как они созданы.
Но таблица, скажем так, была создана "не совсем продуманно" и важные поля (в плане визуального наблюдения на момент разработки) находятся за полосой прокрутки. А их надо видеть.
Конечно можно изменить запрос и выбирать только нужные столбцы, но в этом случае навигация по таблицам существенно замедлится.
ava
LSD | 04.08.2005, 16:11 #
Можно конечно словарь подправить, такой запрос вернет все колонки для заданной таблицы:
select c.* from sys.obj$ o, sys.col$ c, sys.user$ u
where u.name = 'SCOTT' and u.user# = o.owner# and o.name = 'PERSON' and c.obj# = o.obj#

порядковый номер колонки содержится в COL#.

Disclaimer: за развал базы в случае чего, я не овечаю smile
ava
igon | 04.08.2005, 21:48 #
ИМХО, исходная постановка задачи не совсем корректна: требуется не ПЕРЕСТАВЛЯТЬ столбцы, а ОТОБРАЗИТЬ их в нужной последовательности - в любой момент разработки "важными" могут стать другие поля. И что, опять их переставлять?
Вариант: пусть рабочая схема WORK. Создай схему TEST и помести в нее VIEW на все нужные таблицы WORK, причем имя TEST.VIEW == имя WORK.Table. Нужная последовательность полей во View задается тривиально.
Разработчик работает со схемой TEST, единственное для него "неудобство" - выбирать не из "Tables", а из "Views"
ava
mx1234567 | 09.10.2015, 18:55 #
Цитата (Song @ 3.8.2005,  08:37)
Сабж.

Необходимо поменять местами столбцы.

Вот так работает:


create table t1 (t1_key number, t1_value varchar2(10));

insert into t1 values(1, '1');

insert into t1 values(2, '2');

insert into t1 values(3, '3');

insert into t1 values(4, '4');

insert into t1 values(5, '5');

insert into t1 values(6, '6');

insert into t1 values(7, '7');

insert into t1 values(8, '8');

insert into t1 values(9, '9');



--delete t1



select * from t1



select do.owner,

       do.object_name,

       sc.name colname,

       sc.col#,

       sc.segcol#,

       sc.intcol#,

       sc.OBJ#,

       sc.COL#

   from sys.col$ sc, dba_objects do

   where

   do.object_id = sc.obj#

   and do.object_type='TABLE'

   and do.OBJECT_NAME='T1'



--Нужен обмен, через 0, т.к. FK по уникальности для col# срабатывает



update sys.col$

set

col# = 0

--segcol# = 0, --Нельзя испортит, данные

--intcol# = 0   

where

obj# in

(

select sc.obj#

   from sys.col$ sc, dba_objects do

   where

   do.object_id = sc.obj#

   and do.object_type='TABLE'

   and do.OBJECT_NAME='T1'

)

and name='T1_KEY';



update sys.col$

set

col# = 2

where

obj# in

(

select sc.obj#

   from sys.col$ sc, dba_objects do

   where

   do.object_id = sc.obj#

   and do.object_type='TABLE'

   and do.OBJECT_NAME='T1'

)

and name='T1_VALUE';



update sys.col$

set

col# = 1

where

obj# in

(

select sc.obj#

   from sys.col$ sc, dba_objects do

   where

   do.object_id = sc.obj#

   and do.object_type='TABLE'

   and do.OBJECT_NAME='T1'

)

and name='T1_KEY';



ALTER SYSTEM FLUSH SHARED_POOL



select * from t1
 
ava
Akina | 09.10.2015, 21:44 #
Цитата (Song @  4.8.2005,  15:23 findReferencedText)
делается такой запрос SELECT * FROM ...

Решение простое - не делай ТАКОЙ запрос, указывай явно нужные поля в нужном порядке.

PS. Нет, когда лень не даёт перечислять поля, потому что можно влепить звёздочку - это ещё худо-бедно можно понять. Но позволить лени сделаться настолько глобальной, чтобы ради неё лопатить структуру - это уже перебор...
ava
Zloxa | 09.10.2015, 21:54 #
Akina, вопрос поставлен десятилетие назад  smile 
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  Song   AntonSaburov ava  LSD   Akina   igon ava  Zloxa   mx1234567
advanced
Submit