main { EXEC SQL BEGIN DECLARE SECTION; int a; collection b; EXEC SQL END DECLARE SECTION; EXEC SQL allocate collection :b; EXEC SQL select set_col into :b from table1 where int_col = 6; EXEC SQL declare set_curs cursor for select * from table(:b) for update; EXEC SQL open set_curs; while (SQLCODE != SQLNOTFOUND) { EXEC SQL fetch set_curs into :a; if (a = 4) { EXEC SQL update table(:b)(x) set x = 10 where current of set_curs; break; } } EXEC SQL update table1 set set_col = :b where int_col = 6; EXEC SQL deallocate collection :b; EXEC SQL close set_curs; EXEC SQL free set_curs; }
执行这个 GBase 8s ESQL/C 程序以后,表 table1 的 set_col 列具有值 {1,8,10,5,2}。
这个 GBase 8s ESQL/C 程序定义了两个 collection 变量,a 和 b,并且从 table1 中选择了一个 SET 到 b.。WHERE 子句确保只返回一行。然后程序定义一个集合游标,它从 b 中一次选择一个元素到 a。当程序找到值为 4 的元素时,第一个 UPDATE 语句把该元素的值改为 10 并退出循环。
在第一个 UPDATE 语句中,x 是一个派生列名,用来在集合派生表中更新当前元素。第二个 UPDATE 语句用新的集合更新基表 table1。
有关如何在 GBase 8s ESQL/C 中使用 collection 主变量的信息,请参阅 GBase 8s ESQL/C 程序员手册 中关于复杂数据类型的讨论。