Développement d'une logique personnalisée à l'aide de SQL

Utilisation de SQLScript

Objective

After completing this lesson, you will be able to décrivez les fonctionnalités supplémentaires fournies par SQLScript par rapport au SQL standard.

Fonctionnalités SQLScript

SQLScript est un langage de base de données développé par SAP. Il est basé sur le SQL standard, mais ajoute des fonctionnalités supplémentaires pour exploiter les fonctionnalités avancées de SAP HANA Cloud.

Voici quelques-unes des fonctionnalités clés de SQL Script :

  • SQLScript étend le SQL ANSI-92. Tout comme d'autres fournisseurs de bases de données étendent le SQL dans leurs bases de données, SAP HANA étend le SQL à l'aide de SQLScript.
  • SQLScript vous permet d'accéder à des fonctionnalités spécifiques à SAP HANA telles que les tables de colonnes, les vues d'informations paramétrées, les mémoires tampons delta, l'utilisation de plusieurs ensembles de résultats en parallèle, les conversions de devises intégrées au niveau de la base de données, la recherche de texte floue, les types de données spatiales et les bibliothèques d'analyse prédictive.
  • SQLScript permet aux développeurs de pousser une logique gourmande en données dans la base de données.
  • SQLScript encourage les développeurs à maintenir des algorithmes à l'aide d'un paradigme orienté ensemble, au lieu d'un seul enregistrement à la fois paradigme.
  • SQLScript permet cependant de boucler les résultats et d'utiliser la logique if-then-else.
  • SQLScript vous permet de décomposer des requêtes complexes en plusieurs instructions plus petites, simplifiant ainsi votre codage SQL et améliorant le parallélisme via l'optimiseur.

Remarque

La version de SQL standard sur laquelle SQLScript est basé est la version ANSI-92 populaire qui est prise en charge par presque toutes les bases de données.

Les fonctionnalités supplémentaires de SQLScript incluent l'utilisation de tables de colonnes SAP HANA Cloud, le transfert de paramètres entre les vues de calcul et SQLScript, l'utilisation de types de données spatiales et les bibliothèques d'analyse prédictive.

Développement d'une logique applicative avec SQLScript

Dans les approches client-serveur traditionnelles, la logique applicative est définie et exécutée sur le serveur d'application à l'aide de langages de programmation d'applications tels que ABAP ou C++. Avec SAP HANA Cloud, une grande partie de cette logique peut désormais être définie à l'aide de SQLScript, ce qui permet au développeur de définir et d'exécuter toutes les tâches de traitement des données dans la base de données afin d'améliorer les performances.

SQLScript vous permet d'utiliser des variables pour décomposer une grande instruction SQL complexe en instructions plus petites et plus simples. Cela rend le code beaucoup plus facile à comprendre. Cela facilite également les performances de SQL HANA Cloud car la plupart de ces instructions plus petites peuvent être exécutées en parallèle.

Regardez cette vidéo pour voir un exemple :

Dans l'exemple étudié, nous voulons savoir quel éditeur a le plus de livres :

Code Snippet
12
books_per_publisher = SELECT publisher, COUNT (*) AS num_books FROM BOOKS GROUP BY publisher; publisher_with_most_books = SELECT * FROM :books_per_publisher WHERE num_books >= (SELECT MAX (num_books) FROM :books_per_publisher);

Le compilateur et l'optimiseur SQLScript déterminent la meilleure façon d'exécuter ces instructions, que ce soit en utilisant une expression de sous-requête commune avec des notes de base de données ou en les combinant en une seule requête complexe. Le code devient plus facile à écrire et à comprendre, plus gérable et la productivité des développeurs augmente.

