Utilizzo dell'API query per recuperare i dati
È possibile utilizzare QueryRequest per creare query per filtrare i dati dalla tabella NoSQL.
Per eseguire la query, utilizzare l'API NoSQLHandle.query(). Per ulteriori dettagli sulle varie classi e metodi, vedere Oracle NoSQL Java SDK API Reference.
Esistono due modi per ottenere i risultati di una query: utilizzare un iteratore o eseguire un loop nei risultati parziali.
-
Iteratore: utilizzare
NoSQLHandle.queryIterable(QueryRequest)per ottenere un iterable contenente tutti i risultati. -
Risultati parziali: per calcolare e recuperare l'intero set di risultati di una query, la stessa istanza
QueryRequest, in generale, dovrà essere eseguita più volte (tramiteNoSQLHandle.query(oracle.nosql.driver.ops.QueryRequest)). Ogni esecuzione restituisce un valoreQueryRequest, che contiene un subset del set di risultati.
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);
}
}
}
È inoltre possibile applicare le condizioni di filtro utilizzando la clausola WHERE nella query.
String sqlstmt_allrows=
"SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct WHERE acct_id=1";
Scaricare il codice completo QueryData.java dagli esempi qui.
Nota: per recuperare i dati da una tabella figlio, specificare il nome completo della tabella (parent_tablename.child_tablename) nell'istruzione sql. Scaricare il codice completo TableJoins.java dagli esempi per comprendere come recuperare i dati da una tabella padre-figlio qui.
Per eseguire una query, utilizzare il metodo borneo.NoSQLHandle.query().
Esistono due modi per ottenere i risultati di una query: utilizzare un iteratore o eseguire un loop nei risultati parziali.
-
Utilizzare
borneo.NoSQLHandle.query_iterable()per ottenere un iterable contenente tutti i risultati di una query. -
È possibile eseguire il loop dei risultati parziali utilizzando il metodo
borneo.NoSQLHandle.query(). Ad esempio, per eseguire una query SELECT per leggere i dati della tabella,borneo.QueryResultcontiene un elenco di risultati. E seborneo.QueryRequest.is_done()restituisce False, potrebbero esserci più risultati, quindi le query dovrebbero in genere essere eseguite in un loop. È possibile che una singola richiesta non restituisca risultati, ma la query non è ancora stata eseguita, a indicare che il loop della query deve continuare.
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))
È inoltre possibile applicare le condizioni di filtro utilizzando la clausola WHERE nella query.
sqlstmt = 'SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct WHERE acct_id=1'
Scaricare il codice completo QueryData.py dagli esempi qui.
Nota: per recuperare i dati da una tabella figlio, specificare il nome completo della tabella (parent_tablename.child_tablename) nell'istruzione sql. Scaricare il codice completo TableJoins.py dagli esempi per comprendere come recuperare i dati da una tabella padre-figlio qui.
Per eseguire una query, utilizzare la funzione Client.Query. Quando viene eseguita sul servizio cloud, la quantità di dati letti da una singola richiesta di query è limitata da un valore predefinito del sistema e può essere ulteriormente limitata utilizzando QueryRequest.MaxReadKB. Ciò limita la quantità di dati letti e non la quantità di dati restituiti, il che significa che una query può restituire zero risultati ma avere ancora più dati da leggere. Per questo motivo le query devono sempre funzionare in un loop, acquisendo più risultati, fino a quando QueryRequest.IsDone() non restituisce true, indicando che la query è stata eseguita.
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()))
}
}
È inoltre possibile applicare le condizioni di filtro utilizzando la clausola WHERE nella query.
querystmt := "SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct where acct_id=1"
Scaricare il codice completo QueryData.go dagli esempi qui.
Nota: per recuperare i dati da una tabella figlio, specificare il nome completo della tabella (parent_tablename.child_tablename) nell'istruzione sql. Scaricare il codice completo TableJoins.go dagli esempi per comprendere come recuperare i dati da una tabella padre-figlio qui.
È possibile eseguire query sui dati delle tabelle NoSQL utilizzando uno di questi metodi. Per i dettagli del metodo, vedere la classe NoSQLClient.
-
Utilizzare il metodo
queryper eseguire un'interrogazione. Questo metodo restituisce una Promessa diQueryResult, che è un oggetto JavaScript normale contenente un array di righe risultanti e una chiave di continuazione. È possibile utilizzare il metodoquerynei due modi indicati di seguito.-
È possibile chiamare il metodo
queryuna sola volta per le query che accedono al massimo a una riga. Queste query possono includere solo istruzioni di selezione basate sulla chiave primaria (la clausola where deve specificare l'uguaglianza in base alla chiave primaria completa). In tutti gli altri casi, è possibile utilizzare il metodoqueryin un loop oqueryIterable. -
È possibile chiamare il metodo
queryin un loop per recuperare più righe. Poiché la quantità di dati restituita da una query è limitata dall'impostazione predefinita del sistema e può essere ulteriormente limitata impostando la proprietàmaxReadKBnell'argomentoQueryOptdel metodoquery, un richiamo del metodoquerynon può restituire tutti i risultati disponibili. Per risolvere questo problema, eseguire la query in un loop finchécontinuationKeyinQueryResultnon diventa nullo/non definito.
-
-
Iterare i risultati della query utilizzando il metodo
queryIterable. Questo metodo restituisce un oggetto iterabile che è possibile ripetere con un loop for-await-of. Non è necessario gestire la continuazione in questo metodo.
Nota: con il metodo queryIterable, è anche possibile utilizzare l'argomento QueryOpt con proprietà diverse da continuationKey.
JavaScript: scarica il codice completo QueryData.js dagli esempi qui.
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);
}
}
È inoltre possibile applicare le condizioni di filtro utilizzando la clausola WHERE nella query.
const querystmt =
'SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct WHERE acct_id=1';
TypeScript: è possibile utilizzare gli stessi metodi descritti in JavaScript sopra per TypeScript. È inoltre possibile fornire uno schema dei risultati della query facoltativo come parametro type al metodo query per fornire suggerimenti di type per le righe restituite in QueryResult. Non è necessario che sia uguale allo schema delle righe della tabella (a meno che non si utilizzi la query SELECT) in quanto la query può includere proiezioni, alias dei nomi, valori aggregati e così via. Scaricare il codice completo QueryData.ts dagli esempi qui.
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);
}
}
È inoltre possibile applicare le condizioni di filtro utilizzando la clausola WHERE nella query.
const querystmt =
'SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct WHERE acct_id=1';
Nota: per recuperare i dati da una tabella figlio, specificare il nome completo della tabella (parent_tablename.child_tablename) nell'istruzione sql. Scarica il codice JavaScript completo TableJoins.js qui e il codice TypeScript completo TableJoins.ts qui per capire come recuperare i dati da una tabella padre-figlio.
Per eseguire una query, è possibile chiamare il metodo QueryAsync o chiamare il metodo GetQueryAsyncEnumerable e ripetere l'enumerazione asincrona risultante. È possibile passare le opzioni a ciascuno di questi metodi come QueryOptions. Il metodo QueryAsync restituisce Task<QueryResult<RecordValue>>. QueryResult contiene i risultati delle query come elenco di istanze RecordValue e altre informazioni. Quando la query specifica una chiave primaria completa, è sufficiente chiamare QueryAsync una volta. La quantità di dati restituita dalla query è limitata dal sistema. Potrebbe anche essere ulteriormente limitato impostando la proprietà MaxReadKB su QueryOptions. Ciò significa che un richiamo di QueryAsync potrebbe non restituire tutti i risultati disponibili. Questa situazione viene affrontata utilizzando la chiave di continuazione. La chiave di continuazione non nulla in QueryResult indica che potrebbero essere disponibili ulteriori risultati delle query. Ciò significa che le query devono essere eseguite in loop fino a quando la chiave di continuazione non diventa nulla. Per ulteriori dettagli su tutte le classi e i metodi, consulta la riferimento API Oracle NoSQL Dotnet SDK.
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());
}
}
}
È inoltre possibile applicare le condizioni di filtro utilizzando la clausola WHERE nella query.
private const string querystmt =
"SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct WHERE acct_id=1";
Scaricare il codice completo QueryData.cs dagli esempi qui.
Nota: per recuperare i dati da una tabella figlio, specificare il nome completo della tabella (parent_tablename.child_tablename) nell'istruzione sql. Scaricare il codice completo TableJoins.cs dagli esempi per comprendere come recuperare i dati da una tabella padre-figlio qui.