Daten mit der Abfrage-API abrufen

Mit QueryRequest können Sie Abfragen zum Filtern von Daten aus der Tabelle NoSQL erstellen.

Zum Ausführen der Abfrage verwenden Sie die NoSQLHandle.query()-API. Weitere Informationen zu den verschiedenen Klassen und Methoden finden Sie unter Oracle NoSQL Java-SDK-API-Referenz.

Es gibt zwei Möglichkeiten, die Ergebnisse einer Abfrage abzurufen: einen Iterator oder eine Schleife durch Teilergebnisse.
  • Iterator: Mit NoSQLHandle.queryIterable(QueryRequest) können Sie eine iterierbare Datei abrufen, die alle Ergebnisse enthält.
  • Teilergebnisse: Um die vollständige Ergebnismenge einer Abfrage zu berechnen und abzurufen, muss dieselbe QueryRequest-Instanz im Allgemeinen mehrmals ausgeführt werden (über NoSQLHandle.query(oracle.nosql.driver.ops.QueryRequest)). Jede Ausführung gibt eine QueryRequest zurück, die eine Teilmenge der Ergebnismenge enthält.
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);
      }
   }
}
Sie können Filterbedingungen auch mit der WHERE-Klausel in der Abfrage anwenden.
String sqlstmt_allrows=
"SELECT account_expiry, acct.acct_data.lastName, 
acct.acct_data.contentStreamed[].showName 
FROM stream_acct acct WHERE acct_id=1";
Laden Sie den vollständigen Code QueryData.java aus den Beispielen hier herunter.

Hinweis:

Um Daten aus einer untergeordneten Tabelle abzurufen, geben Sie den vollständigen Namen der Tabelle (parent_tablename.child_tablename) in der SQL-Anweisung an. Laden Sie den vollständigen Code TableJoins.java aus den Beispielen herunter, um hier zu erfahren, wie Sie Daten aus einer Tabelle mit übergeordneten/untergeordneten Elementen abrufen.

Um eine Abfrage auszuführen, verwenden Sie die Methode borneo.NoSQLHandle.query().

Es gibt zwei Möglichkeiten, die Ergebnisse einer Abfrage abzurufen: einen Iterator oder eine Schleife durch Teilergebnisse.
  • Mit borneo.NoSQLHandle.query_iterable() können Sie eine iterierbare Abfrage abrufen, die alle Ergebnisse einer Abfrage enthält.
  • Sie können Teilergebnisse mit der Methode borneo.NoSQLHandle.query() in Schleifen durchlaufen. Um beispielsweise eine SELECT-Abfrage auszuführen, um Daten aus Ihrer Tabelle zu lesen, enthält eine borneo.QueryResult eine Liste mit Ergebnissen. Wenn borneo.QueryRequest.is_done() False zurückgibt, kann es weitere Ergebnisse geben. Daher sollten Abfragen im Allgemeinen in einer Schleife ausgeführt werden. Es ist möglich, dass eine einzelne Anforderung keine Ergebnisse zurückgibt, die Abfrage jedoch noch nicht ausgeführt wird. Dies bedeutet, dass die Abfrageschleife fortgesetzt werden soll.
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))
Sie können Filterbedingungen auch mit der WHERE-Klausel in der Abfrage anwenden.
sqlstmt = 'SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName 
FROM stream_acct acct WHERE acct_id=1'
Laden Sie den vollständigen Code QueryData.py aus den Beispielen hier herunter.

Hinweis:

Um Daten aus einer untergeordneten Tabelle abzurufen, geben Sie den vollständigen Namen der Tabelle (parent_tablename.child_tablename) in der SQL-Anweisung an. Laden Sie den vollständigen Code TableJoins.py aus den Beispielen herunter, um zu erfahren, wie Sie Daten hier aus einer Tabelle mit übergeordneten/untergeordneten Elementen abrufen.

Um eine Abfrage auszuführen, verwenden Sie die Funktion Client.Query. Bei der Ausführung im Cloud-Service wird die von einer einzelnen Abfrageanforderung gelesene Datenmenge durch einen Systemstandardwert begrenzt und kann mit QueryRequest.MaxReadKB weiter eingeschränkt werden. Dies begrenzt die Menge der gelesenen Daten und nicht die Menge der zurückgegebenen Daten, was bedeutet, dass eine Abfrage null Ergebnisse zurückgeben kann, aber noch mehr Daten zum Lesen hat. Aus diesem Grund sollten Abfragen immer in einer Schleife ausgeführt werden und mehr Ergebnisse erhalten, bis QueryRequest.IsDone() "true" zurückgibt, was darauf hinweist, dass die Abfrage ausgeführt wurde.

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()))
   }
}
Sie können Filterbedingungen auch mit der WHERE-Klausel in der Abfrage anwenden.
querystmt := "SELECT account_expiry, acct.acct_data.lastName, 
acct.acct_data.contentStreamed[].showName 
FROM stream_acct acct where acct_id=1"
Laden Sie den vollständigen Code QueryData.go aus den Beispielen hier herunter.

Hinweis:

