當您使用 sql() 方法在工作階段上執行 SQL 操作時,會傳回 SqlResult。反覆查看 SqlResult 與使用來自 CRUD 操作的結果相同。下列範例假設 users 表格存在。
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 的兩種型別之間沒有區別。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.')
當 hasData() 指出 SqlResult 不是資料集時,呼叫 fetchOne() 或 fetchAll() 會產生錯誤。
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()
查詢執行後不會立即知道結果集的數量。查詢結果可以串流至用戶端或在用戶端緩衝。在串流或部分緩衝模式中,用戶端無法判斷查詢是否發出多個結果集。