Query APIを使用したデータのフェッチ

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

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

問合せの結果を取得する方法は2つあります。イテレータを使用する方法か、ループを使用して結果を1部分ずつ取得する方法です。

  • イテレータ: 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つあります。イテレータを使用する方法か、ループを使用して結果を1部分ずつ取得する方法です。

  • 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メソッドは次の2つの方法で使用できます:

    • queryメソッドは、最大1行にアクセスする問合せの場合1回のみコールできます。これらの問合せに含めることができるのは、主キーに基づくSELECT文のみです(where句では、完全な主キーに基づいて等価を指定する必要がある)。他のすべての事例では、ループまたはqueryIterableメソッドでqueryを使用できます。

    • ループでqueryメソッドをコールして、複数の行を取得できます。As the amount of data returned by a query is limited by the system default and can be further limited by setting the maxReadKB property in the QueryOpt argument of the queryone invocation of the query method can’t return all the available results. この問題に対処するには、QueryResultでのcontinuationKeynull/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)を指定します。Download the full JavaScript code TableJoins.js here and the full TypeScript code TableJoins.ts here to understand how to fetch data from a parent-child table.

問合せを実行するには、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をダウンロードします。