En divisant le SQLScript en instructions plus petites et en renseignant les variables de table, vous reflétez également la manière dont vous avez appris à créer vos vues de calcul. Tout comme lorsque vous commencez à créer des vues de calcul dans des couches, en partant du bas vers le haut, vous faites de même avec votre code SQLScript. Gardez à l'esprit que la séquence précise de vos étapes SQLScript n'est pas nécessairement l'ordre d'exécution, car l'optimiseur décidera toujours du meilleur plan d'exécution. Cependant, l'optimiseur ne modifiera jamais le résultat souhaité. Cela est également vrai pour les vues calculées.

Utilisation de variables

L'utilisation de variables dans les instructions SQL n'est pas spécifiée par le SQL ANSI-92. Dans SAP HANA Cloud, SQLScript implémente le concept de variable comme extension de ANSI-92 SQL.

Les variables peuvent être déclarées, affectées et réutilisées dans un script.

Utilisation de variables dans SQLScript

  • Déclarer une variable

    DECLARE <variable_name> <type> [NOT NULL] [= <value>]

    Exemple 1 : DECLARE a int;

    Exemple 2 : DECLARE b int = 0; (la valeur est affectée lors de la création de la variable)

  • Affecter une variable (définir la valeur d'une variable)

    <variable_name> = <value> or <expression>

    Exemple 1 : a = 3;

    Exemple 2 : b = select count(*) from baseTable;

  • Utiliser une variable dans une expression

    :<variable_name> (avec deux-points) renvoie la valeur actuelle de la variable

    Exemple : b = :a + 5; (affecte la valeur de a + 5 à b)

Types de données SQLScript

SQLScript ajoute également des types de données supplémentaires pour aider à traiter les fonctionnalités manquantes de SQL standard, par exemple, les types de données spatiales et les types de données texte.

Types de données ANSI-92 et SQLScript

ClassificationTypes de données ANSI-92 standardTypes de données spécifiques à SQLScript
Date/HeureDATE, HEURE, HORODATAGESECONDDATE
NumériqueDÉCIMAL, INTEGER, SMALLINT, FLOAT, REAL, DOUBLETINYINT, BIGINT, SMALLDECIMAL
Chaîne de caractèresCHAR, NCHAR, VARCHAR, NVARCHARALPHANE, TEXTE COURT
BinaireBINAIRE, VARBINAIRE 
Grand objet BLOB, CLOB, NCLOB, TEXT, BINTEXT
Booléen BOOLÉEN
Spatial ST_POINT, ST_GEOMETRY

Traitement des paramètres d'entrée définis dans les vues de calcul avec SQLScript

Lorsque vous utilisez une instruction SELECT dans SQLScript pour interroger une vue de calcul comportant des paramètres d'entrée, vous utilisez le mot-clé PLACEHOLDER avec le nom du paramètre d'entrée enveloppé en symboles $$ et la valeur que vous souhaitez transmettre au paramètre d'entrée, par exemple :

Transfert des paramètres d'entrée à la vue calculée

Utilisez le mot-clé PLACEHOLDER pour transmettre les paramètres d'entrée à la vue de calcul dans une instruction select :

Code Snippet
1234
SELECT "PRODUCT", sum("TAXED_AMOUNT") FROM "_SYS_BIC"."MyPackage/SalesResults" ('PLACEHOLDER' = ('$$Tax Amount$$', '17.5')) GROUP BY "PRODUCT"
Référence au paramètre d'entrée dans le script SQL

Dans SQLScript, vous faites référence au paramètre d'entrée à l'aide de deux-points : ;

Code Snippet
1
Sales with tax = Sales Revenue * :Tax_Amount

Il est également possible de transférer les paramètres de sortie générés à partir d'un SQLScript dans une vue de calcul à l'aide de la fonctionnalité de mappage de paramètres.

Bouclage et logique conditionnelle

En général, le code SQL est écrit de manière déclarative. Cela signifie que vous indiquez l'intention de l'action et que vous ne dictez pas comment les étapes de traitement des données doivent être exécutées dans un ordre particulier. Vous pouvez ainsi permettre à l'optimiseur SQL de déterminer le meilleur plan d'exécution en fonction de nombreux facteurs dynamiques au moment de l'exécution.

Cependant, vous devez parfois contrôler la logique d'exécution du SQL pour que les étapes soient exécutées dans un ordre particulier. Par exemple, lorsque vous devez effectuer une étape uniquement si une certaine condition est remplie ou que vous devez effectuer une boucle plusieurs fois. Dans ce cas, vous utiliserez une logique impérative.

Ceci n'est (pour la plupart) pas disponible dans ANSI SQL et SAP HANA fournit donc un langage de logique déclarative dans le cadre de SQLScript pour fournir un contrôle de flux.

Un manque de langage logique impératif est ce qui amène souvent le développeur à déplacer le traitement des données vers la couche application. Lorsqu'une application s'exécute sur HANA, vous devez vraiment pousser le plus de traitement des données possible vers la base de données. La logique impérative SQLScript de SAP HANA permet ainsi de réduire le besoin de traitement des données dans les couches de l'application et d'en faire plus dans la base de données.

Astuce

Rappelez-vous que la logique impérative ne peut pas avoir la même performance que la logique déclarative. En effet, l'optimiseur SQL n'est pas libre de décider de la séquence d'étapes et doit veiller à suivre votre logique, ce qui peut détruire les optimisations. Si vous avez besoin des meilleures performances, essayez d'éviter la logique impérative.

Logique conditionnelle

L'instruction IF
Code Snippet
12345678910
IF <bool-expr1> THEN {then-stmts1} {ELSEIF <bool-expr2> THEN {then-stmts2}} {ELSE {else-stmts3}} END IF
Exemple d'une instruction IF utilisant une clause ELSE.

La figure précédente illustre un exemple de l'instruction IF, qui se compose d'une expression booléenne, :found is NULL. Si l'expression est évaluée comme vraie, l'instruction CALL ins_msg_proc('result of count(*) cannot be NULL'); dans le bloc obligatoire THEN est exécutée. L'instruction IF se termine par END IF. Les parties restantes sont facultatives.

Si l'expression booléenne :found is NULL n'est pas évaluée comme vraie, la branche ELSE est évaluée. Dans la plupart des cas, cette branche commence par ELSE. L'instruction CALL ins_msg_proc('result of count(*) not NULL- as expected'); est exécutée sans autre contrôle. Après une autre branche, aucune autre branche ELSE ou ELSEIF n'est autorisée.

Sinon, lorsque ELSEIF est utilisé au lieu de ELSE, une autre expression booléenne peut être évaluée. Si elle est évaluée comme vraie, l'instruction suivante est exécutée. Vous pouvez ajouter un nombre arbitraire de clauses ELSEIF de cette manière.

Cette instruction peut être utilisée pour simuler l'instruction switch-case connue de nombreux langages de programmation.

Boucles WHILE et FOR

La boucle WHILE
Code Snippet
123
WHILE <bool-stmt> DO {stmts} END WHILE
La boucle WHILE exécute l'instruction stmts dans le corps de la boucle tant que l'expression booléenne au début bool-stmt de la boucle est évaluée comme vraie.
La boucle FOR
Code Snippet
123
FOR <loop-var> IN {REVERSE} <start>..<end> DO {stmts} END FOR
La boucle FOR itère une plage de valeurs numériques (indiquées par le début et la fin dans la syntaxe) et lie la valeur actuelle à une variable (loop-var) dans l'ordre croissant. L'itération commence par le début de la valeur et est incrémentée de un jusqu'à ce que la loop-var soit plus grande que la fin.

Par conséquent, si le début est supérieur à la fin, la boucle du corps ne sera pas évaluée. Pour chaque valeur énumérée de la variable de boucle, les instructions dans le corps de la boucle sont évaluées. Le mot-clé facultatif REVERSE spécifie d'itérer la plage dans l'ordre décroissant.