Utilisation de l'API de requête pour extraire des données
Vous pouvez utiliser QueryRequest
pour construire des requêtes afin de filtrer les données de la table NoSQL.
Pour exécuter la requête, utilisez l'API NoSQLHandle.query()
. Pour plus d'informations sur les différentes classes et méthodes, reportez-vous à Référence d'API du kit SDK Java Oracle NoSQL.
- Iterateur : utilisez
NoSQLHandle.queryIterable(QueryRequest)
pour obtenir une itération contenant tous les résultats. - Résultats partiels : pour calculer et extraire l'ensemble de résultats complet d'une requête, la même instance
QueryRequest
doit généralement être exécutée plusieurs fois (viaNoSQLHandle.query(oracle.nosql.driver.ops.QueryRequest)
). Chaque exécution renvoie une valeurQueryRequest
, qui contient un sous-ensemble de l'ensemble de résultats.
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";
Remarques :
Pour extraire les données d'une table enfant, indiquez le nom complet de la table (parent_tablename.child_tablename) dans l'instruction SQL. Téléchargez le code complet TableJoins.java à partir des exemples pour comprendre comment extraire des données d'une table parent-enfant ici.Pour exécuter une requête, utilisez la méthode borneo.NoSQLHandle.query()
.
- Utilisez
borneo.NoSQLHandle.query_iterable()
pour obtenir une itération contenant tous les résultats d'une requête. - Vous pouvez exécuter une boucle sur des résultats partiels à l'aide de la méthode
borneo.NoSQLHandle.query()
. Par exemple, afin d'exécuter une requête SELECT pour lire les données de votre table, un élémentborneo.QueryResult
contient la liste des résultats. Siborneo.QueryRequest.is_done()
renvoie False, il peut y avoir d'autres résultats. Les requêtes doivent donc généralement être exécutées dans une boucle. Il est possible qu'une seule demande ne renvoie aucun résultat, mais la requête n'est toujours pas exécutée, ce qui indique que la boucle de requête doit continuer.
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'
Remarques :
Pour extraire les données d'une table enfant, indiquez le nom complet de la table (parent_tablename.child_tablename) dans l'instruction SQL. Téléchargez le code complet TableJoins.py à partir des exemples pour comprendre comment extraire des données d'une table parent-enfant ici.Pour exécuter une requête, utilisez la fonction Client.Query
. Lors de l'exécution sur le service cloud, la quantité de données lues par une seule demande de requête est limitée par une valeur système par défaut et peut être encore limitée à l'aide de QueryRequest.MaxReadKB
. Cela limite la quantité de données lues et non la quantité de données renvoyées, ce qui signifie qu'une requête peut renvoyer zéro résultat mais avoir encore plus de données à lire. Pour cette raison, les requêtes doivent toujours fonctionner en boucle, obtenant plus de résultats, jusqu'à ce que QueryRequest.IsDone()
renvoie la valeur True, indiquant que la requête est effectuée.
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"
Remarques :
Pour extraire les données d'une table enfant, indiquez le nom complet de la table (parent_tablename.child_tablename) dans l'instruction SQL. Téléchargez le code complet TableJoins.go à partir des exemples pour comprendre comment extraire des données d'une table parent-enfant ici.- Utilisez la méthode
query
pour exécuter une requête. Cette méthode renvoie une promesse deQueryResult
, qui est un objet JavaScript simple contenant un tableau de lignes résultantes ainsi qu'une clé de continuation. Vous pouvez utiliser la méthodequery
de deux manières :- Vous ne pouvez appeler la méthode
query
qu'une seule fois pour les requêtes qui accèdent à au plus une ligne. Ces requêtes peuvent uniquement inclure des instructions SELECT basées sur la clé primaire (la clause WHERE doit indiquer l'égalité basée sur la clé primaire complète). Dans tous les autres cas, vous pouvez utiliserquery
dans une boucle ou la méthodequeryIterable
. - Vous pouvez appeler la méthode
query
dans une boucle pour extraire plusieurs lignes. Comme la quantité de données renvoyées par une requête est limitée par la valeur par défaut du système et peut être encore limitée en définissant la propriétémaxReadKB
dans l'argumentQueryOpt
de l'appelquery
une de la méthodequery
ne peut pas renvoyer tous les résultats disponibles. Pour résoudre ce problème, exécutez la requête dans une boucle jusqu'à ce quecontinuationKey
dansQueryResult
devienne null/undefined.
- Vous ne pouvez appeler la méthode
- Répétez les résultats de la requête à l'aide de la méthode
queryIterable
. Cette méthode renvoie un objet itérable sur lequel vous pouvez répéter avec une boucle for-await-of. Vous n'avez pas besoin de gérer la suite dans cette méthode.Remarques :
Avec la méthodequeryIterable
, vous pouvez également utiliser l'argumentQueryOpt
avec des propriétés autres quecontinuationKey
.
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
afin de fournir des conseils de type pour les lignes renvoyées dans QueryResult
. Cela ne doit pas nécessairement être identique au schéma de ligne de table (sauf si vous utilisez la requête SELECT *) car la requête peut inclure des projections, des alias de nom, des valeurs agrégées, etc. Téléchargez le code complet QueryData.ts à partir des exemples ici.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';
Remarques :
Pour extraire les données d'une table enfant, indiquez le nom complet de la table (parent_tablename.child_tablename) dans l'instruction SQL. Téléchargez le code JavaScript complet TableJoins.js ici et le code TypeScript complet TableJoins.ts ici pour comprendre comment extraire des données d'une table parent-enfant. Pour exécuter une requête, vous pouvez appeler la méthode QueryAsync
ou appeler la méthode GetQueryAsyncEnumerable
et effectuer une itération sur l'énumérable asynchrone résultant. Vous pouvez transmettre des options à chacune de ces méthodes en tant que QueryOptions
. La méthode QueryAsync
renvoie Task<QueryResult<RecordValue>>
. QueryResult
contient les résultats de requête sous forme de liste d'instances RecordValue, ainsi que d'autres informations. Lorsque votre requête indique une clé primaire complète, il suffit d'appeler QueryAsync
une fois. La quantité de données renvoyées par la requête est limitée par le système. Elle pourrait également être limitée en définissant la propriété MaxReadKB
de QueryOptions
. Cela signifie qu'un appel de QueryAsync
peut ne pas renvoyer tous les résultats disponibles. Cette situation est traitée en utilisant la clé de continuation. La clé de continuation non NULL dans QueryResult
signifie que d'autres résultats de requête peuvent être disponibles. Cela signifie que les requêtes doivent s'exécuter en boucle jusqu'à ce que la clé de continuation devienne NULL. Pour plus d'informations sur toutes les classes et méthodes, reportez-vous à Référence d'API du kit SDK Dotnet Oracle NoSQL.
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";
Remarques :
Pour extraire les données d'une table enfant, indiquez le nom complet de la table (parent_tablename.child_tablename) dans l'instruction SQL. Téléchargez le code complet TableJoins.cs à partir des exemples pour comprendre comment extraire des données d'une table parent-enfant ici.Utilisation de l'API de requête pour extraire des données