Informix "SERIAL" для Oracle NUMBER / Sequence / Trigger в Pro * C - PullRequest
1 голос
/ 16 декабря 2011

Я пытаюсь конвертировать некоторые Informix ESQL в Oracle Pro * C. В существующем коде Informix тип данных «SERIAL» использовался для указания автоматически увеличивающихся столбцов. Согласно документации Oracle, Oracle Migration Workbench для Informix должен быть в состоянии справиться с этим и объясняет, что он преобразует тип данных «SERIAL» в «NUMBER» со связанной последовательностью Oracle и триггером. Однако при попытке запустить инструмент просто заменяет слово «SERIAL» на «ERROR (SERIAL)», поэтому я пытался вручную добавить триггер / последовательность.

Их пример здесь: http://docs.oracle.com/html/B16022_01/ch2.htm#sthref112 показывает, как это можно сделать. Последовательность выглядит довольно простой, однако при попытке создать триггер вот так:

CREATE TRIGGER clerk.TR_SEQ_11_1 
BEFORE INSERT ON clerk.JOBS FOR EACH ROW 
BEGIN 
SELECT clerk.SEQ_11_1.nextval INTO :new.JOB_ID FROM dual; END;

Препроцессор Pro * C выбирает здесь ключевое слово "CREATE" и решает, что мне не разрешено использовать переменную хоста ": new.JOB_ID", поскольку переменные хоста нельзя использовать в сочетании с операторами "CREATE" .

У меня вопрос, есть ли способ создать триггер, который связывает последовательность Oracle с конкретным столбцом, не используя переменную хоста для указания имени столбца? Документация Oracle, похоже, указывает на то, что их инструмент миграции должен быть в состоянии справиться, что означает, что должен быть какой-то способ сделать это. Однако все примеры использования триггера, которые я обнаружил, используют переменную хоста, которая заставляет препроцессор жаловаться.

Спасибо, что уделили время.

(Примечание: я использовал имена триггеров / последовательностей / столбцов из примера в документации Oracle в приведенном выше примере.)

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

Мне удалось решить проблему с помощью инструкции «EXEC SQL EXECUTE IMMEDIATE».

char sql_buf[4096+1];
snprintf(sql_buf, 4096, <sql>);
EXEC SQL IMMEDIATE :sql_buf;

Это обходит препроцессор и, следовательно, разрешает утверждение без жалоб.

0 голосов
/ 22 октября 2012

Невозможно создать триггер, который связывает последовательность Oracle с конкретным столбцом, не используя «переменную хоста» для указания имени столбца.Кстати, это не «переменная хоста» - просто ссылка.Например, один и тот же триггер может срабатывать при обновлении и вставке, поэтому вам нужно указать, на что вы ссылаетесь: новые или старые переменные.Вы можете сделать это в MS-SQL, но не в Oracle.

...