4D – Référence SQL
Utiliser la fonction CAST
Le langage SQL établit des règles relativement restrictives pour la combinaison de données de différents types dans les expressions. Généralement le SGBD est chargé d’effectuer les conversions de données nécessaires. Cependant, le standard SQL requiert que le SGBD génère une erreur si vous tentez de comparer par exemple des numériques avec des chaînes de caractères. Dans ce contexte, la fonction CAST est très précieuse, en particulier lorsque le SQL est combiné à un langage de programmation manipulant des types de données non pris en charge par le standard SQL.
Cette section adapte l’exemple de la section Recevoir le résultat d’une requête SQL dans un tableau de manière à utiliser la fonction CAST.
Le code 4D initial est le suivant :
TABLEAU ENTIER LONG(aSoldTickets;0)
TABLEAU ENTIER(aMovieYear;0)
TABLEAU TEXTE(aTitles;0)
TABLEAU TEXTE(aDirectors;0)
TABLEAU TEXTE(aMedias;0)
REDUIRE SELECTION([MOVIES];0)
$MovieYear:=Num(« 1960″)
CHERCHER([MOVIES];[MOVIES]Year_of_Movie>=$MovieYear)
SELECTION VERS
TABLEAU([MOVIES]Year_of_Movie;aMovieYear;[MOVIES]Title;aTitles;[MOVIES]Director;aDirectors;
[MOVIES]Media;aMedias;[MOVIES]Sold_Tickets;aSoldTickets)
En utilisant du code SQL :
TABLEAU ENTIER LONG(aSoldTickets;0)
TABLEAU ENTIER(aMovieYear;0)
TABLEAU TEXTE(aTitles;0)
TABLEAU TEXTE(aDirectors;0)
TABLEAU TEXTE(aMedias;0)
Debut SQL
SELECT Year_of_Movie, Title, Director, Media, Sold_Tickets
FROM MOVIES
WHERE Year_of_Movie >= CAST(‘1960’ AS INT)
INTO :aMovieYear, :aTitles, :aDirectors, :aMedias, :aSoldTickets;
Fin SQL
En utilisant les commandes SQL génériques :
TABLEAU ENTIER LONG(aSoldTickets;0)
TABLEAU ENTIER(aMovieYear;0)
TABLEAU TEXTE(aTitles;0)
TABLEAU TEXTE(aDirectors;0)
TABLEAU TEXTE(aMedias;0)
C_TEXTE($tQueryTxt)
REDUIRE SELECTION([MOVIES];0)
SQL LOGIN(SQL_INTERNAL; » »; » »)
$tQueryTxt:= » »
$tQueryTxt:=$tQueryTxt+ »SELECT Year_of_Movie, Title, Director, Media, Sold_Tickets »
$tQueryTxt:=$tQueryTxt+ » FROM MOVIES »
$tQueryTxt:=$tQueryTxt+ » WHERE Year_of_Movie >= CAST(‘1960’ AS INT) »
SQL EXECUTER($tQueryTxt;aMovieYear;aTitles;aDirectors;aMedias;aSoldTickets)
SQL CHARGER ENREGISTREMENT(SQL Tous les enregistrements)
SQL LOGOUT
En utilisant la commande CHERCHER PAR SQL :
TABLEAU ENTIER LONG(aSoldTickets;0)
TABLEAU ENTIER(aMovieYear;0)
TABLEAU TEXTE(aTitles;0)
TABLEAU TEXTE(aDirectors;0)
TABLEAU TEXTE(aMedias;0)
REDUIRE SELECTION([MOVIES];0)
CHERCHER PAR SQL([MOVIES]; »Year_of_Movie >= CAST(‘1960’ AS INT) »)
SELECTION VERS
TABLEAU([MOVIES]Year_of_Movie;aMovieYear;[MOVIES]Title;aTitles;[MOVIES]Director;aDirectors;
[MOVIES]Media;aMedias;[MOVIES]Sold_Tickets;aSoldTickets)
En utilisant la commande SQL dynamique EXECUTE IMMEDIATE :
TABLEAU ENTIER LONG(aSoldTickets;0)
TABLEAU ENTIER(aMovieYear;0)
TABLEAU TEXTE(aTitles;0)
TABLEAU TEXTE(aDirectors;0)
TABLEAU TEXTE(aMedias;0)
C_TEXTE($tQueryTxt)
REDUIRE SELECTION([MOVIES];0)
$tQueryTxt:= » »
$tQueryTxt:=$tQueryTxt+ »SELECT Year_of_Movie, Title, Director, Media, Sold_Tickets »
$tQueryTxt:=$tQueryTxt+ » FROM MOVIES »
$tQueryTxt:=$tQueryTxt+ » WHERE Year_of_Movie >= CAST(‘1960’ AS INT) »
$tQueryTxt:=$tQueryTxt+ » INTO :aMovieYear, :aTitles, :aDirectors, :aMedias, :aSoldTickets; »
Debut SQL
EXECUTE IMMEDIATE :$tQueryTxt;
Fin SQL
Pour tester tous ces exemples, lancez la base « 4D SQL Code Samples » et affichez la boîte de dialogue principale.
Choisissez le mode d’interrogation du moteur de 4D et cliquez sur le bouton Utilisation de CAST.
Utiliser la clause ORDER BY
Nous souhaitons désormais récupérer tous les films tournés depuis 1960 et, pour chaque film, l’année, le titre, le réalisateur, le support media et le nombre d’entrées. Le résultat devra être trié par année. Voici le code 4D correspondant à cette requête :
TABLEAU ENTIER LONG(aNrActors;0)
TABLEAU ENTIER LONG(aSoldTickets;0)
TABLEAU ENTIER(aMovieYear;0)
TABLEAU TEXTE(aTitles;0)
TABLEAU TEXTE(aDirectors;0)
TABLEAU TEXTE(aMedias;0)
C_ENTIER LONG($MovieYear)
REDUIRE SELECTION([MOVIES];0)
$MovieYear:=1960
CHERCHER([MOVIES];[MOVIES]Year_of_Movie>=$MovieYear)
SELECTION VERS
TABLEAU([MOVIES]Year_of_Movie;aMovieYear;[MOVIES]Title;aTitles;[MOVIES]Director;aDirectors;
[MOVIES]Media;aMedias;[MOVIES]Sold_Tickets;aSoldTickets)
TRIER TABLEAU(aMovieYear;aTitles;aDirectors;aMedias;>)
En utilisant du code SQL :
TABLEAU ENTIER LONG(aNrActors;0)
TABLEAU ENTIER LONG(aSoldTickets;0)
TABLEAU ENTIER(aMovieYear;0)
TABLEAU TEXTE(aTitles;0)
TABLEAU TEXTE(aDirectors;0)
TABLEAU TEXTE(aMedias;0)
C_ENTIER LONG($MovieYear)
REDUIRE SELECTION([MOVIES];0)
$MovieYear:=1960
Debut SQL
SELECT Year_of_Movie, Title, Director, Media, Sold_Tickets
FROM MOVIES
WHERE Year_of_Movie >= :$MovieYear
ORDER BY 1
INTO :aMovieYear, :aTitles, :aDirectors, :aMedias, :aSoldTickets;
Fin SQL
En utilisant les commandes SQL génériques :
C_TEXTE($tQueryTxt)
TABLEAU ENTIER LONG(aNrActors;0)
TABLEAU ENTIER LONG(aSoldTickets;0)
TABLEAU ENTIER(aMovieYear;0)
TABLEAU TEXTE(aTitles;0)
TABLEAU TEXTE(aDirectors;0)
TABLEAU TEXTE(aMedias;0)
C_ENTIER LONG($MovieYear)
REDUIRE SELECTION([MOVIES];0)
$MovieYear:=1960
SQL LOGIN(SQL_INTERNAL; » »; » »)
$tQueryTxt:= » »
$tQueryTxt:=$tQueryTxt+ »SELECT Year_of_Movie, Title, Director, Media, Sold_Tickets »
$tQueryTxt:=$tQueryTxt+ » FROM MOVIES »
$tQueryTxt:=$tQueryTxt+ » WHERE Year_of_Movie >= :$MovieYear »
$tQueryTxt:=$tQueryTxt+ » ORDER BY 1″
SQL EXECUTER($tQueryTxt;aMovieYear;aTitles;aDirectors;aMedias;aSoldTickets)
SQL CHARGER ENREGISTREMENT(SQL Tous les enregistrements)
SQL LOGOUT
En utilisant la commande CHERCHER PAR SQL :
TABLEAU ENTIER LONG(aNrActors;0)
TABLEAU ENTIER LONG(aSoldTickets;0)
TABLEAU ENTIER(aMovieYear;0)
TABLEAU TEXTE(aTitles;0)
TABLEAU TEXTE(aDirectors;0)
TABLEAU TEXTE(aMedias;0)
C_ENTIER LONG($MovieYear)
REDUIRE SELECTION([MOVIES];0)
$MovieYear:=1960
CHERCHER PAR SQL([MOVIES]; »Year_of_Movie >= :$MovieYear »)
SELECTION VERS
TABLEAU([MOVIES]Year_of_Movie;aMovieYear;[MOVIES]Title;aTitles;[MOVIES]Director;aDirectors;
[MOVIES]Media;aMedias;[MOVIES]Sold_Tickets;aSoldTickets)
TRIER TABLEAU(aMovieYear;aTitles;aDirectors;aMedias;>)
En utilisant la commande SQL dynamique EXECUTE IMMEDIATE :
TABLEAU ENTIER LONG(aNrActors;0)
C_TEXTE($tQueryTxt)
TABLEAU ENTIER LONG(aSoldTickets;0)
TABLEAU ENTIER(aMovieYear;0)
TABLEAU TEXTE(aTitles;0)
TABLEAU TEXTE(aDirectors;0)
TABLEAU TEXTE(aMedias;0)
C_ENTIER LONG($MovieYear)
REDUIRE SELECTION([MOVIES];0)
$MovieYear:=1960
$tQueryTxt:= » » Year_of_Movie, Title, Director, Media, Sold_Tickets »
$tQueryTxt:=$tQueryTxt+ »SELECT
$tQueryTxt:=$tQueryTxt+ » FROM MOVIES »
$tQueryTxt:=$tQueryTxt+ » WHERE Year_of_Movie >= :$MovieYear »
$tQueryTxt:=$tQueryTxt+ » ORDER BY 1″
$tQueryTxt:=$tQueryTxt+ » INTO :aMovieYear, :aTitles, :aDirectors, :aMedias,
:aSoldTickets; »
Debut SQL
EXECUTE IMMEDIATE :$tQueryTxt;
Fin SQL
Pour tester tous ces exemples, lancez la base « 4D SQL Code Samples » et affichez la boîte de dialogue principale.
Choisissez le mode d’interrogation du moteur de 4D et cliquez sur le bouton Clause ORDER BY.
Utiliser la clause GROUP BY
Nous souhaitons obtenir le nombre annuel total d’entrées depuis 1979. Le résultat devra être trié par année.
Voici le code 4D correspondant à cette requête :
TABLEAU ENTIER(aMovieYear;0)
TABLEAU ENTIER LONG(aSoldTickets;0)
C_ENTIER LONG($MovieYear;$vCrtMovieYear;$i)
REDUIRE SELECTION([MOVIES];0)
$MovieYear:=1979
CHERCHER([MOVIES];[MOVIES]Year_of_Movie>=$MovieYear)
TRIER([MOVIES];[MOVIES]Year_of_Movie;>)
$vCrtMovieYear:=0
$vInd:=Taille tableau(aMovieYear)
Boucle($i;1;Enregistrements trouves([MOVIES]))
Si([MOVIES]Year_of_Movie#$vCrtMovieYear)
$vCrtMovieYear:=[MOVIES]Year_of_Movie
$vInd:=$vInd+1
INSERER DANS TABLEAU(aMovieYear;$vInd;1)
aMovieYear{$vInd}:=$vCrtMovieYear
INSERER DANS TABLEAU(aSoldTickets;$vInd;1)
Fin de si
aSoldTickets{$vInd}:=aSoldTickets{$vInd}+[MOVIES]Sold_Tickets
ENREGISTREMENT SUIVANT([MOVIES])
Fin de boucle
` Initialisation du reste des colonnes de list box pour visualiser l’information TABLEAU TEXTE(aTitles;Taille tableau(aMovieYear)) TABLEAU TEXTE(aDirectors;Taille tableau(aMovieYear))
TABLEAU TEXTE(aMedias;Taille tableau(aMovieYear))
TABLEAU ENTIER LONG(aNrActors;Taille tableau(aMovieYear))
En utilisant du code SQL :
TABLEAU ENTIER(aMovieYear;0)
TABLEAU ENTIER LONG(aSoldTickets;0)
C_ENTIER LONG($MovieYear)
REDUIRE SELECTION([MOVIES];0)
$MovieYear:=1979
Debut SQL
SELECT Year_of_Movie, SUM(Sold_Tickets)
FROM MOVIES
WHERE Year_of_Movie >= :$MovieYear
GROUP BY Year_of_Movie
ORDER BY 1
INTO :aMovieYear, :aSoldTickets;
Fin SQL
` Initialisation du reste des colonnes de list box pour visualiser l’information TABLEAU TEXTE(aTitles;Taille tableau(aMovieYear)) TABLEAU TEXTE(aDirectors;Taille tableau(aMovieYear))
TABLEAU TEXTE(aMedias;Taille tableau(aMovieYear))
TABLEAU ENTIER LONG(aNrActors;Taille tableau(aMovieYear))
En utilisant les commandes SQL génériques :
C_TEXTE($tQueryTxt)
TABLEAU ENTIER LONG(aSoldTickets;0)
TABLEAU ENTIER(aMovieYear;0)
C_ENTIER LONG($MovieYear)
REDUIRE SELECTION([MOVIES];0)
$MovieYear:=1979
SQL LOGIN(SQL_INTERNAL; » »; » »)
$tQueryTxt:= » » Year_of_Movie, SUM(Sold_Tickets) »
$tQueryTxt:=$tQueryTxt+ »SELECT
$tQueryTxt:=$tQueryTxt+ » FROM MOVIES »
$tQueryTxt:=$tQueryTxt+ » WHERE Year_of_Movie >= :$MovieYear »
$tQueryTxt:=$tQueryTxt+ » GROUP BY Year_of_Movie »
$tQueryTxt:=$tQueryTxt+ » ORDER BY 1″
SQL EXECUTER($tQueryTxt;aMovieYear;aSoldTickets)
SQL CHARGER ENREGISTREMENT(SQL Tous les enregistrements)
SQL LOGOUT
` Initialisation du reste des colonnes de list box pour visualiser l’information TABLEAU TEXTE(aTitles;Taille tableau(aMovieYear)) TABLEAU TEXTE(aDirectors;Taille tableau(aMovieYear))
TABLEAU TEXTE(aMedias;Taille tableau(aMovieYear))
TABLEAU ENTIER LONG(aNrActors;Taille tableau(aMovieYear))
En utilisant la commande CHERCHER PAR SQL :
TABLEAU ENTIER LONG(aSoldTickets;0)
TABLEAU ENTIER(aMovieYear;0)
C_ENTIER LONG($MovieYear)
REDUIRE SELECTION([MOVIES];0)
$MovieYear:=1979
CHERCHER PAR SQL([MOVIES]; »Year_of_Movie >= :$MovieYear ») TRIER([MOVIES];[MOVIES]Year_of_Movie;>) $vCrtMovieYear:=0
$vInd:=Taille tableau(aMovieYear)
Boucle($i;1;Enregistrements trouves([MOVIES]))
Si([MOVIES]Year_of_Movie#$vCrtMovieYear)
$vCrtMovieYear:=[MOVIES]Year_of_Movie
$vInd:=$vInd+1
INSERER DANS TABLEAU(aMovieYear;$vInd;1)
aMovieYear{$vInd}:=$vCrtMovieYear
INSERER DANS TABLEAU(aSoldTickets;$vInd;1)
Fin de si
aSoldTickets{$vInd}:=aSoldTickets{$vInd}+[MOVIES]Sold_Tickets
ENREGISTREMENT SUIVANT([MOVIES])
Fin de boucle
` Initialisation du reste des colonnes de list box pour visualiser l’information TABLEAU TEXTE(aTitles;Taille tableau(aMovieYear)) TABLEAU TEXTE(aDirectors;Taille tableau(aMovieYear))
TABLEAU TEXTE(aMedias;Taille tableau(aMovieYear))
TABLEAU ENTIER LONG(aNrActors;Taille tableau(aMovieYear))
En utilisant la commande SQL dynamique EXECUTE IMMEDIATE :
C_TEXTE($tQueryTxt)
TABLEAU ENTIER LONG(aSoldTickets;0)
TABLEAU ENTIER(aMovieYear;0)
C_ENTIER LONG($MovieYear)
$MovieYear:=1979
$tQueryTxt:= » »
$tQueryTxt:=$tQueryTxt+ »SELECT Year_of_Movie, SUM(Sold_Tickets) »
$tQueryTxt:=$tQueryTxt+ » FROM MOVIES »
$tQueryTxt:=$tQueryTxt+ » WHERE Year_of_Movie >= :$MovieYear »
$tQueryTxt:=$tQueryTxt+ » GROUP BY Year_of_Movie »
$tQueryTxt:=$tQueryTxt+ » ORDER BY 1″
$tQueryTxt:=$tQueryTxt+ » INTO :aMovieYear, :aSoldTickets; »
Debut SQL
EXECUTE IMMEDIATE :$tQueryTxt;
Fin SQL
` Initialisation du reste des colonnes de list box pour visualiser l’information TABLEAU TEXTE(aTitles;Taille tableau(aMovieYear)) TABLEAU TEXTE(aDirectors;Taille tableau(aMovieYear))
TABLEAU TEXTE(aMedias;Taille tableau(aMovieYear))
TABLEAU ENTIER LONG(aNrActors;Taille tableau(aMovieYear))
Pour tester tous ces exemples, lancez la base « 4D SQL Code Samples » et affichez la boîte de dialogue principale. Choisissez le mode d’interrogation du moteur de 4D et cliquez sur le bouton Clause GROUP BY.
Prise en main
Utiliser le SQL dans 4D
Commandes SQL
Règles de syntaxe
Transactions
Fonctions
Annexes
Liste alphabétique des commandes