使用查詢 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 類別。
-
使用
query方法執行查詢。此方法會傳回QueryResult的 Promise ,這是包含結果資料列陣列與連續索引鍵的純 JavaScript 物件。您可以透過兩種方式使用query方法:-
對於最多只能存取一個資料列的查詢,您只能呼叫
query方法一次。這些查詢只能包含以主索引鍵為基礎的 Select 陳述式 (where 子句必須根據完整主索引鍵指定相等)。在所有其他情況下,您可以在迴圈中使用query或queryIterable方法。 -
您可以在迴圈中呼叫
query方法,以擷取多個資料列。由於查詢傳回的資料量受系統預設值限制,因此可藉由在queryone 呼叫query方法的QueryOpt引數中設定maxReadKB特性來進一步限制,無法傳回所有可用的結果。若要解決此問題,請以迴圈方式執行查詢,直到QueryResult中的continuationKey變成空值 / 未定義為止。
-
-
使用
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 方法,然後重複產生的非同步列舉項目。您可以將選項傳送至這些方法的每個方法,如 QueryOptions。QueryAsync 方法傳回 Task<QueryResult<RecordValue>>。QueryResult 包含作為 RecordValue 實例清單的查詢結果,以及其他資訊。當您的查詢指定了完整的主索引鍵時,就足以呼叫 QueryAsync 一次。查詢所傳回的資料量受系統限制。也可透過設定 QueryOptions 的 MaxReadKB 特性進一步加以限制。這表示一個 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,以瞭解如何從此處的父項子項表格擷取資料。