程序使用 FETCH 语句来检索输出的每一行。此语句命名游标,且还可命名接收该数据的
主变量。下列示例展示完整的 GBase 8s ESQL/C 代码:
EXEC SQL DECLARE the_item CURSOR FOR
SELECT order_num, item_num, stock_num
INTO :o_num, :i_num, :s_num
FROM items;
EXEC SQL OPEN the_item;
while(SQLCODE == 0)
{
EXEC SQL FETCH the_item;
if(SQLCODE == 0)
printf("%d, %d, %d", o_num, i_num, s_num);
}
检测数据的结束
在前面的示例中,WHILE 条件在 OPEN 语句返回错误时阻止执行循环。当将 SQLCODE
设置为 100 来标志数据的结束时,
相同的条件会终止该循环。
然而,
该循环包含 SQLCODE
的测试。
此测试是必需的,
因为如果 SELECT 语句是有效的但找不到相匹配的行,
则 OPEN
语句返回零,但第一次访存返回 100(数据的结束)并不返回任何数据。下列示例展示编写
同一循环的另一种方式:
EXEC SQL DECLARE the_item CURSOR FOR
SELECT order_num, item_num, stock_num
INTO :o_num, :i_num, :s_num
FROM items;
EXEC SQL OPEN the_item;
if(SQLCODE == 0)
EXEC SQL FETCH the_item; /* fetch 1st row*/
while(SQLCODE == 0)
{
printf("%d, %d, %d", o_num, i_num, s_num);
EXEC SQL FETCH the_item;
GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 213 -
}
在此版本中,
早已处理了无返回行的情况,
因此,
在循环中不存在第二次 SQLCODE 测试。
由于 SQLCODE 测试的时间成本是访存成本的很小一部分,
因此这些版本在性能上没有多
大差异。
定位 INTO 子句
INTO 子句命名要接收数据库服务器返回的数据的主变量。
INTO 必须出现在 SELECT 或
FETCH 语句中。然而,它不可同时出现在两个语句中。下列示例指定 FETCH 语句中的
主变量:
EXEC SQL DECLARE the_item CURSOR FOR
SELECT order_num, item_num, stock_num
FROM items;
EXEC SQL OPEN the_item;
while(SQLCODE == 0)
{
EXEC SQL FETCH the_item INTO :o_num, :i_num, :s_num;
if(SQLCODE == 0)
printf("%d, %d, %d", o_num, i_num, s_num);
}
此形式允许您将不同的行访存到不同的位置内。例如,您可以使用此形式来将连续的行访
存到数组的连续元素内。