【问题标题】:Informix "SERIAL" to Oracle NUMBER/Sequence/Trigger in Pro*CInformix "SERIAL" 到 Pro*C 中的 Oracle NUMBER/Sequence/Trigger
【发布时间】:2012-01-22 01:36:48
【问题描述】:

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

【问题讨论】:

  • 为什么不用 SQL 脚本创建触发器呢?我认为不需要在 C 程序中执行此操作。
  • 现有的 ESQL 程序是用 C 编写的,我的任务是将现有的代码批量转换为现在使用 Pro*C。不幸的是,我无权改变它的工作方式。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      相关资源
      最近更新 更多