Um Daten aus einer untergeordneten Tabelle abzurufen, geben Sie den vollständigen Namen der Tabelle (parent_tablename.child_tablename) in der SQL-Anweisung an. Laden Sie den vollständigen Code TableJoins.go aus den Beispielen herunter, um hier zu erfahren, wie Sie Daten aus einer Tabelle mit übergeordneten/untergeordneten Elementen abrufen.
Mit einer dieser Methoden können Sie Daten aus den Tabellen NoSQL abfragen. Details zur Methode finden Sie in der Klasse NoSQLClient.
  1. Verwenden Sie die Methode query, um eine Abfrage auszuführen. Diese Methode gibt eine Zusage von QueryResult zurück. Dabei handelt es sich um ein einfaches JavaScript-Objekt, das ein Array der resultierenden Zeilen sowie einen Fortsetzungsschlüssel enthält. Sie können die Methode query auf zwei Arten verwenden:
    • Sie können die Methode query nur einmal für Abfragen aufrufen, die auf maximal eine Zeile zugreifen. Diese Abfragen können nur SELECT-Anweisungen enthalten, die auf dem Primärschlüssel basieren (die WHERE-Klausel muss die Gleichheit basierend auf dem vollständigen Primärschlüssel angeben). In allen anderen Fällen können Sie entweder query in einer Schleife oder queryIterable-Methode verwenden.
    • Sie können die Methode query in einer Schleife aufrufen, um mehrere Zeilen abzurufen. Da die von einer Abfrage zurückgegebene Datenmenge durch den Systemstandardwert begrenzt ist und durch Festlegen der Eigenschaft maxReadKB im Argument QueryOpt des queryein Aufruf der Methode query weiter eingeschränkt werden kann, können nicht alle verfügbaren Ergebnisse zurückgegeben werden. Um dieses Problem zu beheben, führen Sie die Abfrage in einer Schleife aus, bis die continuationKey in QueryResult null/undefined wird.
  2. Iterieren Sie die Abfrageergebnisse mit der Methode queryIterable. Diese Methode gibt ein iterierbares Objekt zurück, über das Sie mit einer for-await-of-Schleife iterieren können. Sie müssen die Fortsetzung dieser Methode nicht verwalten.

    Hinweis:

    Mit der Methode queryIterable können Sie das Argument QueryOpt auch mit anderen Eigenschaften als continuationKey verwenden.
JavaScript: Laden Sie den vollständigen Code QueryData.js aus den Beispielen hier herunter.
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);
    }
}
Sie können Filterbedingungen auch mit der WHERE-Klausel in der Abfrage anwenden.
const querystmt = 
'SELECT account_expiry, acct.acct_data.lastName, 
acct.acct_data.contentStreamed[].showName 
FROM stream_acct acct WHERE acct_id=1';
TypeScript: Sie können dieselben Methoden verwenden, die in JavaScript oben für TypeScript beschrieben sind. Sie können auch ein optionales Abfrageergebnisschema als type-Parameter für die Methode query angeben, um type-Hinweise für die in QueryResult zurückgegebenen Zeilen bereitzustellen. Dies muss nicht mit dem Tabellenzeilenschema identisch sein (es sei denn, Sie verwenden die Abfrage SELECT *), da die Abfrage Projektionen, Namensaliasnamen, Aggregatwerte usw. enthalten kann. Laden Sie den vollständigen Code QueryData.ts aus den Beispielen hier herunter.
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);
   }
}
Sie können Filterbedingungen auch mit der WHERE-Klausel in der Abfrage anwenden.
const querystmt = 
'SELECT account_expiry, acct.acct_data.lastName, 
acct.acct_data.contentStreamed[].showName 
FROM stream_acct acct WHERE acct_id=1';

Hinweis:

Um Daten aus einer untergeordneten Tabelle abzurufen, geben Sie den vollständigen Namen der Tabelle (parent_tablename.child_tablename) in der SQL-Anweisung an. Laden Sie den vollständigen JavaScript-Code TableJoins.js hier und den vollständigen TypeScript-Code TableJoins.ts hier herunter, um zu erfahren, wie Sie Daten aus einer übergeordneten/untergeordneten Tabelle abrufen.

Um eine Abfrage auszuführen, können Sie die Methode QueryAsync aufrufen oder die Methode GetQueryAsyncEnumerable aufrufen und über die resultierende asynchrone Aufzählung iterieren. Sie können Optionen an jede dieser Methoden als QueryOptions übergeben. Die Methode QueryAsync gibt Task<QueryResult<RecordValue>> zurück. QueryResult enthält Abfrageergebnisse als Liste der RecordValue-Instanzen sowie andere Informationen. Wenn die Abfrage einen vollständigen Primärschlüssel angibt, reicht es aus, QueryAsync einmal aufzurufen. Die von der Abfrage zurückgegebene Datenmenge wird vom System begrenzt. Sie kann auch durch Festlegen der Eigenschaft MaxReadKB von QueryOptions weiter eingeschränkt werden. Dies bedeutet, dass ein Aufruf von QueryAsync möglicherweise nicht alle verfügbaren Ergebnisse zurückgibt. Diese Situation wird mit dem Fortsetzungsschlüssel behandelt. Der Fortsetzungsschlüssel ungleich Null in QueryResult bedeutet, dass möglicherweise weitere Abfrageergebnisse verfügbar sind. Dies bedeutet, dass Abfragen in einer Schleife ausgeführt werden müssen, bis der Fortsetzungsschlüssel Null wird. Weitere Details zu allen Klassen und Methoden finden Sie in der Oracle NoSQL Dotnet-SDK-API-Referenz.

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());
      }
   }
}
Sie können Filterbedingungen auch mit der WHERE-Klausel in der Abfrage anwenden.
private const string querystmt =
"SELECT account_expiry, acct.acct_data.lastName, 
acct.acct_data.contentStreamed[].showName 
FROM stream_acct acct WHERE acct_id=1";
Laden Sie den vollständigen Code QueryData.cs aus den Beispielen hier herunter.

Hinweis:

Um Daten aus einer untergeordneten Tabelle abzurufen, geben Sie den vollständigen Namen der Tabelle (parent_tablename.child_tablename) in der SQL-Anweisung an. Laden Sie den vollständigen Code TableJoins.cs aus den Beispielen herunter, um hier zu erfahren, wie Sie Daten aus einer Tabelle mit übergeordneten/untergeordneten Elementen abrufen.