Daten mit Abfrage-API abrufen
Mit der QueryRequest können Sie Abfragen erstellen, um Daten aus der NoSQL-Tabelle zu filtern.
Zum Ausführen der Abfrage verwenden Sie die NoSQLHandle.query()-API. Weitere Informationen zu den verschiedenen Klassen und Methoden finden Sie in der Oracle NoSQL Java SDK-API-Referenz.
Es gibt zwei Möglichkeiten, die Ergebnisse einer Abfrage abzurufen: mit einem Iterator oder einer Schleife durch Teilergebnisse.
-
Iterator: Verwenden Sie
NoSQLHandle.queryIterable(QueryRequest), um eine Iteration abzurufen, die alle Ergebnisse enthält. -
Teilergebnisse: Um das vollständige Ergebnisset einer Abfrage zu berechnen und abzurufen, muss dieselbe
QueryRequest-Instanz im Allgemeinen mehrmals ausgeführt werden (überNoSQLHandle.query(oracle.nosql.driver.ops.QueryRequest)). Jede Ausführung gibt eineQueryRequestzurü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 zu erfahren, wie Sie Daten aus einer übergeordneten/untergeordneten Tabelle hier abrufen.
Um eine Abfrage auszuführen, verwenden Sie die Methode borneo.NoSQLHandle.query().
Es gibt zwei Möglichkeiten, die Ergebnisse einer Abfrage abzurufen: mit einem Iterator oder einer Schleife durch Teilergebnisse.
-
Verwenden Sie
borneo.NoSQLHandle.query_iterable(), um eine iterierbare Datei abzurufen, die alle Ergebnisse einer Abfrage enthält. -
Sie können Teilergebnisse mit der Methode
borneo.NoSQLHandle.query()durchlaufen. Beispiel: Um eine SELECT-Abfrage auszuführen, um Daten aus Ihrer Tabelle zu lesen, enthält eineborneo.QueryResulteine Ergebnisliste. Und wennborneo.QueryRequest.is_done()"False" zurückgibt, kann es mehr Ergebnisse geben, sodass Abfragen im Allgemeinen in einer Schleife ausgeführt werden sollten. Es ist möglich, dass eine einzelne Anforderung keine Ergebnisse zurückgibt, die Abfrage jedoch noch nicht ausgeführt wurde. Dies gibt an, 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 aus einer übergeordneten/untergeordneten Tabelle hier abrufen.
Um eine Abfrage auszuführen, verwenden Sie die Funktion Client.Query. Bei der Ausführung auf dem Cloud-Service ist die Menge der Daten, die von einer einzelnen Abfrageanforderung gelesen werden, durch einen Systemstandard begrenzt und kann mit QueryRequest.MaxReadKB weiter begrenzt werden. Dies begrenzt die Menge der gelesenen Daten und nicht die Menge der zurückgegebenen Daten. Das bedeutet, dass eine Abfrage null Ergebnisse zurückgeben kann, aber immer noch mehr Daten zum Lesen haben kann. Aus diesem Grund sollten Abfragen immer in einer Schleife ausgeführt werden und mehr Ergebnisse erhalten, bis QueryRequest.IsDone() "true" zurückgibt, was angibt, 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 zu erfahren, wie Sie Daten aus einer übergeordneten/untergeordneten Tabelle hier abrufen.
Mit einer dieser Methoden können Sie Daten aus den NoSQL-Tabellen abfragen. Methodendetails finden Sie in der Klasse NoSQLClient.
-
Verwenden Sie die Methode
query, um eine Abfrage auszuführen. Diese Methode gibt eine Promise vonQueryResultzurück. Dabei handelt es sich um ein einfaches JavaScript-Objekt, das ein Array mit resultierenden Zeilen sowie einen Fortsetzungsschlüssel enthält. Sie können die Methodequeryauf zwei Arten verwenden:-
Sie können die Methode
querynur einmal für Abfragen aufrufen, die maximal auf 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 entwederqueryin einer Schleife oder die MethodequeryIterableverwenden. -
Sie können die Methode
queryin einer Schleife aufrufen, um mehrere Zeilen abzurufen. Da die von einer Abfrage zurückgegebene Datenmenge durch den Systemstandard begrenzt ist und weiter begrenzt werden kann, indem die EigenschaftmaxReadKBim ArgumentQueryOptdesqueryone-Aufrufs der Methodequeryfestgelegt wird, können nicht alle verfügbaren Ergebnisse zurückgegeben werden. Um dieses Problem zu beheben, führen Sie die Abfrage in einer Schleife aus, biscontinuationKeyinQueryResultnull/undefined wird.
-
-
Iterieren Sie mit der Methode
queryIterableüber die Abfrageergebnisse. Diese Methode gibt ein iterierbares Objekt zurück, das Sie mit einer for-await-of-Schleife iterieren können. Sie müssen die Fortsetzung in dieser Methode nicht verwalten.
Hinweis: Mit der Methode queryIterable können Sie auch das Argument QueryOpt 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 oben in JavaScript für TypeScript beschrieben werden. Sie können auch ein optionales Abfrageergebnisschema als type-Parameter für die Methode query angeben, um type-Hints für die in der QueryResult zurückgegebenen Zeilen bereitzustellen. Dies muss nicht mit dem Tabellenzeilenschema identisch sein (es sei denn, es wird eine SELECT-Abfrage verwendet), 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 Daten aus einer übergeordneten/untergeordneten Tabelle abgerufen werden.
Um eine Abfrage auszuführen, können Sie die Methode QueryAsync aufrufen oder die Methode GetQueryAsyncEnumerable aufrufen und über die resultierende asynchrone aufzählbare Methode iterieren. Sie können Optionen an jede dieser Methoden als QueryOptions übergeben. Methode QueryAsync gibt Task<QueryResult<RecordValue>> zurück. QueryResult enthält Abfrageergebnisse als Liste der RecordValue-Instanzen sowie weitere Informationen. Wenn Ihre 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 könnte auch weiter eingeschränkt werden, indem die Eigenschaft MaxReadKB von QueryOptions festgelegt wird. Das bedeutet, dass ein Aufruf von QueryAsync möglicherweise nicht alle verfügbaren Ergebnisse zurückgibt. Diese Situation wird mit einem Fortsetzungsschlüssel behandelt. Fortsetzungsschlüssel ungleich Null in QueryResult bedeutet, dass möglicherweise mehr Abfrageergebnisse verfügbar sind. Das bedeutet, dass Abfragen in einer Schleife ausgeführt werden müssen, bis der Fortsetzungsschlüssel null wird. Weitere Informationen zu allen Klassen und Methoden finden Sie in der 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());
}
}
}
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 zu erfahren, wie Sie Daten aus einer übergeordneten/untergeordneten Tabelle hier abrufen.