collect.ec 示例程序说明如何使用集合变量来访问 LIST、SET 和 MULTISET 列。该 SELECT 语句被认为是静态的,因为当编写程序时,确定它访问的列。 /* ** ** Sample use of collections in ESQL/C. ** ** Statically determined LIST, SET, and MULTISET collection types. */
GBase 8s ESQL/C 编程指南 南大通用数据技术股份有限公司 - 441 -
#include
static void print_collection( const char *tag, EXEC SQL BEGIN DECLARE SECTION; parameter client collection c EXEC SQL END DECLARE SECTION; ) { EXEC SQL BEGIN DECLARE SECTION; int4 value; EXEC SQL END DECLARE SECTION; mint item = 0;
EXEC SQL WHENEVER ERROR STOP; printf("COLLECTION: %s\n", tag); EXEC SQL DECLARE c_collection CURSOR FOR SELECT * FROM TABLE(:c); EXEC SQL OPEN c_collection; while (sqlca.sqlcode == 0) { EXEC SQL FETCH c_collection INTO :value; if (sqlca.sqlcode != 0) break; printf("\tItem %d, value = %d\n", ++item, value); } EXEC SQL CLOSE c_collection; EXEC SQL FREE c_collection; }
mint main(int argc, char **argv) {
GBase 8s ESQL/C 编程指南 南大通用数据技术股份有限公司 - 442 -
EXEC SQL BEGIN DECLARE SECTION; client collection list (integer not null) lc1; client collection set (integer not null) sc1; client collection multiset (integer not null) mc1; char *dbase = "stores7"; mint seq; char *stmt1 = "INSERT INTO t_collections VALUES(0, " "'LIST{-1,0,-2,3,0,0,32767,249}', 'SET{-1,0,-2,3}', " "'MULTISET{-1,0,0,-2,3,0}') "; EXEC SQL END DECLARE SECTION;
if (argc > 1) dbase = argv[1]; EXEC SQL WHENEVER ERROR STOP; printf("Connect to %s\n", dbase); EXEC SQL connect to :dbase;
EXEC SQL CREATE TEMP TABLE t_collections ( seq serial not null, l1 list (integer not null), s1 set (integer not null), m1 multiset(integer not null) ); EXEC SQL EXECUTE IMMEDIATE :stmt1;