【问题标题】:ORA-06550 when trying to check if a table existsORA-06550 尝试检查表是否存在时
【发布时间】:2012-11-11 17:37:54
【问题描述】:

我想在 Oracle 数据库中创建表之前检查是否存在表。 但是,以下语句不起作用,在第 7 行(CREATE)抛出错误 ORA-06550。

  DECLARE cnt NUMBER;
  BEGIN
    SELECT COUNT(*) INTO cnt FROM ALL_TABLES WHERE lower(table_name) = lower('TestTable');

    IF( cnt = 0 )
    THEN
      CREATE TABLE TestTable
      (
        TestFlag NUMBER(1) NOT NULL
      );
    END IF;
  END;

谁能帮我解决这个问题?

提前致谢!

【问题讨论】:

    标签: oracle exists ora-06550


    【解决方案1】:

    就个人而言,我看不出有什么理由要以这种方式创建表,但如果表不存在,这里有另一种创建表的方法:

     SQL> declare
      2     table_exists exception;
      3     pragma exception_init(table_exists, -955);
      4   begin
      5     execute immediate 'create table TestTable(TestFlag number(1) not null)';
      6     dbms_output.put_line('table created');
      7   exception
      8     when table_exists
      9     then dbms_output.put_line('table exists');
     10   end;
     11  /
    
    table created
    
    SQL> declare
      2    table_exists exception;
      3    pragma exception_init(table_exists, -955);
      4  begin
      5    execute immediate 'create table TestTable(TestFlag number(1) not null)';
      6    dbms_output.put_line('table created');
      7  exception
      8    when table_exists
      9    then dbms_output.put_line('table exists');
     10  end;
     11  /
    
    table exists
    
    PL/SQL procedure successfully completed
    

    【讨论】:

      【解决方案2】:
      DECLARE cnt NUMBER;
        BEGIN
          SELECT COUNT(*) INTO cnt FROM ALL_TABLES WHERE lower(table_name) 
                                                                  = lower('TestTable');
      
          IF( cnt = 0 )
          THEN
            EXECUTE IMMEDIATE 'CREATE TABLE TestTable ( TestFlag NUMBER(1) NOT NULL )';
          END IF;
        END;
      

      【讨论】:

        【解决方案3】:

        在 Oracle 中动态创建表是一个很大的禁忌,因此如果这是您正在运行的真实代码,请停止。改用临时表。但是失败的原因是DDL必须在SQL中运行,而不是PL/SQL。

         DECLARE cnt NUMBER;
          BEGIN
            SELECT COUNT(*) INTO cnt FROM ALL_TABLES WHERE lower(table_name) = lower('TestTable');
        
            IF( cnt = 0 )
            THEN
              execute immediate 'CREATE TABLE TestTable (testFlag NUMBER(1) NOT NULL)';
            END IF;
          END;
        

        【讨论】:

        • p.s 你可能也应该使用 USER_TABLES,就好像另一个模式具有相同的表名一样,你想跳过在你自己的模式中创建吗?
        • 感谢您的 USER_TABLES 提示。我在更新机制中使用了类似的代码,如果查询已经执行(表已经创建),我不想得到错误。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多