ORA-06550 при попытке проверить, существует ли таблица

Я хотел бы проверить, существует ли таблица перед ее созданием в базе данных Oracle. Хотя следующее утверждение не работает, выбрасывая ошибку ORA-06550 в строке 7 (CREATE).

  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 ответа

Решение

Создание таблиц на лету в 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;

Лично я не вижу никаких причин, почему вы хотите создать таблицу таким образом, но вот другой подход к созданию таблицы, если она не существует:

 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
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;
Другие вопросы по тегам