Удаление нескольких столбцов: PLSQL и user_tab_cols - PullRequest
3 голосов
/ 03 августа 2011

У меня есть таблица TABLE_X, в которой есть несколько столбцов, начинающихся с символов M_, которые необходимо удалить.Я решил использовать следующий код PLSQL для удаления почти 100 столбцов, начинающихся с символов M_.Это хорошая занятость динамического sql и курсоров?Это может быть лучше?Я не знал более простой способ, так как ALTER TABLE ... DROP COLUMN не позволяет подзапросу указывать несколько имен столбцов.

declare
rcur sys_refcursor;
cn user_tab_cols.column_name%type;
begin
open rcur for select column_name from user_tab_cols where table_name='TABLE_X' and column_name LIKE 'M_%';
loop
fetch rcur into cn;
exit when rcur%NOTFOUND;
execute immediate 'alter table TABLE_X drop column '||cn;--works great
execute immediate 'alter table TABLE_X drop column :col'using cn;--error
end loop;
close rcur;
end;

Также.Почему невозможно использовать 'using cn'?

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

Это разумное использование динамического SQL. Я бы серьезно усомнился в базовой модели данных, в которой сотни столбцов в одной таблице начинаются с одного и того же префикса, и все они должны быть отброшены. Для меня это означает, что сама модель данных может быть очень проблематичной.

Даже при использовании динамического SQL вы не можете использовать переменные связывания для имен столбцов, имен таблиц, имен схем и т. Д. Oracle должна знать во время анализа, какие объекты и столбцы участвуют в операторе SQL. Однако, поскольку переменные связывания предоставляются после фазы анализа, вы не можете указать переменную связывания, которая изменяет объекты и / или столбцы, на которые влияет оператор SQL.

2 голосов
/ 03 августа 2011

Синтаксис для отбрасывания нескольких столбцов в одном операторе alter таков:

SQL> desc t42
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------
 COL1                                               NUMBER
 COL2                                               DATE
 COL3                                               VARCHAR2(30)
 COL4                                               NUMBER

SQL> alter table t42 drop (col2, col3)
  2  /

Table altered.

SQL> desc t42
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------
 COL1                                               NUMBER
 COL4                                               NUMBER

SQL>

Итак, если вам действительно нужно оптимизировать операцию, вам нужно будет создавать оператор постепенно или использоватьметод агрегации строк.

Однако я хотел бы задать вопрос, нужно ли выполнять такой оператор достаточно часто, чтобы потребовалось для его оптимизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...