Не может быть CREATE TABLE внутри, если еще

Когда я запускаю этот запрос

DECLARE
 num NUMBER;
BEGIN
 SELECT COUNT(*) INTO num FROM user_all_tables WHERE TABLE_NAME=upper('DatabaseScriptLog')
 ;
 IF num < 1 THEN
 CREATE TABLE DatabaseScriptLog 
 (ScriptIdentifier VARCHAR(100) NOT NULL,
 ScriptType VARCHAR(50), 
 StartDate TIMESTAMP, 
 EndDate TIMESTAMP, 
 PRIMARY KEY (ScriptIdentifier)
 );
 END IF;
END;

При выполнении вышеуказанного, я получил следующее:

PLS-00103: столкнулся с символом "СОЗДАТЬ", ожидая одного из следующее:

begin case declare exit для goto if loop mod null pragma raise return выберите обновление, когда < < закрыть текущее удаление извлечь блокировку вставить открыть откат Сохранить точку set sql выполнить commit forall merge pipe 06550. 00000 - "строка% s, столбец% s:\n% s" * Причина: Обычно ошибка компиляции PL/SQL.

2 ответа

Вы не можете запускать такие заявления DDL. Вам нужно использовать динамический SQL (EXECUTE IMMEDIATE).

IF num < 1 THEN
 EXECUTE IMMEDIATE 'CREATE TABLE DatabaseScriptLog (ScriptIdentifier VARCHAR(100) NOT NULL, ScriptType VARCHAR(50), StartDate TIMESTAMP, EndDate TIMESTAMP, PRIMARY KEY (ScriptIdentifier))'
END IF;


Вы не можете сделать это, как в SQLServer. Вам нужно выполнить созданный код через хранимую процедуру, которая уже находится в правильной схеме. Вы передаете код создания в качестве параметра, и хранимая процедура, которая имеет правильные привилегии, делает это для вас.

Я использую версию script, которая обновляет схему до последней версии, запустив операции изменения схемы, разделенные опциями if-then, чтобы проверить, в какой версии находится db. После изменения он увеличивает версию таким образом, что следующий тест операторов if и т.д. Если вы устарели и запустите script, то ifs пропустит все изменения кода. Если ваш бит находится в версии 46, и вы запустите script, который имеет все изменения до 50, вы выполняете только блоки, которые представляют версии 47-50.

Вы можете выполнить немедленные действия, но вам потребуются повышенные привилегии, которые я бы не рекомендовал.

Надеюсь, что это поможет.

licensed under cc by-sa 3.0 with attribution.