2015-09-18 5 views
1

Я пишу скрипт, который добавит столбец идентификатора в таблицу, включая все последовательности и триггеры, чтобы он автоматически обновлялся. Он будет выполнять следующие действия:Смешивание операторов DDL и DML в одном скрипте

  • Добавить столбец в таблицу
  • Создайте последовательность
  • Создать триггер
  • Обновление существующих строк, чтобы использовать последовательность значений
  • Установите в поле не nullable

Проблема у меня есть с выделенной жирным шрифтом - это будет UPDATE в сценарии DDL. Ошибки я получаю:

PLS-00103: Обнаружен символ "UPDATE"

Я попытался обертывание UPDATE в блоке BEGIN и END, без успеха.

Можно ли включить оператор UPDATE в сценарий DDL?

Вот что я до сих пор:

ALTER TABLE RETAILER ADD (RETAILER_ID NUMBER); 

CREATE SEQUENCE RETAILER_ID_SEQ; 

CREATE OR REPLACE TRIGGER RETAILER_ADD_TRG 
BEFORE INSERT ON RETAILER 
FOR EACH ROW 
BEGIN 
    SELECT RETAILER_ID_SEQ.NEXTVAL INTO :new.RETAILER_ID FROM dual; 
END; 

-- Doesn't like this part... 
UPDATE RETAILER SET RETAILER_ID = RETAILER_ID_SEQ.NEXTVAL; 
COMMIT; 

ALTER TABLE RETAILER MODIFY (RETAILER_ID NOT NULL); 
+3

Вам нужно '/' после инструкции 'create trigger': http: // stackoverflow. com/a/10207695/330315 –

+0

Привет @a_horse_with_no_name, можете ли вы написать это как ответ, чтобы я мог принять его? Приветствия. – Eraph

ответ

2

Эффективный способ установить это значение будет:

UPDATE RETAILER SET RETAILER_ID = ROWNUM; 

... а затем создать последовательность, чтение количество строк в RETAILER, чтобы установить значение START WITH (бит тривиального PL/SQL и динамического SQL).

12с не поддерживает:

CREATE SEQUENCE RETAILER_ID_SEQ; 
ALTER TABLE RETAILER ADD (RETAILER_ID NUMBER DEFAULT RETAILER_ID_SEQ.NEXTVAL NOT NULL); 

... кстати, поэтому нет необходимости в определении свой собственный триггер.

http://docs.oracle.com/database/121/SQLRF/statements_3001.htm

Выражение DEFAULT может включать в себя последовательность псевдостолбцы CURRVAL и NEXTVAL, до тех пор, как последовательность существует и у вас есть привилегии, необходимые для доступа к нему. Пользователи, которые выполняют последующие вставки, использующие выражение DEFAULT, должны иметь привилегию INSERT в таблице и привилегию SELECT в последовательности. Если последовательность позже будет удалена, последующие инструкции вставки, в которых используется выражение DEFAULT, приведут к ошибке. Если вы добавляете новый столбец в таблицу, то порядок, в котором NEXTVAL присваивается каждой существующей строке, является недетерминированным

+0

Вы имели в виду 'rownum', а не' rowid'? Я не вижу, как «rowid» будет вписываться в целочисленный столбец «retailer_id» ... –

+0

Hah - да, конечно. Только проснулся 5 минут. Приветствия. –

+0

В любом случае, реальной проблемой является отсутствие имени '/' as @a_horse_with_no_name. Тогда оба решения работают, но с использованием 'RETAILER_ID_SEQ.NEXTVAL' вместо 'ROWNUM' имеет то преимущество, что последовательность уже обновлена ​​после утверждения' UPDATE'. –

Смежные вопросы