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 클래스를 참조하십시오.
-
query메소드를 사용하여 쿼리를 실행합니다. 이 메소드는 결과 행 배열과 연속 키를 포함하는 일반 JavaScript 객체인QueryResult의 약속을 반환합니다.query메소드는 다음 두 가지 방법으로 사용할 수 있습니다.-
최대 한 행에 액세스하는 query에 대해
query메소드를 한 번만 호출할 수 있습니다. 이러한 질의는 기본 키를 기반으로 하는 select 문만 포함할 수 있습니다. where 절은 전체 기본 키를 기반으로 동등성을 지정해야 합니다. 다른 모든 경우에는 루프에query또는queryIterable메소드를 사용할 수 있습니다. -
루프에서
query메소드를 호출하여 여러 행을 검색할 수 있습니다. 질의에 의해 반환되는 데이터의 양은 시스템 기본값에 의해 제한되므로query의QueryOpt인수에서maxReadKB속성을 설정하여 더 제한될 수 있습니다.query메소드의 호출은 사용 가능한 모든 결과를 반환할 수 없습니다. 이 문제를 해결하려면QueryResult의continuationKey가 null/정의되지 않음이 될 때까지 루프에서 질의를 실행합니다.
-
-
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에서 반환되는 데이터의 양은 시스템에 의해 제한됩니다. QueryOptions의 MaxReadKB 속성을 설정하여 추가로 제한할 수도 있습니다. 즉, 하나의 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를 다운로드하여 여기서 상위-하위 테이블에서 데이터를 인출하는 방법을 이해합니다.