Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Переставить столбец в ORACLE


Автор: Song 3.8.2005, 08:37
Сабж.
Необходимо поменять местами столбцы.

Автор: LSD 3.8.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.

Автор: AntonSaburov 3.8.2005, 12:04
А зачем ?

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

Так что не вижу смысла.

Автор: igon 4.8.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 и пр. на отдельные поля и таблицу придется пересоздавать.
Понятно, что вариант далеко не самый элегантный...

Автор: Song 4.8.2005, 14:23
Смысл в том, что открывая таблицу в PL/SQL Developer'е, делается такой запрос SELECT * FROM ...
И столбцы выводятся в порядке как они созданы.
Но таблица, скажем так, была создана "не совсем продуманно" и важные поля (в плане визуального наблюдения на момент разработки) находятся за полосой прокрутки. А их надо видеть.
Конечно можно изменить запрос и выбирать только нужные столбцы, но в этом случае навигация по таблицам существенно замедлится.

Автор: LSD 4.8.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

Автор: igon 4.8.2005, 21:48
ИМХО, исходная постановка задачи не совсем корректна: требуется не ПЕРЕСТАВЛЯТЬ столбцы, а ОТОБРАЗИТЬ их в нужной последовательности - в любой момент разработки "важными" могут стать другие поля. И что, опять их переставлять?
Вариант: пусть рабочая схема WORK. Создай схему TEST и помести в нее VIEW на все нужные таблицы WORK, причем имя TEST.VIEW == имя WORK.Table. Нужная последовательность полей во View задается тривиально.
Разработчик работает со схемой TEST, единственное для него "неудобство" - выбирать не из "Tables", а из "Views"

Автор: mx1234567 9.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
 

Автор: Akina 9.10.2015, 21:44
Цитата(Song @  4.8.2005,  15:23 Найти цитируемый пост)
делается такой запрос SELECT * FROM ...

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

PS. Нет, когда лень не даёт перечислять поля, потому что можно влепить звёздочку - это ещё худо-бедно можно понять. Но позволить лени сделаться настолько глобальной, чтобы ради неё лопатить структуру - это уже перебор...

Автор: Zloxa 9.10.2015, 21:54
Akina, вопрос поставлен десятилетие назад  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)