2015-09-16 129 views
1

我使用火鸟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也用这个。