如何在Pro*C中通过单查询获取n个序列递增值(用宿主数组)
批量获取序列值到Pro*C宿主数组的方案
可以通过以下两种无需循环的方式,一次性获取n个myseq.nextval值并存入宿主数组vec:
方案一:嵌入PL/SQL块+BULK COLLECT
利用PL/SQL的集合特性和BULK COLLECT批量抓取数据,再通过FORALL将集合值赋值给宿主数组,仅需一次数据库交互。
代码示例:
EXEC SQL BEGIN DECLARE SECTION; unsigned* vec; unsigned n; unsigned arr_len; // 用于绑定数组长度 EXEC SQL END DECLARE SECTION; n = /* 输入的目标数量 */; vec = (unsigned*)malloc(n * sizeof(unsigned)); arr_len = n; // 嵌入PL/SQL块批量获取序列值 EXEC SQL EXECUTE DECLARE TYPE id_table_type IS TABLE OF NUMBER INDEX BY PLS_INTEGER; temp_ids id_table_type; BEGIN -- 生成n行数据并批量获取序列值 SELECT myseq.nextval BULK COLLECT INTO temp_ids FROM dual CONNECT BY LEVEL <= :arr_len; -- 将集合值批量赋值给宿主数组(注意PL/SQL索引从1开始,C数组从0开始) FORALL idx IN 1..temp_ids.COUNT :vec[idx-1] := temp_ids(idx); END; END-EXEC;
方案二:SQL查询+Pro*C数组FETCH
通过CONNECT BY生成n行数据,结合Pro*C的ARRAYLEN指定宿主数组长度,一次性将查询结果填充到数组中。
代码示例:
EXEC SQL BEGIN DECLARE SECTION; unsigned* vec; unsigned n; unsigned arr_len; EXEC SQL END DECLARE SECTION; n = /* 输入的目标数量 */; vec = (unsigned*)malloc(n * sizeof(unsigned)); arr_len = n; -- 告知数据库宿主数组的可容纳行数 EXEC SQL ARRAYLEN :vec :arr_len; -- 一次性查询n个序列值并写入数组 EXEC SQL SELECT myseq.nextval INTO :vec FROM dual CONNECT BY LEVEL <= :arr_len;
注意事项
- 若
n值较大,建议给序列myseq设置足够大的缓存,减少磁盘IO开销。 - 宿主数组
vec必须提前分配足够内存,长度需与n严格匹配。 - PL/SQL集合索引从1开始,C语言数组索引从0开始,赋值时需注意索引转换。
内容的提问来源于stack exchange,提问作者ABu
相关产品推荐
相关产品推荐

