X DevAPI 用户指南  / 第 9 章 使用结果集  /  9.5 使用 SQL 结果集

9.5 使用 SQL 结果集

sql()当您使用返回 SqlResult 的方法在 Session 上执行 SQL 操作时 。迭代 SqlResult 与处理来自 CRUD 操作的结果相同。以下示例假定用户表存在。

res = mySession.sql('SELECT name, age FROM users').execute()

row = res.fetch_one()

while row:
    print('Name: %s\n' % row[0])
    print(' Age: %s\n' % row.age)
    row = res.fetch_one()

SqlResult 与 CRUD 操作返回的结果的不同之处在于结果集和数据集的表示方式。SqlResult 将生成的结果集(例如,生成的 INSERT)和数据集(例如,生成的)合并为SELECT一个。与 CRUD 操作不同,这两种类型之间没有区别。SqlResult 导出用于数据访问和检索最后插入的 id 或受影响的行数的方法。

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

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

res = mySession.sql('CALL my_proc()').execute()

if res.has_data():

    row = res.fetch_one()
    if row:
        print('List of rows available for fetching.')
        while row:
            print(row)
            row = res.fetch_one()
    else:
        print('Empty list of rows.')
else:
    print('No row result.')

调用 eitherfetchOne()fetchAll()whenhasResult() 表示 SQLResult 不是数据集是错误的。

def print_result(res):
  if res.has_data():
    # SELECT
    columns = res.get_columns()
    record = res.fetch_one()

    while record:
      index = 0

      for column in columns:
        print("%s: %s \n" % (column.get_column_name(), record[index]))
        index = index + 1

      # Get the next record
      record = res.fetch_one()
  else:
    #INSERT, UPDATE, DELETE, ...
    print('Rows affected: %s' % res.get_affected_items_count())

print_result(mySession.sql('DELETE FROM users WHERE age < 30').execute())
print_result(mySession.sql('SELECT * FROM users WHERE age = 40').execute())

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

def print_result(res):
  if res.has_data():
    # SELECT
    columns = res.get_columns()
    record = res.fetch_one()

    while record:
      index = 0

      for column in columns:
        print("%s: %s \n" % (column.get_column_name(), record[index]))
        index = index + 1

      # Get the next record
      record = res.fetch_one()
  else:
    #INSERT, UPDATE, DELETE, ...
    print('Rows affected: %s' % res.get_affected_items_count())

res = mySession.sql('CALL my_proc()').execute()

# Prints each returned result
more = True
while more:
  print_result(res)
  more = res.next_result()

结果集的数量在查询执行后并不知道。查询结果可以流式传输到客户端或在客户端进行缓冲。在流式或部分缓冲模式下,客户端无法判断查询是否发出多个结果集。