질의 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);
}
}
}
String sqlstmt_allrows=
"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.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))
sqlstmt = '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.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()))
}
}
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.go를 다운로드하여 여기에서 상위-하위 테이블에서 데이터를 인출하는 방법을 이해하십시오.query
메소드를 사용하여 질의를 실행합니다. 이 메소드는 결과 행 배열과 연속 키를 포함하는 일반 JavaScript 객체인QueryResult
의 Promise를 반환합니다.query
메소드는 다음 두 가지 방법으로 사용할 수 있습니다.query
메소드는 최대 한 행에 액세스하는 질의에 대해 한 번만 호출할 수 있습니다. 이러한 query에는 primary key를 기반으로 하는 select 문만 포함될 수 있습니다. where 절은 전체 primary key를 기반으로 동등성을 지정해야 합니다. 그 밖의 경우에는 루프 또는queryIterable
메소드에서query
를 사용할 수 있습니다.- 루프에서
query
메소드를 호출하여 여러 행을 검색할 수 있습니다. 질의에 의해 반환되는 데이터의 양은 시스템 기본값에 따라 제한되므로query
의QueryOpt
인수에maxReadKB
속성을 설정하여 추가로 제한할 수 있습니다.query
메소드의 호출은 사용 가능한 결과를 모두 반환할 수 없습니다. 이 문제를 해결하려면QueryResult
의continuationKey
가 null/정의되지 않음이 될 때까지 루프에서 질의를 실행합니다.
queryIterable
메소드를 사용하여 질의 결과를 반복합니다. 이 메소드는 for-await-of 루프를 사용하여 반복할 수 있는 반복 가능한 객체를 반환합니다. 이 방법에서는 계속을 관리할 필요가 없습니다.주:
queryIterable
메소드를 사용할 경우continuationKey
이외의 등록 정보와 함께QueryOpt
인수를 사용할 수도 있습니다.
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);
}
}
const querystmt =
'SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct WHERE acct_id=1';
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);
}
}
const querystmt =
'SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct WHERE acct_id=1';
질의를 실행하려면 QueryAsync
메소드를 호출하거나 GetQueryAsyncEnumerable
메소드를 호출하고 결과 비동기 열거 가능을 반복할 수 있습니다. 이러한 각 메소드에 옵션을 QueryOptions
로 전달할 수 있습니다. QueryAsync
메소드는 Task<QueryResult<RecordValue>>
를 반환합니다. QueryResult
에는 RecordValue 인스턴스 목록 및 기타 정보가 포함된 질의 결과가 포함됩니다. 질의에서 전체 기본 키를 지정하면 QueryAsync
를 한 번만 호출하면 됩니다. 질의에서 반환되는 데이터의 양은 시스템에 의해 제한됩니다. 또한 QueryOptions
의 MaxReadKB
등록 정보를 설정하여 제한할 수도 있습니다. 즉, 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());
}
}
}
private const string 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.cs를 다운로드하여 여기에서 상위-하위 테이블에서 데이터를 인출하는 방법을 이해하십시오.