Я много искал, и у многих возникали похожие проблемы, но ничего не подходило.
Это не проблема:
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 или истекшим тайм-аутом» * Причина: Интересующий ресурс занят. * Действие: повторите попытку, если необходимо, или увеличьте время ожидания.
Но это, похоже, другая проблема.