使用查詢 API 擷取資料

您可以使用 QueryRequest 來建構查詢,從您的 NoSQL 表格篩選資料。

若要執行查詢,請使用 NoSQLHandle.query() API。請參閱 Oracle NoSQL Java SDK API Reference ,瞭解各種類別和方法的詳細資訊。

有兩種方法可以取得查詢結果:使用重複程式或迴圈部份結果。

  • 重複程式:使用 NoSQLHandle.queryIterable(QueryRequest) 取得包含所有結果的可重複項目。

  • 部分結果:若要計算和擷取查詢的完整結果集,一般而言,相同的 QueryRequest 執行處理必須執行多次 (透過 NoSQLHandle.query(oracle.nosql.driver.ops.QueryRequest))。每個執行都會傳回一個 QueryRequest,其中包含結果集的子集。

String sqlstmt_allrows="SELECT * FROM stream_acct";
private static void fetchRows(NoSQLHandle handle,String sqlstmt)
                                              throws Exception {
   try (
      QueryRequest queryRequest =
            new QueryRequest().setStatement(sqlstmt_allrows);

      QueryIterableResult results =
            handle.queryIterable(queryRequest)){

      for (MapValue res : results) {
         System.out.println("\t" + res);
      }
   }
}

您也可以使用查詢中的 WHERE 子句來套用篩選條件。

String sqlstmt_allrows=
"SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct WHERE acct_id=1";

此處的範例下載完整程式碼 QueryData.java

注意:若要從子項表格擷取資料,請在 sql 敘述句中指定表格 (parent_tablename.child_tablename) 的全名。從範例下載完整程式碼 TableJoins.java,以瞭解如何從此處的父項子項表格擷取資料。

若要執行查詢,請使用 borneo.NoSQLHandle.query() 方法。

有兩種方法可以取得查詢結果:使用重複程式或迴圈部份結果。

  • 使用 borneo.NoSQLHandle.query_iterable() 可取得包含查詢之所有結果的可重複項目。

  • 您可以使用 borneo.NoSQLHandle.query() 方法對整個局部結果執行迴圈。例如,若要執行 SELECT 查詢來從表格讀取資料,borneo.QueryResult 會包含結果清單。如果 borneo.QueryRequest.is_done() 傳回 False,則可能會有更多結果,因此通常應以迴圈方式執行查詢。單一要求不傳回任何結果,但查詢仍未完成,表示查詢迴圈應該繼續。

sqlstmt = 'SELECT * FROM stream_acct'

def fetch_data(handle,sqlstmt):
   request = QueryRequest().set_statement(sqlstmt)
   print('Query results for: ' + sqlstmt)

   result = handle.query(request)
   for r in result.get_results():
      print('\t' + str(r))

您也可以使用查詢中的 WHERE 子句來套用篩選條件。

sqlstmt = 'SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct WHERE acct_id=1'

請從此處的範例下載完整程式碼 QueryData.py

注意:若要從子項表格擷取資料,請在 sql 敘述句中指定表格 (parent_tablename.child_tablename) 的全名。從範例下載完整代碼 TableJoins.py,以瞭解如何從此處的父項子項表格擷取資料。

若要執行查詢,請使用 Client.Query 函數。在雲端服務上執行時,單一查詢要求所讀取的資料量會受到系統預設值的限制,並可使用 QueryRequest.MaxReadKB 進一步限制。這會限制讀取的資料量,而不會限制傳回的資料量,這表示查詢可以傳回零結果,但仍有更多要讀取的資料。因此,查詢應該一律在迴圈中作業,取得更多結果,直到 QueryRequest.IsDone() 傳回 true,表示查詢已完成為止。

querystmt := "select * FROM stream_acct"

func fetchData(client *nosqldb.Client, err error,
               tableName string, querystmt string)(){
   prepReq := &nosqldb.PrepareRequest{ Statement: querystmt,}

   prepRes, err := client.Prepare(prepReq)
   if err != nil {
      fmt.Printf("Prepare failed: %v\n", err)
      return
   }

   queryReq := &nosqldb.QueryRequest{
		 PreparedStatement: &prepRes.PreparedStatement,}
   var results []*types.MapValue

   for {
      queryRes, err := client.Query(queryReq)
      if err != nil {
         fmt.Printf("Query failed: %v\n", err)
	  return
      }
      res, err := queryRes.GetResults()

      if err != nil {
         fmt.Printf("GetResults() failed: %v\n", err)
  	return
      }

      results = append(results, res...)
      if queryReq.IsDone() {
         break
      }
   }
   for i, r := range results {
      fmt.Printf("\t%d: %s\n", i+1,
                  jsonutil.AsJSON(r.Map()))
   }
}

您也可以使用查詢中的 WHERE 子句來套用篩選條件。

querystmt := "SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct where acct_id=1"

請從此處的範例下載完整程式碼 QueryData.go

注意:若要從子項表格擷取資料,請在 sql 敘述句中指定表格 (parent_tablename.child_tablename) 的全名。從範例下載完整的代碼 TableJoins.go,以瞭解如何從此處的父項子項表格擷取資料。

