Informix ПОСЛЕДОВАТЕЛЬНОСТЬ к Oracle НОМЕР / Последовательность / Триггер в Pro * C

Я пытаюсь преобразовать некоторый Informix ESQL в Oracle Pro * C. В существующем коде Informix для обозначения автоматически увеличивающихся столбцов использовался тип данных «SERIAL». Согласно документации Oracle, Oracle Migration Workbench for 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 в приведенном выше примере.)


person confused_person    schedule 16.12.2011    source источник
comment
Почему бы вам не создать триггер с помощью сценария SQL? Я не вижу необходимости делать это из программы C.   -  person a_horse_with_no_name    schedule 16.12.2011
comment
Существующая программа ESQL написана на C, и моя задача - полностью преобразовать этот существующий код для использования Pro * C. К сожалению, у меня нет полномочий что-то менять в том, как это работает.   -  person confused_person    schedule 19.12.2011


Ответы (2)


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

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

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

person confused_person    schedule 21.12.2011

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

person Yuri Levinsky    schedule 22.10.2012