Informix“;连载;到Pro*C中的Oracle编号/序列/触发器

Informix“;连载;到Pro*C中的Oracle编号/序列/触发器,oracle,triggers,auto-increment,informix,embedded-sql,Oracle,Triggers,Auto Increment,Informix,Embedded Sql,我正在尝试将一些Informix ESQL转换为Oracle Pro*C。在现有Informix代码中,“串行”数据类型用于指示自动递增的列。根据Oracle文档,OracleMigrationWorkbench for Informix应该能够处理这个问题,并解释说它将“串行”数据类型转换为带有关联Oracle序列和触发器的“数字”。然而,当尝试运行该工具时,它只是将“SERIAL”一词替换为“ERROR(SERIAL)”,因此我一直在尝试手动添加触发器/序列 他们在这里的例子:展示了一种可以

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

他们在这里的例子:展示了一种可以做到这一点的方法。但是,当尝试创建这样的触发器时,顺序似乎相当直接:

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文档中示例中的触发器/序列/列名。)

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

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

这绕过了预处理器,因此允许语句毫无怨言地通过。

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

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

这绕过了预处理器,因此允许语句毫无怨言地通过。

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

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

为什么不使用SQL脚本创建触发器?我不认为有必要在C程序中执行此操作。现有的ESQL程序是用C编写的,我的任务是将现有代码全部转换为现在使用的Pro*C。不幸的是,我没有权限更改它的工作方式。为什么不使用SQL脚本创建触发器?我不认为有必要在C程序中这样做。现有的ESQL程序是用C编写的,我的任务是将现有的代码全部转换为现在使用的Pro*C。不幸的是,我没有权力对它的工作方式做那么多的更改。