我正在尝试将一些Informix ESQL转换为Oracle Pro*C。在现有的Informix代码中,“串行”数据类型用于指示自动递增的列。根据Oracle文档,Oracle Migration Workbench for Informix应该能够处理此问题,并解释了它将“序列”数据类型转换为具有关联的Oracle序列和触发器的“数字”。但是,当尝试运行该工具时,它会简单地将单词“序列”替换为“错误(序列)”,因此我一直在尝试手动添加触发器/序列。
他们的例子在这里: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文档中的示例中的触发器/序列/列名。)
发布于 2011-12-21 23:51:58
我设法通过使用"EXEC SQL EXECUTE IMMEDIATE“语句解决了这个问题。
char sql_buf[4096+1];
snprintf(sql_buf, 4096, <sql>);
EXEC SQL IMMEDIATE :sql_buf;这绕过了预处理器,因此允许语句顺利通过。
发布于 2012-10-22 23:51:45
如果不使用“主机变量”指定列名,就不可能创建将Oracle序列链接到特定列的触发器。顺便说一句,它不是“主机变量”--只是引用。例如,相同的触发器可能会在update和insert上触发,因此您必须指定引用的是什么:新变量还是旧变量。您可以在MS-SQL中执行此操作,但不能在Oracle中执行此操作。
https://stackoverflow.com/questions/8535647
复制相似问题