9.5使用SQL结果集

类在会话上执行SQL操作时sql ()方法返回SqlResult。迭代SqlResult与处理来自CRUD操作的结果是相同的。下面的例子假设users表已经存在。

var res = mySession。sql('SELECT name, age FROM users').execute();var行;而(行= res.fetchOne()){打印(“名字:”+行(“名字”)+ ' \ n ');print('年龄:' +行。年龄+ '\n');}

SqlResult与CRUD操作返回的结果的不同之处在于结果集和数据集的表示方式。SqlResult组合了一个结果集,例如,插入,以及数据集,该数据集由,例如,选择在一个。与CRUD操作不同,这两种类型之间没有区别。SqlResult导出用于数据访问和检索最后插入的id或受影响行数的方法。

使用hasData ()方法来学习SqlResult是数据集还是结果。当要编写的代码不知道SqlResult的起源时,该方法非常有用。在编写通用应用程序函数以打印查询结果或处理存储过程结果时可能会出现这种情况。如果hasData ()返回true,那么SqlResult的来源是选择或类似的命令,可以返回行。

返回值为true并不表示数据集是否包含任何行。数据集可以是空的,例如如果是空的fetchOne ()返回NULL或fetchAll ()返回一个空列表。下面的例子假设过程my_proc的存在。

var res = mySession。sql('调用my_proc () ') . execute ();if (res.hasData()){var row = res.fetchOne();if (row){print('可用于获取的行列表。');Do{打印(行);} while (row = res.fetchOne());} else{print('空的行列表。');}} else {print('无行结果。');}

调用任何一个都是错误的fetchOne ()fetchAll ()hasResult ()表示SqlResult不是一个数据集。

function print_result(res) {if (res. hasdata ()) {// SELECT var columns = res. getcolumns ();var record = res.fetchOne();while (record){for(列中的索引){print (columns[index].getColumnName() + ": " + record[index] + "\n");} //获取下一个记录record = res.fetchOne();}} else{//插入,更新,删除,…print('受影响的行:' + res.getAffectedItemsCount());}} print_result(mySession。sql('DELETE FROM users WHERE age < 30').execute());print_result (mySession。sql('SELECT * FROM WHERE age = 40').execute());

调用存储过程可能导致在一次执行中必须处理多个结果集。查询执行的结果是返回一个SqlResult对象,它封装了第一个结果集。处理结果集后,您可以调用nextResult ()向前移动到下一个结果(如果有)。一旦进入下一个结果集,它将替换之前加载的结果,然后该结果将变得不可用。

function print_result(res) {if (res. hasdata ()) {// SELECT var columns = res. getcolumns ();var record = res.fetchOne();while (record){for(列中的索引){print (columns[index].getColumnName() + ": " + record[index] + "\n");} //获取下一个记录record = res.fetchOne();}} else{//插入,更新,删除,…print('受影响的行:' + res.getAffectedItemsCount());}} var res = mySession。sql('调用my_proc () ') . execute ();//打印每个返回的结果var more = true;While (more){print_result(res); more = res.nextResult(); }

查询执行后,结果集的数量不会立即知道。查询结果可以流到客户端,也可以在客户端进行缓冲。在流或部分缓冲模式下,客户端无法判断一个查询是否产生多个结果集。