2011-12-16 2 views
1

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

Их пример здесь: 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 в приведенном выше примере)

+0

Почему вы не создаете триггер с помощью SQL-скрипта? Я не вижу необходимости делать это из программы C. –

+0

Существующая программа ESQL написана на C, и моя задача - преобразовать этот существующий код в опцию, чтобы теперь использовать Pro * C. К сожалению, у меня нет полномочий сильно изменить то, как это работает. –

ответ

1

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

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

Это обходит препроцессор и поэтому разрешает заявление без жалобы.

0

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

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