首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pro*C中的Informix“序列”到Oracle编号/序列/触发器

Pro*C中的Informix“序列”到Oracle编号/序列/触发器
EN

Stack Overflow用户
提问于 2011-12-16 22:35:13
回答 2查看 943关注 0票数 1

我正在尝试将一些Informix ESQL转换为Oracle Pro*C。在现有的Informix代码中,“串行”数据类型用于指示自动递增的列。根据Oracle文档,Oracle Migration Workbench for Informix应该能够处理此问题,并解释了它将“序列”数据类型转换为具有关联的Oracle序列和触发器的“数字”。但是,当尝试运行该工具时,它会简单地将单词“序列”替换为“错误(序列)”,因此我一直在尝试手动添加触发器/序列。

他们的例子在这里:http://docs.oracle.com/html/B16022_01/ch2.htm#sthref112展示了一种可以做到这一点的方法。然而,当尝试创建触发器时,序列看起来相当简单:

代码语言:javascript
复制
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文档中的示例中的触发器/序列/列名。)

EN

回答 2

Stack Overflow用户

发布于 2011-12-21 23:51:58

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

代码语言:javascript
复制
char sql_buf[4096+1];
snprintf(sql_buf, 4096, <sql>);
EXEC SQL IMMEDIATE :sql_buf;

这绕过了预处理器,因此允许语句顺利通过。

票数 1
EN

Stack Overflow用户

发布于 2012-10-22 23:51:45

如果不使用“主机变量”指定列名,就不可能创建将Oracle序列链接到特定列的触发器。顺便说一句,它不是“主机变量”--只是引用。例如,相同的触发器可能会在update和insert上触发,因此您必须指定引用的是什么:新变量还是旧变量。您可以在MS-SQL中执行此操作,但不能在Oracle中执行此操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8535647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档