問合せAPIの使用によるデータのフェッチ
QueryRequest
を使用して、NoSQL表からのデータをフィルタする問合せを作成できます。
問合せを実行するには、NoSQLHandle.query()
APIを使用します。様々なクラスおよびメソッドの詳細は、Oracle NoSQL Java SDK APIリファレンスを参照してください。
- イテレータ:
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);
}
}
}
String sqlstmt_allrows=
"SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct WHERE acct_id=1";
問合せを実行するには、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))
sqlstmt = 'SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct WHERE acct_id=1'
問合せを実行するには、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()))
}
}
querystmt := "SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct where acct_id=1"
query
メソッドを使用して問合せを実行します。このメソッドでは、QueryResult
のPromiseが返されます。これは、結果となる行の配列、および継続キーを含む、プレーンなJavaScriptオブジェクトです。query
メソッドは次の2つの方法で使用できます:query
メソッドは、最大1行にアクセスする問合せの場合に1回のみコールできます。これらの問合せに含めることができるのは、主キーに基づくSELECT文のみです(where句では、完全な主キーに基づいて等価を指定する必要がある)。他のすべての事例では、ループまたはqueryIterable
メソッドでquery
を使用できます。- ループで
query
メソッドをコールして、複数の行を取得できます。問合せで返されるデータの量はシステム・デフォルトによって制限されており、query
のQueryOpt
引数にmaxReadKB
プロパティを設定することでさらに制限できます。そのため、query
メソッドの呼出し1回では、入手可能なすべての結果が返されない可能性があります。この問題に対処するには、QueryResult
でのcontinuationKey
がnull/undefinedになるまで、問合せをループで実行します。
queryIterable
メソッドを使用して、問合せ結果を反復処理します。このメソッドでは、for-await-ofループを使用して反復処理できる反復可能オブジェクトが返されます。このメソッドではその継続を管理する必要はありません。ノート:
queryIterable
メソッドでは、QueryOpt
引数をcontinuationKey
以外のプロパティとともに使用することもできます。
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);
}
}
const querystmt =
'SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct WHERE acct_id=1';
query
メソッドにtypeパラメータとしてオプションの問合せ結果スキーマを指定して、QueryResult
で返される行について、typeヒントを指定することもできます。これは、表の行スキーマと同じである必要はありません(SELECT *問合せを使用する場合を除く)。これは、問合せに予測、名前の別名、集計値などを含めることができるためです。こちらにあるサンプルの中からフル・コードQueryData.tsをダウンロードします。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);
}
}
const querystmt =
'SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct WHERE acct_id=1';
問合せを実行するには、QueryAsync
メソッドをコールするか、GetQueryAsyncEnumerable
メソッドをコールして、結果の非同期列挙可能性に対して反復処理します。これらの各メソッドにQueryOptions
としてオプションを渡すことができます。QueryAsync
メソッドではTask<QueryResult<RecordValue>>
が返されます。QueryResult
には、RecordValueインスタンスのリストとして問合せ結果が含まれており、その他の情報も含まれています。問合せで完全な主キーが指定されている場合は、QueryAsync
を1回コールすれば十分です。問合せによって返されるデータ量は、システムによって制限されます。また、QueryOptions
のMaxReadKB
プロパティを設定することで、それをさらに制限することもできます。つまり、QueryAsync
の呼出し1回では、入手可能なすべての結果が返されない場合があります。この状況は、継続キーを使用して処理されます。QueryResult
でのnull以外の継続キーは、さらに問合せ結果を入手できることを意味しています。つまり、問合せはループで実行する必要があり、継続キーがnullになるまでループされます。すべてのクラスおよびメソッドの詳細は、Oracle NoSQL Dotnet SDK APIリファレンスを参照してください。
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());
}
}
}
private const string querystmt =
"SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct WHERE acct_id=1";