如何删除所有表中的列

时间:2015-09-16 08:44:45

标签: firebird

我使用的是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 ; ^

1 个答案:

答案 0 :(得分: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中使用此功能。