2015-09-16 4 views
1

Я использую Firebird 2.5 У меня есть несколько таблиц с именем столбца 'col1', и я хотел бы удалить его.Как удалить столбец во всех таблицах

я могу использовать это заявление:

DELETE FROM RDB$RELATION_FIELDS 
WHERE RDB$FIELD_NAME = 'col1'; 

Но я не знаю, это безопасно.

Я пытаюсь использовать блок выполнения для нескольких операторов выполнения, но я не знаю, как его объединить.

SET TERM^; 
EXECUTE BLOCK AS 
    DECLARE s AS VARCHAR(200) 
BEGIN 

WHILE (SELECT rf.RDB$RELATION_NAME FROM RDB$RELATION_FIELDS rf WHERE rf.RDB$FIELD_NAME = 'AKTYWNY';) DO 
BEGIN 
    ALTER TABLE :s DROP c1; 
END 

END^ 
SET TERM ;^
+2

Мессинг с системными таблицами НЕ безопасен, вместо этого используйте 'alter table drop column'! – ain

ответ

2

Это пример того, как сделать это в хранимой процедуре:

create or alter procedure DELETE_COL (
    F_COL char(31)) 
as 
declare variable V_STAT varchar(256); 
declare variable R_NAME char(31); 
begin 
    for 
    select f.rdb$relation_name 
    from rdb$relation_fields f 
    join rdb$relations r on f.rdb$relation_name = r.rdb$relation_name 
    and r.rdb$view_blr is null 
    and (r.rdb$system_flag is null or r.rdb$system_flag = 0) 
    where f.rdb$field_name = :f_col 
    order by 1, f.rdb$field_position 
    into 
    :r_name -- Table Name 
    do 
    begin 
     v_stat = 'alter table ' || :r_name || ' drop ' || :f_col; 
     execute statement(v_stat); /*because alter table ... is not allowed here */ 
    end 
end 

Вы можете использовать это в execute block также.

Смежные вопросы