질의 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 객체인 QueryResultPromise를 반환합니다. query 메소드는 다음 두 가지 방법으로 사용할 수 있습니다.
    • query 메소드는 최대 한 행에 액세스하는 질의에 대해 한 번만 호출할 수 있습니다. 이러한 query에는 primary key를 기반으로 하는 select 문만 포함될 수 있습니다. where 절은 전체 primary key를 기반으로 동등성을 지정해야 합니다. 그 밖의 경우에는 루프 또는 queryIterable 메소드에서 query를 사용할 수 있습니다.
    • 루프에서 query 메소드를 호출하여 여러 행을 검색할 수 있습니다. 질의에 의해 반환되는 데이터의 양은 시스템 기본값에 따라 제한되므로 queryQueryOpt 인수에 maxReadKB 속성을 설정하여 추가로 제한할 수 있습니다. query 메소드의 호출은 사용 가능한 결과를 모두 반환할 수 없습니다. 이 문제를 해결하려면 QueryResultcontinuationKeynull/정의되지 않음이 될 때까지 루프에서 질의를 실행합니다.
  2. queryIterable 메소드를 사용하여 질의 결과를 반복합니다. 이 메소드는 for-await-of 루프를 사용하여 반복할 수 있는 반복 가능한 객체를 반환합니다. 이 방법에서는 계속을 관리할 필요가 없습니다.

    주:

    queryIterable 메소드를 사용할 경우 continuationKey 이외의 등록 정보와 함께 QueryOpt 인수를 사용할 수도 있습니다.
JavaScript: QueryData.js 예제에서 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를 한 번만 호출하면 됩니다. 질의에서 반환되는 데이터의 양은 시스템에 의해 제한됩니다. 또한 QueryOptionsMaxReadKB 등록 정보를 설정하여 제한할 수도 있습니다. 즉, QueryAsync를 한 번 호출해도 사용 가능한 결과가 모두 반환되지 않을 수 있습니다. 이러한 상황은 연속 키를 사용하여 처리됩니다. QueryResult에 널이 아닌 연속 키가 있으면 더 많은 질의 결과를 사용할 수 있습니다. 즉, 연속 키가 null이 될 때까지 루프를 통해 query가 루프에서 실행되어야 합니다. 모든 클래스 및 메소드에 대한 자세한 내용은 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를 다운로드하여 여기에서 상위-하위 테이블에서 데이터를 인출하는 방법을 이해하십시오.