尝试检查表是否存在时ORA-06550

时间:2012-11-23 10:56:45

标签: oracle exists ora-06550

我想在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;

任何人都可以帮我解决这个问题吗?

提前致谢!

3 个答案:

答案 0 :(得分:2)

在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;

答案 1 :(得分:2)

就个人而言,我没有看到任何理由为什么你想以这种方式创建一个表,但是如果它不存在,这是另一种创建表的方法:

 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 :(得分:1)

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;