我正在尝试将一些Informix ESQL转换为Oracle Pro * C.在现有的Informix代码中,“SERIAL”数据类型用于指示自动递增列。根据Oracle文档,Informix的Oracle Migration Workbench应该能够处理这个问题,它解释说它将“SERIAL”数据类型转换为带有关联Oracle序列和触发器的“NUMBER”。但是,在尝试运行该工具时,它只是将“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文档中的示例中的触发器/序列/列名。)
答案 0 :(得分:1)
我设法通过使用“EXEC SQL EXECUTE IMMEDIATE”语句解决了该问题。
char sql_buf[4096+1];
snprintf(sql_buf, 4096, <sql>);
EXEC SQL IMMEDIATE :sql_buf;
这绕过了预处理器,因此允许声明通过而无需投诉。
答案 1 :(得分:0)
如果不使用“主机变量”来指定列名,则无法创建将Oracle序列链接到特定列的触发器。顺便说一下,它不是“主变量” - 只是参考。例如,更新和插入时可能触发相同的触发器,因此您必须指定引用的内容:新变量或旧变量。您可以在MS-SQL中执行此操作,但不能在Oracle中执行。