Pro * C中的Informix“SERIAL”到Oracle NUMBER / Sequence / Trigger

时间:2011-12-16 14:35:13

标签: oracle triggers auto-increment informix embedded-sql

我正在尝试将一些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文档中的示例中的触发器/序列/列名。)

2 个答案:

答案 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中执行。