Utilisation de l'API d'interrogation pour extraire des données

Vous pouvez utiliser QueryRequest pour créer des interrogations afin de filtrer les données de votre table NoSQL.

Pour exécuter une interrogation, utilisez l'API NoSQLHandle.query(). Voir Informations de référence sur l'API de la trousse SDK Java pour Oracle NoSQL pour plus de détails sur les différentes classes et méthodes.

Il existe deux façons d'obtenir les résultats d'une interrogation : en utilisant un itérateur ou en effectuant une boucle sur des résultats partiels.
  • Itérateur : Utilisez NoSQLHandle.queryIterable(QueryRequest) pour obtenir un itératif qui contient tous les résultats.
  • Résultats partiels : Pour calculer et extraire le jeu de résultats complet d'une interrogation, la même instance QueryRequest devra, en général, être exécutée plusieurs fois (au moyen de NoSQLHandle.query(oracle.nosql.driver.ops.QueryRequest)). Chaque exécution retourne une valeur QueryRequest, qui contient un sous-ensemble du jeu 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);
      }
   }
}
Vous pouvez également appliquer des conditions de filtre à l'aide de la clause WHERE dans l'interrogation.
String sqlstmt_allrows=
"SELECT account_expiry, acct.acct_data.lastName, 
acct.acct_data.contentStreamed[].showName 
FROM stream_acct acct WHERE acct_id=1";
Téléchargez le code complet QueryData.java à partir des exemples ici.

Note :

Pour extraire des données d'une table enfant, spécifiez le nom complet de la table (parent_tablename.child_tablename) dans l'énoncé 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 interrogation, utilisez la méthode borneo.NoSQLHandle.query().

Il existe deux façons d'obtenir les résultats d'une interrogation : en utilisant un itérateur ou en effectuant une boucle sur des résultats partiels.
  • Utilisez borneo.NoSQLHandle.query_iterable() pour obtenir une itération qui contient tous les résultats d'une interrogation.
  • Vous pouvez effectuer une boucle sur les résultats partiels à l'aide de la méthode borneo.NoSQLHandle.query(). Par exemple, pour exécuter une interrogation SELECT afin de lire les données d'une table, borneo.QueryResult contient une liste de résultats. Et si borneo.QueryRequest.is_done() retourne Faux, il peut y avoir plus de résultats, de sorte que les interrogations doivent généralement être exécutées en boucle. Il est possible que la demande unique ne retourne aucun résultat, mais la requête n'est toujours pas terminée, ce qui indique que la boucle de requête doit se poursuivre.
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))
Vous pouvez également appliquer des conditions de filtre à l'aide de la clause WHERE dans l'interrogation.
sqlstmt = 'SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName 
FROM stream_acct acct WHERE acct_id=1'
Téléchargez le code complet QueryData.py dans les exemples ici.

Note :

Pour extraire des données d'une table enfant, spécifiez le nom complet de la table (parent_tablename.child_tablename) dans l'énoncé 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 interrogation, utilisez la fonction Client.Query. Lors de l'exécution sur le service en nuage, la quantité de données lues par une seule demande d'interrogation est limitée par une valeur par défaut du système 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 retourné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 interrogations doivent toujours fonctionner dans une boucle, obtenant plus de résultats, jusqu'à ce que QueryRequest.IsDone() retourne Vrai, indiquant que l'interrogation est terminé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()))
   }
}
Vous pouvez également appliquer des conditions de filtre à l'aide de la clause WHERE dans l'interrogation.
querystmt := "SELECT account_expiry, acct.acct_data.lastName, 
acct.acct_data.contentStreamed[].showName 
FROM stream_acct acct where acct_id=1"
Téléchargez le code complet QueryData.go dans les exemples ici.

Note :

