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.
- 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 (überNoSQLHandle.query(oracle.nosql.driver.ops.QueryRequest)
). Jede Ausführung gibt eineQueryRequest
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);
}
}
}
String sqlstmt_allrows=
"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 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()
.
- 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 eineborneo.QueryResult
eine Liste mit Ergebnissen. Wennborneo.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))
sqlstmt = '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 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()))
}
}
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 Code TableJoins.go aus den Beispielen herunter, um hier zu erfahren, wie Sie Daten aus einer Tabelle mit übergeordneten/untergeordneten Elementen abrufen.- Verwenden Sie die Methode
query
, um eine Abfrage auszuführen. Diese Methode gibt eine Zusage vonQueryResult
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 Methodequery
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 entwederquery
in einer Schleife oderqueryIterable
-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 EigenschaftmaxReadKB
im ArgumentQueryOpt
desquery
ein Aufruf der Methodequery
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 diecontinuationKey
inQueryResult
null/undefined wird.
- Sie können die Methode
- 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 MethodequeryIterable
können Sie das ArgumentQueryOpt
auch mit anderen Eigenschaften alscontinuationKey
verwenden.
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
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);
}
}
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());
}
}
}
private const string 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 Code TableJoins.cs aus den Beispielen herunter, um hier zu erfahren, wie Sie Daten aus einer Tabelle mit übergeordneten/untergeordneten Elementen abrufen.