Nouveautés SQL en V5R10

BoTTom |    Changer de couleur
 
 nouveautés SQL en V5R10 :
 
 - le 2 phases commit est admis sur IP.
 
   [ ce qui permet de rendre le driver ODBC de client access compatible
      avec ODBC 3.5  et avec MTS (Microsoft Transaction Server).]
 
 - l'instruction SET RESULT SET permettant dans une procédure cataloguée
    de retourner un curseur ouvert ou un tableau est maintenant
    valide dans une utilisation DRDA ou CLI (APi ODBC)
 
 
 - l'ordre create table admet une copie de la définition d'une autre table :
 
    CREATE TABLE2 LIKE TABLE1 (table2 est identique à table1)
 
    CREATE TABLE3 (like table1 , autrezone char(10))
 
      même liste de champs PLUS des champs spécifiques
 
       (la duplication d'un seul CHAMP est impossible)


|    Changer de couleur
 
 
 - RIGHT OUTER JOIN
 
   jointure externe à partir du fichier de droite du mot-clé JOIN
 
  select ... from clients RIGHT OUTER JOIN commandes
 
 (toutes les commandes ,même si le client est inconnu)
 
 et RIGHT EXCEPTION JOIN
 
  select ... from clients RIGHT EXCPTION JOIN commandes
 
 (toutes les commandes dont le client est inconnu)
 
 
 - les expressions sont admises sur la clause LIKE
 
     SELECT * from producteurs WHERE pr_nom like
                '%' concat trim(PR_COMMUNE) concat '%'
 


|    Changer de couleur
 
 l'ordre SELECT peut-être complété par :
 
   FETCH FIRST x ROWS ONLY 
 
 qui indique à SQL de ne retourner que les "x" premières lignes.
 
 très pratique pour obtenir les meilleurs scores (Top 10, Top 100, ...)
 
  select codart , count(*) from commandes
     group by codart
    order by 2
     FETCH FIRST 50 ROWS ONLY
 
  vous donne les 50 articles les moins commandés (en nb de commandes)
 
  select codart , count(*) from commandes
     group by codart
    order by 2 DESC
     FETCH FIRST 50 ROWS ONLY
 
  vous donne les 50 articles les plus commandés.


|    Changer de couleur
 
 il est possible de placer un SELECT (simple) dans la liste des colonnes
  d'un Select :
 
 vous souhaitez obtenir la liste des commandes en rappelant sur chaque
  ligne le montant global commandé.
 
   Select codart , qte * prix as montant, (select sum(qte * prix)
                                            from commandes) as total
    from commandes
 
 vous pouvez utiliser dans le select imbriqué, n'importe quelle variable de
   n'importe quel fichier de la clause FROM du select principal, si vous
   l'utilisez aussi dans le WHERE ou le HAVING du select imbriqué.
 
 vous souhaitez obtenir la liste des commandes en rapppellant sur chaque
  ligne le montant global commandé pour la famille.
 
   Select codart , qte * prix as montant, (select sum(qte * prix)
                                            from commandes where
                                            famcod = c1.famcod) as totfam
    from commandes c1


|    Changer de couleur
 Contre exemple :
 ---------------
  vous souhaitez obtenir la liste des commandes en indiquant sur chaque
   ligne le % représenté par ce montant, dans la famille :
 
    Select codart , qte * prix as montant, (select sum(qte * prix) /
                                             (c1.QTE * c1.prix) from
                                             commandes c2       where
                                             c2.famcod = c1.famcod)
     from commandes c1
 
 CA ne marche PAS, (les labs le prévoient pour une prochaine version)
 
 quelques restrictions :
 ----------------------
  Le select doit produire un résultat d'UNE ligne et d'une seule colonne
 
  GROUP BY / HAVING et UNION sont invalides
  cette colonne ne peut pas être utilisée dans ORDER BY.
 
  ce select ne doit pas être placé dans un select imbriqué (WHERE SELECT..)
                                   dans une vue.


|    Changer de couleur
 
 nouvelles fonctions :
 
  PI                    retourne pi (3.141592653589793)
 
  SPACE(x)              retourne x blancs
 
  DAYOFWEEK_ISO(date)   retourne le n° du jour de la semaine (1=Lundi))
 
  WEEK_ISO(adte)        retourne le n° de semaine dans l'année
 
                          est considéré comme semaine 1 la première
                            semaine possédant un JEUDI dans l'année.
 
  JULIAN_DAY(date)      nombre de jours depuis le 1 janvier 4712 av JC.
 
  MIDNIGHT_SECONDS(h)   retourne le nombre de secondes séparant une heure
                        (ou un timestamp) de minuit.
 
 
  TIMESTAMPDIFF(c, d)   retourne un écart
 


|    Changer de couleur
 
 C indique l'unité de mesure de l'écart que vous souhaitez obtenir.
 
   1 : fractions de secondes          32 : Semaines
   2 : Secondes                       64 : Mois
   4 : Minutes                       128 : Trimestres
   8 : Heures                        256 : Années
  16 : Jours
 
 on part du principe qu'il y a : 365 jours par AN, 30 jours par mois
                                  24 heures / jour, 60 minutes /heure etc...
 
 
 D représente la différence entre deux timestamps sous forme d'une chaine
    de 22 c. de long.
 
 TIMLESTAMPDIFF(32 ,
    CAST(CURRENT_TIMESTAMP - CAST(DATLIV AS TIMESTAMP) AS CHAR(22)) )
 
 
   donne le nombre de semaines qui séparent DATLIV d'aujourd'hui.
 





©AF400