Pour extraire des données d'une table enfant, spécifiez le nom complet de la table (parent_tablename.child_tablename) dans l'énoncé 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.
Vous pouvez interroger des données à partir des tables NoSQL à l'aide d'une de ces méthodes. Pour plus de détails sur la méthode, voir la classe NoSQLClient.
  1. Utilisez la méthode query pour exécuter une interrogation. Cette méthode retourne une promesse de QueryResult, qui est un objet JavaScript simple contenant un tableau de rangées résultantes ainsi qu'une clé de continuation. Vous pouvez utiliser la méthode query de deux façons :
    • Vous ne pouvez appeler la méthode query qu'une seule fois pour les interrogations qui accèdent à au plus une rangée. Ces interrogations ne peuvent inclure que des énoncés SELECT basés sur la clé primaire (la clause WHERE doit spécifier l'égalité basée sur la clé primaire complète). Dans tous les autres cas, vous pouvez utiliser query dans une boucle ou la méthode queryIterable.
    • Vous pouvez appeler la méthode query dans une boucle pour extraire plusieurs rangées. Comme la quantité de données retournée par une interrogation 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'argument QueryOpt de l'appel queryun de la méthode query ne peut pas retourner tous les résultats disponibles. Pour résoudre ce problème, exécutez l'interrogation en boucle jusqu'à ce que continuationKey dans QueryResult devienne nul/undefined.
  2. Effectuez une itération sur les résultats de l'interrogation à l'aide de la méthode queryIterable. Cette méthode retourne un objet itérable sur lequel vous pouvez effectuer une itération avec une boucle for-await-of. Vous n'avez pas besoin de gérer la continuation dans cette méthode.

    Note :

    Avec la méthode queryIterable, vous pouvez également utiliser l'argument QueryOpt avec des propriétés autres que continuationKey.
JavaScript : Téléchargez le code complet QueryData.js à partir des exemples ici.
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);
    }
}
Vous pouvez également appliquer des conditions de filtre à l'aide de la clause WHERE dans l'interrogation.
const querystmt = 
'SELECT account_expiry, acct.acct_data.lastName, 
acct.acct_data.contentStreamed[].showName 
FROM stream_acct acct WHERE acct_id=1';
TypeScript : Vous pouvez utiliser les mêmes méthodes que celles décrites dans JavaScript ci-dessus pour TypeScript. Vous pouvez également fournir un schéma de résultat d'interrogation facultatif en tant que paramètre type de la méthode query pour fournir des conseils de type pour les rangées retournées dans QueryResult. Cela ne doit pas nécessairement être identique au schéma de rangée de table (à moins d'utiliser l'interrogation SELECT *), car l'interrogation peut inclure des projections, des alias de nom, des valeurs d'agrégation, etc. Téléchargez le code complet QueryData.ts dans les 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);
   }
}
Vous pouvez également appliquer des conditions de filtre à l'aide de la clause WHERE dans l'interrogation.
const querystmt = 
'SELECT account_expiry, acct.acct_data.lastName, 
acct.acct_data.contentStreamed[].showName 
FROM stream_acct acct WHERE acct_id=1';

Note :

Pour extraire des données d'une table enfant, spécifiez le nom complet de la table (parent_tablename.child_tablename) dans l'énoncé 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 interrogation, vous pouvez appeler la méthode QueryAsync ou appeler la méthode GetQueryAsyncEnumerable et effectuer une itération sur l'énumération asynchrone obtenue. Vous pouvez transmettre des options à chacune de ces méthodes en tant que QueryOptions. La méthode QueryAsync retourne Task<QueryResult<RecordValue>>. QueryResult contient les résultats de l'interrogation sous forme de liste d'instances RecordValue, ainsi que d'autres informations. Lorsque votre interrogation spécifie une clé primaire complète, il suffit d'appeler QueryAsync une fois. La quantité de données retournées par l'interrogation est limitée par le système. Il peut également être limité en définissant la propriété MaxReadKB de QueryOptions. Cela signifie qu'un appel de QueryAsync peut ne pas retourner tous les résultats disponibles. Cette situation est traitée en utilisant la clé de continuation. La clé de continuation non nulle dans QueryResult signifie que d'autres résultats d'interrogation peuvent être disponibles. Cela signifie que les interrogations doivent être exécutées en boucle jusqu'à ce que la clé de continuation devienne nulle. Voir Informations de référence sur l'API de la trousse SDK Dotnet pour Oracle NoSQL pour plus de détails sur toutes les classes et méthodes.

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());
      }
   }
}
Vous pouvez également appliquer des conditions de filtre à l'aide de la clause WHERE dans l'interrogation.
private const string querystmt =
"SELECT account_expiry, acct.acct_data.lastName, 
acct.acct_data.contentStreamed[].showName 
FROM stream_acct acct WHERE acct_id=1";
Téléchargez le code complet QueryData.cs dans les exemples ici.

Note :

Pour extraire des données d'une table enfant, spécifiez le nom complet de la table (parent_tablename.child_tablename) dans l'énoncé 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.