Utilizzo dell'interfaccia API delle 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 informazioni sulle varie classi e metodi, consulta Oracle NoSQL Java SDK API Reference.

Esistono due modi per ottenere i risultati di una query: utilizzando un iteratore o un loop attraverso risultati parziali.
  • Iteratore: utilizzare NoSQLHandle.queryIterable(QueryRequest) per ottenere un iterabile contenente tutti i risultati.
  • Risultati parziali: per calcolare e recuperare il set di risultati completo di una query, la stessa istanza QueryRequest dovrà essere eseguita più volte (tramite NoSQLHandle.query(oracle.nosql.driver.ops.QueryRequest)). Ogni esecuzione restituisce un valore QueryRequest 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 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";
Scarica 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: utilizzando un iteratore o un loop attraverso risultati parziali.
  • Utilizzare borneo.NoSQLHandle.query_iterable() per ottenere un elemento iterabile 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 dalla tabella, un valore borneo.QueryResult contiene una lista di risultati. Se borneo.QueryRequest.is_done() restituisce False, potrebbero esserci più risultati, pertanto le query dovrebbero essere in genere 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 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'
Scarica 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 di 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 dovrebbero sempre funzionare in un loop, acquisendo più risultati, fino a quando QueryRequest.IsDone() non restituisce true, a indicare 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 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"
Scarica 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 dalle tabelle NoSQL utilizzando uno di questi metodi. Per ulteriori informazioni sul metodo, vedere la classe NoSQLClient.
  1. Utilizzare il metodo query per eseguire una query. Questo metodo restituisce una promessa di QueryResult, che è un oggetto JavaScript semplice contenente un array di righe risultanti e una chiave di continuazione. Il metodo query può essere utilizzato in due modi:
    • È possibile chiamare il metodo query una sola volta per le query che accedono al massimo a una riga. Queste query possono includere solo istruzioni SELECT basate sulla chiave primaria (la clausola WHERE deve specificare l'uguaglianza in base alla chiave primaria completa). In tutti gli altri casi, è possibile utilizzare query in un metodo loop o queryIterable.
    • È possibile richiamare il metodo query in un loop per recuperare più righe. Poiché la quantità di dati restituita da una query è limitata dal valore predefinito del sistema e può essere ulteriormente limitata impostando la proprietà maxReadKB nell'argomento QueryOpt del queryun richiamo del metodo query non può restituire tutti i risultati disponibili. Per risolvere questo problema, eseguire la query in un loop finché continuationKey in QueryResult non diventa null/undefined.
  2. Iterare i risultati della query utilizzando il metodo queryIterable. Questo metodo restituisce un oggetto iterabile che è possibile ripetere con un loop di attesa. Non è necessario gestire la continuazione in questo metodo.

    Nota

    Con il metodo queryIterable, è possibile utilizzare anche 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 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: per TypeScript è possibile utilizzare gli stessi metodi descritti nella precedente sezione JavaScript. È inoltre possibile fornire uno schema dei risultati di query facoltativo come parametro tipo del metodo query per fornire suggerimenti tipo per le righe restituite in QueryResult. Non è necessario che lo schema delle righe della tabella sia lo stesso (a meno che non si utilizzi la query SELECT *) in quanto la query può includere proiezioni, alias dei nomi, valori di aggregazione e così via. Scarica 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 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'iterazione sull'enumerabile asincrono 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 lista di istanze RecordValue e altre informazioni. Quando la query specifica una chiave primaria completa, è sufficiente chiamare QueryAsync una volta. La quantità di dati restituiti dalla query è limitata dal sistema. Potrebbe anche essere ulteriormente limitato impostando la proprietà MaxReadKB di 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 più risultati della query. Ciò significa che le query devono essere eseguite in un loop, in loop fino a quando la chiave di continuazione non diventa nulla. Per ulteriori informazioni su tutte le classi e i metodi, consulta 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());
      }
   }
}
È inoltre possibile applicare 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";
Scarica 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.