問合せAPIを使用したデータのフェッチ

QueryRequestを使用して、NoSQL表のデータをフィルタ処理する問合せを作成できます。

問合せを実行するには、NoSQLHandle.query() APIを使用します。様々なクラスおよびメソッドの詳細は、Oracle NoSQL Java SDK APIリファレンスを参照してください。

問合せの結果を取得するには、イテレータを使用するか、部分的な結果をループするかの2つの方法があります。
  • イテレータ: 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()メソッドを使用します。

問合せの結果を取得するには、イテレータを使用するか、部分的な結果をループするかの2つの方法があります。
  • 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メソッドを使用して、問合せを実行します。このメソッドは、結果の行の配列および継続キーを含むプレーンJavaScriptオブジェクトであるQueryResultPromiseを返します。queryメソッドは、2つの方法で使用できます。
    • queryメソッドは、最大1行にアクセスする問合せに対して1回のみコールできます。これらの問合せには、主キーに基づくSELECT文のみを含めることができます(where句では、完全な主キーに基づいて等価を指定する必要があります)。これ以外の場合はすべて、ループまたはqueryIterableメソッドでqueryを使用できます。
    • ループでqueryメソッドをコールして、複数の行を取得できます。問合せによって返されるデータの量はシステム・デフォルトによって制限され、queryメソッドの1回の呼出しでqueryQueryOpt引数にmaxReadKBプロパティを設定すると、使用可能なすべての結果を返すことができないため、さらに制限できます。この問題に対処するには、QueryResultcontinuationKeynull/undefinedになるまで、問合せをループで実行します。
  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:前述のJavaScriptで説明した同じメソッドをTypeScriptに使用できます。オプションの問合せ結果スキーマを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);
   }
}
また、問合せで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)を指定します。完全なJavaScriptコードTableJoins.jsここをダウンロードし、完全なTypeScriptコードTableJoins.tsここをダウンロードして、親子表からデータをフェッチする方法を理解します。

問合せを実行するには、QueryAsyncメソッドをコールするか、GetQueryAsyncEnumerableメソッドをコールして、結果の非同期列挙可能性に対して反復処理します。これらの各メソッドにQueryOptionsとしてオプションを渡すことができます。QueryAsyncメソッドはTask<QueryResult<RecordValue>>を返します。QueryResultには、RecordValueインスタンスのリストおよびその他の情報として問合せ結果が含まれています。問合せで完全な主キーが指定されている場合は、QueryAsyncを1回コールすれば十分です。問合せによって返されるデータ量は、システムによって制限されます。QueryOptionsMaxReadKBプロパティを設定することでさらに制限することもできます。つまり、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());
      }
   }
}
また、問合せで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をダウンロードして、ここで親子表からデータをフェッチする方法を理解します。