Oracle SQL EXECUTE IMMEDIATE ORA-00922/06512 Создать таблицу

Я много искал, и у многих возникали похожие проблемы, но ничего не подходило.

Это не проблема:

create table CUSTOM_WORKFLOW_ID_COUNTER (
    id_ NUMBER (19) GENERATED by default on null as IDENTITY,
    type_ VARCHAR2(50 CHAR),
    masterId_ VARCHAR2(100 CHAR),
    counter_ NUMBER (19),
    primary key (id_)
    );

Из-за того, что Oracle не поддерживает "drop table if exists", я должен проверить, существует ли таблица другим способом:

  DECLARE cnt NUMBER;
  BEGIN
   SELECT COUNT(*) INTO cnt FROM user_tables WHERE table_name ='CUSTOM_WORKFLOW_ID_COUNTER';
   IF cnt <> 0 THEN
     EXECUTE IMMEDIATE 'DROP TABLE CUSTOM_WORKFLOW_ID_COUNTER';              
   END IF;       
 END;

Оба работают как шарм, но если я попытаюсь выполнить оба в одном операторе SQL:

  DECLARE cnt NUMBER;
  BEGIN
  SELECT COUNT(*) INTO cnt FROM user_tables WHERE table_name = 'CUSTOM_WORKFLOW_ID_COUNTER';
    IF cnt <> 0 THEN
      EXECUTE IMMEDIATE 'DROP TABLE CUSTOM_WORKFLOW_ID_COUNTER';              
    END IF;       
  END;
 create table CUSTOM_WORKFLOW_ID_COUNTER (
    id_ NUMBER (19) GENERATED by default on null as IDENTITY,
    type_ VARCHAR2(50 CHAR),
    masterId_ VARCHAR2(100 CHAR),
    counter_ NUMBER (19),
    primary key (id_)
    );

Я получил:

ORA-06550: Zeile 9, Spalte 1: PLS-00103: Fand das Symbol "CREATE" 06550. 00000 - "строка% s, столбец% s: \ n% s" * Причина: Обычно ошибка компиляции PL / SQL.

Если я попытаюсь выполнить оператор create внутри блока, я получу еще одну ошибку:

  DECLARE cnt NUMBER;
  BEGIN
   SELECT COUNT(*) INTO cnt FROM user_tables WHERE table_name = 'CUSTOM_WORKFLOW_ID_COUNTER';
  IF cnt <> 0 THEN
   EXECUTE IMMEDIATE 'DROP TABLE CUSTOM_WORKFLOW_ID_COUNTER';
   EXECUTE IMMEDIATE 'create table CUSTOM_WORKFLOW_ID_COUNTER (
    id_ NUMBER (19) GENERATED by default on null as IDENTITY,
    type_ VARCHAR2(50 CHAR),
    masterId_ VARCHAR2(100 CHAR),
    counter_ NUMBER (19),
    primary key (id_)
    );';
 ELSE
    EXECUTE IMMEDIATE 'create table CUSTOM_WORKFLOW_ID_COUNTER (
    id_ NUMBER (19) GENERATED by default on null as IDENTITY,
    type_ VARCHAR2(50 CHAR),
    masterId_ VARCHAR2(100 CHAR),
    counter_ NUMBER (19),
    primary key (id_)
    );';      
  END IF;
END;

Я получаю такую ​​ошибку:

ORA-00922: Вариант Fehlende oder ungültige ORA-06512: в Zeile 18 00922. 00000 - «Вариант отсутствует или недействителен»

Что я делаю неправильно?

изменить: после удаления точки с запятой:

  DECLARE cnt NUMBER;
  BEGIN
   SELECT COUNT(*) INTO cnt FROM user_tables WHERE table_name = 'CUSTOM_WORKFLOW_ID_COUNTER';
 IF cnt <> 0 THEN
  EXECUTE IMMEDIATE 'DROP TABLE CUSTOM_WORKFLOW_ID_COUNTER';
  EXECUTE IMMEDIATE 'create table CUSTOM_WORKFLOW_ID_COUNTER (
id_ NUMBER (19) GENERATED by default on null as IDENTITY,
type_ VARCHAR2(50 CHAR),
masterId_ VARCHAR2(100 CHAR),
counter_ NUMBER (19),
primary key (id_)
)';
ELSE
EXECUTE IMMEDIATE 'create table CUSTOM_WORKFLOW_ID_COUNTER (
id_ NUMBER (19) GENERATED by default on null as IDENTITY,
type_ VARCHAR2(50 CHAR),
masterId_ VARCHAR2(100 CHAR),
counter_ NUMBER (19),
primary key (id_)
)';      
 END IF;
END;

Получаю очередную ошибку;)

ORA-00054: Ressource belegt und Anforderung mit NOWAIT angegeben or Timeout abgelaufen ORA-06512: in Zeile 5 00054. 00000 - «Ресурс занят и захватывается с указанным NOWAIT или истекшим тайм-аутом» * Причина: Интересующий ресурс занят. * Действие: повторите попытку, если необходимо, или увеличьте время ожидания.

Но это, похоже, другая проблема.


person SWYM    schedule 19.09.2017    source источник


Ответы (2)


проблема связана с точкой с запятой желтого цвета (в строках 12 и 20):

EXECUTE IMMEDIATE 'create table CUSTOM_WORKFLOW_ID_COUNTER (
id_ NUMBER (19) GENERATED by default on null as IDENTITY,
type_ VARCHAR2(50 CHAR),
masterId_ VARCHAR2(100 CHAR),
counter_ NUMBER (19),
primary key (id_)
)

;

'

person Barbaros Özhan    schedule 19.09.2017
comment
Спасибо за подсказку. - person SWYM; 19.09.2017

Просто удалите точку с запятой в конце таблицы создания:

  DECLARE cnt NUMBER;
  BEGIN
   SELECT COUNT(*) INTO cnt FROM user_tables WHERE table_name = 'CUSTOM_WORKFLOW_ID_COUNTER';
  IF cnt <> 0 THEN
   EXECUTE IMMEDIATE 'DROP TABLE CUSTOM_WORKFLOW_ID_COUNTER';
   EXECUTE IMMEDIATE 'create table CUSTOM_WORKFLOW_ID_COUNTER (
    id_ NUMBER (19) GENERATED by default on null as IDENTITY,
    type_ VARCHAR2(50 CHAR),
    masterId_ VARCHAR2(100 CHAR),
    counter_ NUMBER (19),
    primary key (id_)
    )';
 ELSE
    EXECUTE IMMEDIATE 'create table CUSTOM_WORKFLOW_ID_COUNTER (
    id_ NUMBER (19) GENERATED by default on null as IDENTITY,
    type_ VARCHAR2(50 CHAR),
    masterId_ VARCHAR2(100 CHAR),
    counter_ NUMBER (19),
    primary key (id_)
    )';      
  END IF;
END;
person Cyrille MODIANO    schedule 19.09.2017
comment
Спасибо за подсказку. Но после их удаления я получаю еще одну ошибку;) ORA-00054: Ressource belegt und Anforderung mit NOWAIT angegeben oder Timeout abgelaufen ORA-06512: in Zeile 5 00054. 00000 - ресурс занят и захват с указанным NOWAIT или истекло время ожидания * Причина : Интересующий ресурс занят. * Действие: повторите попытку, если необходимо, или увеличьте время ожидания. - person SWYM; 19.09.2017
comment
Это потому, что у вас может быть текущая транзакция на вашей таблице, вы не можете удалить таблицу, потому что она уже заблокирована кем-то другим, выполняющим на ней DML. - person Cyrille MODIANO; 19.09.2017