1

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

4

2 回答 2

1

我设法通过使用“EXEC SQL EXECUTE IMMEDIATE”语句解决了这个问题。

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

这绕过了预处理器,因此允许语句通过而没有抱怨。

于 2011-12-21T15:51:58.490 回答
0

如果不使用“主机变量”来指定列名,就不可能创建将 Oracle 序列链接到特定列的触发器。顺便说一句,它不是“主机变量” - 只是参考。例如,同一触发器可能会在更新和插入时触发,因此您必须指定要引用的内容:新变量或旧变量。您可以在 MS-SQL 中执行此操作,但不能在 Oracle 中执行此操作。

于 2012-10-22T15:51:45.497 回答