Не может иметь CREATE TABLE внутри, если еще - PullRequest
4 голосов
/ 08 июня 2011

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

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: Обнаружен символ "CREATE" при ожидании одного изследующее:

начинать регистр объявлять выход для goto if loop mod null прагма повышение возвращать select select update, в то время как с << закрыть текущее удаление выборки блокировка вставки открытый откат отката <br>установка точки сохранения sql execute commit forall merge pipe 06550. 00000- "строка% s, столбец% s: \ n% s" * Причина: обычно ошибка компиляции PL / SQL.

Ответы [ 2 ]

10 голосов
/ 08 июня 2011

Вы не можете запускать такие операторы 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;
0 голосов
/ 08 июня 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...