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 votre table NoSQL.

Pour exécuter la requête, utilisez l'API NoSQLHandle.query(). Pour plus de détails sur les différentes classes et méthodes, reportez-vous à Référence d'API du kit SDK Java Oracle NoSQL.

Il existe deux façons d'obtenir les résultats d'une requête : utiliser un itérateur ou parcourir des résultats partiels.

  • Iterateur : utilisez NoSQLHandle.queryIterable(QueryRequest) pour obtenir un itérateur 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, en général, être exécutée plusieurs fois (via NoSQLHandle.query(oracle.nosql.driver.ops.QueryRequest)). Chaque exécution renvoie une valeur QueryRequest, 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);
      }
   }
}

Vous pouvez également appliquer des conditions de filtre à l'aide de la clause WHERE de la requête.

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.

Remarque : pour extraire des 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().

Il existe deux façons d'obtenir les résultats d'une requête : utiliser un itérateur ou parcourir des résultats partiels.

  • Utilisez borneo.NoSQLHandle.query_iterable() pour obtenir un objet itérable qui contient tous les résultats d'une requête.

  • Vous pouvez parcourir des résultats partiels à l'aide de la méthode borneo.NoSQLHandle.query(). Par exemple, pour exécuter une requête SELECT afin de lire les données de votre table, un élément borneo.QueryResult contient une liste de résultats. Si la valeur borneo.QueryRequest.is_done() renvoie False, il peut y avoir plus de résultats. Les requêtes doivent donc généralement être exécutées dans une boucle. Il est possible que la demande unique ne renvoie aucun résultat, mais la requête n'est toujours pas terminé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))

Vous pouvez également appliquer des conditions de filtre à l'aide de la clause WHERE de la requête.

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 à partir des exemples ici.

Remarque : pour extraire des 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 d'interrogation est limitée par une valeur par défaut du système et peut être 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 qu'elle a encore plus de données à lire. Pour cette raison, les requêtes doivent toujours fonctionner dans une 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()))
   }
}

Vous pouvez également appliquer des conditions de filtre à l'aide de la clause WHERE de la requête.

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 à partir des exemples ici.

Remarque : pour extraire des 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.

Vous pouvez interroger les données des tables NoSQL à l'aide de l'une de ces méthodes. Pour plus de détails sur la méthode, reportez-vous à la classe NoSQLClient.

  1. Utilisez la méthode query pour exécuter une requête. Cette méthode renvoie une promesse de QueryResult, qui est un objet JavaScript simple contenant un tableau de lignes résultantes ainsi qu'une clé de continuation. Vous pouvez utiliser la méthode query de deux manières :

    • Vous ne pouvez appeler la méthode query qu'une seule fois pour les requêtes qui accèdent à une seule ligne. Ces requêtes ne peuvent inclure que des instructions SELECT basées sur la clé primaire (la clause WHERE doit indiquer une égalité basée sur la clé primaire complète). Dans tous les autres cas, vous pouvez utiliser query dans une boucle ou une méthode queryIterable.

    • Vous pouvez appeler la méthode query dans une boucle pour extraire plusieurs lignes. La quantité de données renvoyées par une requête étant limitée par la valeur par défaut du système, vous pouvez la limiter en définissant la propriété maxReadKB dans l'argument QueryOpt de l'option queryun appel de la méthode query 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 que continuationKey dans QueryResult devienne null/undefined.

  2. Parcourez 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 effectuer une itération avec une boucle for-await-of. Vous n'avez pas besoin de gérer la suite dans cette méthode.

Remarque : 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 de la requête.

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 décrites dans JavaScript ci-dessus pour TypeScript. Vous pouvez également fournir un schéma de résultat de requête facultatif en tant que paramètre type à la méthode 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 d'agrégation, 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);
   }
}

Vous pouvez également appliquer des conditions de filtre à l'aide de la clause WHERE de la requête.

const querystmt =
'SELECT account_expiry, acct.acct_data.lastName,
acct.acct_data.contentStreamed[].showName
FROM stream_acct acct WHERE acct_id=1';

Remarque : pour extraire des 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 savoir comment extraire des données d'une table parent-enfant.

Pour exécuter une requête, vous pouvez appeler la méthode QueryAsync ou la méthode GetQueryAsyncEnumerable et itérer sur l'énumérable asynchrone obtenu. 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 la forme d'une 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. Il peut également être limité 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 davantage de résultats de requête peuvent être disponibles. Cela signifie que les requêtes doivent être exécutées en boucle jusqu'à ce que la clé de continuation devienne NULL. Pour plus de détails sur toutes les classes et méthodes, reportez-vous à Référence d'API du kit SDK Oracle NoSQL Dotnet.

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 de la requête.

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 à partir des exemples ici.

Remarque : pour extraire des 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.