Usando a API de Consulta para extrair dados
Você pode usar o QueryRequest
para construir consultas para filtrar dados da sua tabela NoSQL.
Para executar sua consulta, use a API NoSQLHandle.query()
. Consulte Oracle NoSQL Java SDK API Reference para obter mais detalhes sobre as várias classes e métodos.
- Iterador: Use
NoSQLHandle.queryIterable(QueryRequest)
para obter uma iterável que contenha todos os resultados. - Resultados Parciais: Para calcular e recuperar o conjunto completo de resultados de uma consulta, a mesma instância
QueryRequest
terá, em geral, de ser executada várias vezes (por meio deNoSQLHandle.query(oracle.nosql.driver.ops.QueryRequest)
). Cada execução retorna umQueryRequest
, que contém um subconjunto do conjunto de resultados.
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";
Observação:
Para extrair dados de uma tabela filho, especifique o nome completo da tabela (parent_tablename.child_tablename) na instrução sql. Faça download do código completo TableJoins.java dos exemplos para entender como extrair dados de uma tabela pai-filho aqui.Para executar uma consulta, use o método borneo.NoSQLHandle.query()
.
- Use
borneo.NoSQLHandle.query_iterable()
para obter um iterável que contenha todos os resultados de uma consulta. - Você pode fazer loop por resultados parciais usando o método
borneo.NoSQLHandle.query()
. Por exemplo, para executar uma consulta SELECT para ler dados da sua tabela,borneo.QueryResult
contém uma lista de resultados. E seborneo.QueryRequest.is_done()
retornar False, poderá haver mais resultados; portanto, as consultas geralmente deverão ser executadas em um loop. É possível que uma única solicitação não retorne resultados, mas a consulta ainda não foi concluída, indicando que o loop da consulta deve continuar.
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'
Observação:
Para extrair dados de uma tabela filho, especifique o nome completo da tabela (parent_tablename.child_tablename) na instrução sql. Faça download do código completo TableJoins.py dos exemplos para entender como extrair dados de uma tabela pai-filho aqui.Para executar uma consulta, use a função Client.Query
. Quando executado no serviço de nuvem, o volume de dados lidos por uma única solicitação de consulta é limitado por um padrão do sistema e pode ser ainda mais limitado usando QueryRequest.MaxReadKB
. Isso limita a quantidade de dados lidos e não a quantidade de dados retornados, o que significa que uma consulta pode retornar resultados zero, mas ainda ter mais dados para ler. Por esse motivo, as consultas devem sempre operar em um loop, adquirindo mais resultados, até QueryRequest.IsDone()
retornar verdadeiro, indicando que a consulta foi feita.
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"
Observação:
Para extrair dados de uma tabela filho, especifique o nome completo da tabela (parent_tablename.child_tablename) na instrução sql. Faça download do código completo TableJoins.go dos exemplos para entender como extrair dados de uma tabela pai-filho aqui.- Use o método
query
para executar uma consulta. Esse método retorna uma Promessa deQueryResult
, que é um objeto JavaScript simples que contém um array de linhas resultantes, bem como uma chave de continuação. Você pode usar o métodoquery
de duas maneiras:- Você só pode chamar o método
query
uma vez para consultas que acessam no máximo uma linha. Essas consultas só podem incluir instruções SELECT com base na chave primária (a cláusula where deve especificar a igualdade com base na chave primária completa). Em todos os outros casos, você pode usarquery
em um loop ou o métodoqueryIterable
. - Você pode chamar o método
query
em um loop para recuperar várias linhas. Como a quantidade de dados retornados por uma consulta é limitada pelo padrão do sistema e pode ser ainda mais limitada definindo a propriedademaxReadKB
no argumentoQueryOpt
da chamadaquery
um do métodoquery
não pode retornar todos os resultados disponíveis. Para resolver esse problema, execute a consulta em um loop até quecontinuationKey
emQueryResult
se torne null/undefined.
- Você só pode chamar o método
- Repita os resultados da consulta usando o método
queryIterable
. Esse método retorna um objeto iterável que você pode iterar com um loop for-await-of. Você não precisa gerenciar a continuação neste método.Observação:
Com o métodoqueryIterable
, você também pode usar o argumentoQueryOpt
com propriedades diferentes decontinuationKey
.
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
a fim de fornecer dicas de type para as linhas retornadas em QueryResult
. Isso não precisa ser igual ao esquema de linha da tabela (a menos que a consulta SELECT * seja usada), pois a consulta pode incluir projeções, aliases de nome, valores agregados etc. Faça download do código completo QueryData.ts nos exemplos aqui.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';
Observação:
Para extrair dados de uma tabela filho, especifique o nome completo da tabela (parent_tablename.child_tablename) na instrução sql. Baixe o código JavaScript completo TableJoins.js aqui e o código TypeScript completo TableJoins.ts aqui para entender como extrair dados de uma tabela pai-filho. Para executar uma consulta, você pode chamar o método QueryAsync
ou chamar o método GetQueryAsyncEnumerable
e iterar sobre o enumerável assíncrono resultante. Você pode passar opções para cada um desses métodos como QueryOptions
. O método QueryAsync
retorna Task<QueryResult<RecordValue>>
. QueryResult
contém resultados de consulta como uma lista de instâncias RecordValue, bem como outras informações. Quando sua consulta especifica uma chave primária completa, é suficiente chamar QueryAsync
uma vez. A quantidade de dados retornados pela consulta é limitada pelo sistema. Também pode ser ainda mais limitado definindo a propriedade MaxReadKB
como QueryOptions
. Isso significa que uma chamada de QueryAsync
pode não retornar todos os resultados disponíveis. Esta situação é tratada usando a chave de continuação. A chave de continuação não nula em QueryResult
significa que mais resultados da consulta podem estar disponíveis. Isso significa que as consultas devem ser executadas em um loop, até que a chave de continuação se torne nula. Consulte Oracle NoSQL Dotnet SDK API Reference para obter mais detalhes sobre todas as classes e métodos.
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";
Observação:
Para extrair dados de uma tabela filho, especifique o nome completo da tabela (parent_tablename.child_tablename) na instrução sql. Faça download do código completo TableJoins.cs dos exemplos para entender como extrair dados de uma tabela pai-filho aqui.Tópicos Relacionados
Usando a API de Consulta para extrair dados