您可以使用下列其中一種方法,從 NoSQL 表格查詢資料。如需方法詳細資訊,請參閱 NoSQLClient 類別。

  1. 使用 query 方法執行查詢。此方法會傳回 QueryResultPromise ,這是包含結果資料列陣列與連續索引鍵的純 JavaScript 物件。您可以透過兩種方式使用 query 方法:

    • 對於最多只能存取一個資料列的查詢,您只能呼叫 query 方法一次。這些查詢只能包含以主索引鍵為基礎的 Select 陳述式 (where 子句必須根據完整主索引鍵指定相等)。在所有其他情況下,您可以在迴圈中使用 queryqueryIterable 方法。

    • 您可以在迴圈中呼叫 query 方法,以擷取多個資料列。由於查詢傳回的資料量受系統預設值限制,因此可藉由在 queryone 呼叫 query 方法的 QueryOpt 引數中設定 maxReadKB 特性來進一步限制,無法傳回所有可用的結果。若要解決此問題,請以迴圈方式執行查詢,直到 QueryResult 中的 continuationKey 變成空值 / 未定義為止。

  2. 使用 queryIterable 方法在查詢結果上重複。這個方法會傳回一個可重複的物件,您可以使用 for-await-of 迴圈來加以重複。您不需要使用此方法來管理延續。

注意:queryIterable 方法中,您也可以使用 QueryOpt 引數搭配 continuationKey 以外的特性。

JavaScript:請從此處的範例下載完整程式碼 QueryData.js

const querystmt = 'SELECT * FROM stream_acct';

async function fetchData(handle,querystmt) {
    const opt = {};

    try {
        do {
            const result = await handle.query(querystmt, opt);
            for(let row of result.rows) {
                console.log('  %O', row);
            }

            opt.continuationKey = result.continuationKey;
        } while(opt.continuationKey);
    } catch(error) {
        console.error('  Error: ' + error.message);
    }
}

您也可以使用查詢中的 WHERE 子句來套用篩選條件。

const querystmt =
'SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct WHERE acct_id=1';

TypeScript:您可以針對 TypeScript 使用上述 JavaScript 中描述的方法。您也可以提供選擇性查詢結果綱要作為 query 方法的 type 參數,以提供 QueryResult 中傳回之資料列的 type 提示。這不一定要與表格資料列綱要相同 (除非使用 SELECT 查詢),因為查詢可以包括預估、名稱別名、聚總值等等。Download the full code QueryData.ts from the examples here.

interface StreamInt {
   acct_Id: Integer;
   profile_name: String;
   account_expiry: TIMESTAMP;
   acct_data: JSON;
}
/* fetches data from the table */
async function fetchData(handle: NoSQLClient,querystmt: string) {
   const opt = {};
   try {
      do {
         const result = await handle.query<StreamInt>(querystmt, opt);
         for(let row of result.rows) {
            console.log('  %O', row);
         }
         opt.continuationKey = result.continuationKey;
      } while(opt.continuationKey);
   } catch(error) {
      console.error('  Error: ' + error.message);
   }
}

您也可以使用查詢中的 WHERE 子句來套用篩選條件。

const querystmt =
'SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct WHERE acct_id=1';

注意:若要從子項表格擷取資料,請在 sql 敘述句中指定表格 (parent_tablename.child_tablename) 的全名。從 TableJoins.js 此處下載完整 JavaScript 程式碼與 TypeScript 完整的程式碼 TableJoins.ts 此處以瞭解如何從父項子項表格擷取資料。

若要執行查詢,您可以呼叫 QueryAsync 方法或呼叫 GetQueryAsyncEnumerable 方法,然後重複產生的非同步列舉項目。您可以將選項傳送至這些方法的每個方法,如 QueryOptionsQueryAsync 方法傳回 Task<QueryResult<RecordValue>>QueryResult 包含作為 RecordValue 實例清單的查詢結果,以及其他資訊。當您的查詢指定了完整的主索引鍵時,就足以呼叫 QueryAsync 一次。查詢所傳回的資料量受系統限制。也可透過設定 QueryOptionsMaxReadKB 特性進一步加以限制。這表示一個 QueryAsync 呼叫可能無法傳回所有可用的結果。這種情況是使用連續關鍵碼來加以處理。QueryResult 中的非空值連續索引鍵表示可能有更多查詢結果。這表示查詢應該在迴圈中執行,迴圈直到連續索引鍵變成空值為止。如需所有類別和方法的詳細資訊,請參閱 Oracle NoSQL Dotnet SDK API Reference

private const string querystmt ="SELECT * FROM stream_acct";

private static async Task fetchData(NoSQLClient client,String querystmt){
   var queryEnumerable = client.GetQueryAsyncEnumerable(querystmt);
   await DoQuery(queryEnumerable);
 }

//function to display result
private static async Task
   DoQuery(IAsyncEnumerable<QueryResult<RecordValue>> queryEnumerable){
   Console.WriteLine("  Query results:");

   await foreach (var result in queryEnumerable) {
      foreach (var row in result.Rows)
      {
         Console.WriteLine();
         Console.WriteLine(row.ToJsonString());
      }
   }
}

您也可以使用查詢中的 WHERE 子句來套用篩選條件。

private const string querystmt =
"SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct WHERE acct_id=1";

此處的範例下載完整程式碼 QueryData.cs

注意:若要從子項表格擷取資料,請在 sql 敘述句中指定表格 (parent_tablename.child_tablename) 的全名。從範例下載完整的代碼 TableJoins.cs,以瞭解如何從此處的父項子項表格擷取資料。