Oracle 在更改表或列之前,我可以检查它是否存在吗?

Oracle 在更改表或列之前,我可以检查它是否存在吗?,oracle,plsql,Oracle,Plsql,我正在处理一些Oracle数据库问题。 在我想要修改它之前,是否有可能检查表或列是否存在?如果没有,则不应执行代码 我已经尝试通过计数来检查这个表是否存在,但它似乎不适用于ALTER declare w NUMBER; begin select count(*) into w from ALL_TABLES where TABLE_NAME='TAB'; if(w>0) then alter table TAB add C

我正在处理一些Oracle数据库问题。 在我想要修改它之前,是否有可能检查表或列是否存在?如果没有,则不应执行代码

我已经尝试通过计数来检查这个表是否存在,但它似乎不适用于ALTER

declare 
    w NUMBER;
begin
    select count(*) into w from ALL_TABLES where TABLE_NAME='TAB';
     if(w>0) then
        alter table TAB
            add COLUMN_1 varchar(20);
     end if;
end;

它似乎不适用于ALTER语句。此外,我还想在添加列时检查相同的选项(如果列不存在)。

您必须使用所有的选项卡列:

declare 
    t NUMBER;
    w NUMBER;
begin
    -- checking if table exists
    select count(*) into t from ALL_TABLES where TABLE_NAME='TAB';

    -- checking if column does not exist
    select count(*) into w 
    from ALL_TAB_COLUMNS 
    where TABLE_NAME='TAB' AND COLUMN_NAME = 'COLUMN_1';

     if (t>0) AND (w=0) then
        EXECUTE IMMEDIATE 'alter table TAB add COLUMN_1 varchar(20)';
     end if;
end;
/

您必须使用所有选项卡列:

declare 
    t NUMBER;
    w NUMBER;
begin
    -- checking if table exists
    select count(*) into t from ALL_TABLES where TABLE_NAME='TAB';

    -- checking if column does not exist
    select count(*) into w 
    from ALL_TAB_COLUMNS 
    where TABLE_NAME='TAB' AND COLUMN_NAME = 'COLUMN_1';

     if (t>0) AND (w=0) then
        EXECUTE IMMEDIATE 'alter table TAB add COLUMN_1 varchar(20)';
     end if;
end;
/

您需要在代码中添加
立即执行

declare 
    w NUMBER;
begin
    select count(*) into w from ALL_TABLES where TABLE_NAME='TAB';
     if(w>0) then
       execute immediate 'alter table TAB add COLUMN_1 varchar(20)';
     end if;
end;

您需要在代码中添加
executeimmediate

declare 
    w NUMBER;
begin
    select count(*) into w from ALL_TABLES where TABLE_NAME='TAB';
     if(w>0) then
       execute immediate 'alter table TAB add COLUMN_1 varchar(20)';
     end if;
end;

若我记得正确的标签可能是一个旧的数据字典,并没有更多的使用,但现在向后兼容,所以最好使用另一个表名OK,谢谢。我只使用了它,例如,我的代码包含了更多的名称,所以我决定只在一个名称上尝试它。如果我记得右选项卡可能是一个旧的数据字典,不会被更多地使用,但为了向后兼容,所以最好使用另一个表名。好的,谢谢。我只使用了它,例如,我的代码包含更多的名称,所以我决定只在一个名称上尝试