Query API를 사용하여 데이터 패치

QueryRequest를 사용하여 NoSQL 테이블에서 데이터를 필터링하는 질의를 생성할 수 있습니다.

질의를 실행하려면 NoSQLHandle.query() API를 사용합니다. 다양한 클래스 및 메소드에 대한 자세한 내용은 Oracle NoSQL Java SDK API Reference를 참조하십시오.

이터레이터 사용 또는 부분 결과 루프라는 두 가지 방법으로 질의 결과를 얻을 수 있습니다.

  • 반복자: NoSQLHandle.queryIterable(QueryRequest)를 사용하여 모든 결과가 포함된 반복 가능 항목을 가져옵니다.

  • 부분 결과: 질의의 전체 결과 집합을 계산하고 검색하려면 일반적으로 NoSQLHandle.query(oracle.nosql.driver.ops.QueryRequest)를 통해 동일한 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를 반환하는 경우 결과가 더 많을 수 있으므로 일반적으로 질의가 루프에서 실행되어야 합니다. 단일 요청이 아무 결과도 반환하지 않지만 여전히 query가 수행되지 않아 query 루프가 계속되어야 함을 나타내는 경우가 있습니다.

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를 사용하여 더 제한될 수 있습니다. 이렇게 하면 반환되는 데이터 양이 아닌 데이터 읽기 양이 제한됩니다. 즉, query는 0개의 결과를 반환할 수 있지만 읽을 데이터가 더 많습니다. 이러한 이유로 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 객체인 QueryResult약속을 반환합니다. query 메소드는 다음 두 가지 방법으로 사용할 수 있습니다.

    • 최대 한 행에 액세스하는 query에 대해 query 메소드를 한 번만 호출할 수 있습니다. 이러한 질의는 기본 키를 기반으로 하는 select 문만 포함할 수 있습니다. where 절은 전체 기본 키를 기반으로 동등성을 지정해야 합니다. 다른 모든 경우에는 루프에 query 또는 queryIterable 메소드를 사용할 수 있습니다.

    • 루프에서 query 메소드를 호출하여 여러 행을 검색할 수 있습니다. 질의에 의해 반환되는 데이터의 양은 시스템 기본값에 의해 제한되므로 queryQueryOpt 인수에서 maxReadKB 속성을 설정하여 더 제한될 수 있습니다. query 메소드의 호출은 사용 가능한 모든 결과를 반환할 수 없습니다. 이 문제를 해결하려면 QueryResultcontinuationKeynull/정의되지 않음이 될 때까지 루프에서 질의를 실행합니다.

  2. queryIterable 메소드를 사용하여 query 결과를 반복합니다. 이 메소드는 for-await-of 루프를 사용하여 반복할 수 있는 반복 가능한 객체를 반환합니다. 이 방법에서는 지속을 관리할 필요가 없습니다.

주: queryIterable 메소드에서 continuationKey 이외의 속성과 함께 QueryOpt 인수를 사용할 수도 있습니다.

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 질의를 사용하지 않는 한 이 스키마는 테이블 행 스키마와 동일할 필요가 없습니다. 이 스키마는 질의에 투영, 이름 별칭, 집계 값 등을 포함할 수 있습니다. 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)을 지정하십시오. TableJoins.js 여기의 전체 JavaScript 코드와 TableJoins.ts 여기의 전체 TypeScript 코드를 다운로드하여 상위-하위 테이블에서 데이터를 가져오는 방법을 알아보십시오.

질의를 실행하기 위해 QueryAsync 메소드를 호출하거나 GetQueryAsyncEnumerable 메소드를 호출하여 결과 비동기 열거형을 반복할 수 있습니다. 이러한 각 메소드에 옵션을 QueryOptions로 전달할 수 있습니다. QueryAsync 메소드는 Task<QueryResult<RecordValue>>를 반환합니다. QueryResult에는 질의 결과가 RecordValue 인스턴스 목록 및 기타 정보로 포함됩니다. 질의에서 전체 기본 키를 지정하면 QueryAsync를 한 번만 호출하면 됩니다. query에서 반환되는 데이터의 양은 시스템에 의해 제한됩니다. 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를 다운로드하여 여기서 상위-하위 테이블에서 데이터를 인출하는 방법을 이해합니다.