• Aucun résultat trouvé

NOTE TECHNIQUE ERP SQL PGI. Version 2.00 du 02/04/2019 Document Public

N/A
N/A
Protected

Academic year: 2022

Partager "NOTE TECHNIQUE ERP SQL PGI. Version 2.00 du 02/04/2019 Document Public"

Copied!
32
0
0

Texte intégral

(1)

NOTE TECHNIQUE

ERP

SQL PGI

(2)

SOMMAIRE

1. I

NTRODUCTION

... 2

2. E

LEMENTS DE BASE DU

SQL PGI ... 3

Scripts, batchs, instructions SQL ... 3

Eléments terminaux de base et ponctuation... 4

3. I

NSTRUCTIONS

DML ... 5

Instruction SELECT ... 5

Common Table Expression - CTE ... 8

Instruction INSERT ... 10

Instruction UPDATE ... 10

Instruction DELETE ... 11

Instruction MERGE ... 11

4. I

NSTRUCTIONS

DDL ... 14

Instructions de création d'objets ... 14

Instructions de suppression d'objets ... 19

Modification (activation/désactivation) des triggers ... 19

Instruction DDL : DdlStatement ... 19

5. F

ONCTIONS INTERNES ET ÉTENDUES

... 23

Fonctions internes ... 23

Fonctions étendues ... 25

(3)

1. I NTRODUCTION

Le Langage SQL PGI est inspiré de SQL 92, de TSQL (SQL spécifique Microsoft) et ORACLE-SQL.

Les instructions SQL sont traduites dans le SQL natif du SGBD utilisé (SQL Server, ORACLE ou Sqlite) par les différents outils CBP : traduction à la volée pour le Framework CBP.net, traduction lors de la création/recréation dans la base par DbScriptGenerator.

L’analyse et la traduction du SQL PGI implique une syntaxe stricte qui interdit l’utilisation de fonctions spécifiques au moteur non prévues dans la grammaire du SQL PGI.

Pour la même raison, certaines requêtes qui étaient valides pour les versions précédentes de CBP (versions de CBP antérieures à la version 10) ne sont plus valides et doivent être corrigées.

Le présent document fournit des éléments de base du langage, quelques schémas de syntaxe et des liens vers la référence de la grammaire du SQL PGI sous forme BNF (Backus Naur Form).

Les éléments terminaux (mots clés du langage) sont notés en gras, les règles de syntaxe du langage (règles de production BNF) sont notées en italique.

Les éléments optionnels sont suffixés par la terminaison opt et/ou encadrés par des [ ].

Les règles BNF ont été simplifiées par rapport à la référence pour plus de lisibilité, en cas de doute, se référer au document html : SqlGrammar.html

(4)

2. E LEMENTS DE BASE DU SQL PGI Scripts, batchs, instructions SQL

Un programme SQL PGI est soit une instruction SQL simple soit un script SQL : SqlSyntax :

SimpleSqlStatement SqlScript;

Un script SQL est une liste de batch séparés par des GO :

SqlScript : SqlBatch

SqlScript GO SqlBatch

Un batch SQL est une liste d'instructions :

SqlBatch :

SqlInstruction

SqlBatch SqlInstruction

Une instruction SQL est un statement SQL terminé par ;

SqlInstruction :

SimpleSqlStatement ;

Une instruction SQL peut éventuellement débuter par un commentaire qui est conservé lors de la traduction en SQL spécifique et transmis au moteur de base de données

SimpleSqlStatement :

DelimitedCommentOpt SqlStatement

Le commentaire optionnel conservé lors de la traduction en SQL spécifique et transmis au moteur de base de données, ce qui permet par exemple de se repérer dans les traces ou de fournir des hint au moteur SQL (déconseillé aussi bien par Microsoft que ORACLE)

DelimitedCommentOpt : /* Chaine de texte */

Une instruction SQL est soit une instruction DML (Data Manipulation Language : SELECT UPDATE , DELETE ou INSERT), soit une instruction ou un bloc DDL (Data Definition Langage : création de table, index, procédure, trigger etc.) de création d’objet – cf. les chapitres dédiés au DML et DDL.

SqlStatement :

SqlDmlStatement SqlDdlStatement DdlStatementBlock;

(5)

Eléments terminaux de base et ponctuation

Les éléments terminaux sont des éléments mots clé du langage ou des éléments reconnus directement par l’analyseur SQL : chaine entre simple ou double quotes, nombre, identifiant (nom de table colonne ou autre objet SQL).

SqlIdentifier : Chaine [ Chaine ]

Un identifiant permet de d’identifier (nommer) une colonne, une table ou tout autre objet Sql.

Un identifiant peut éventuellement s’écrire entre crochets, il est dans ce cas possible d’utiliser des caractères spéciaux non autorisés habituellement pour un identifiant ($, ., espace etc.)

La syntaxe ANSI d’un identifiant (chaine entre doubles quotes) n’est pas supportée, seule la syntaxe spécifique Microsoft (chaine entre crochets [] ) est autorisée pour pouvoir utiliser des caractères spéciaux en tant que partie de l’identifiant.

Exemple :

SELECT 'Hello World' as [Hello World Column]

FROM DETABLES SqlStringLiteral:

"chaine"

‘Chaine’

Littéral de type chaine délimité par ' ou "

Il faut doubler les caractères « ou ‘ pour les inclure dans la sortie.

Punctuation :

( ) ;

, n’est pas un élément de ponctuation car utilisé comme mot clé dans les jointures (ancienne syntaxe de jointure équivalente au produit cartésien de deux tables ou CROSS-JOIN)

(6)

3. I NSTRUCTIONS DML

Les instructions DML (Data Manipulation Language) regroupent toutes les instructions SQL qui manipulent les données : SELECT, INSERT, UPDATE, DELETE et MERGE, par opposition aux instructions DDL (Data Definition Language) qui permettent de créer des objets dans la base : tables, vues, procédures, fonctions et triggers.

SqlDmlStatement :

QueryStatement DeleteStatement InsertStatement UpdateStatement MergeStatement

ProcedureCallStatement

Instruction SELECT

Le SelectStatement

L’instruction SELECT (ou QueryStatement dans la grammaire PGI) est l’instruction SQL qui permet de lire les données.

QueryStatement : WithStatement SelectStatement

/// Instruction retournant le résultat d'un requête éventuellement trié SelectStatement :

SelectStatementQuery OrderByClauseOpt

SelectStatement :

La clause ORDER BY peut être suivie d’une clause OFFSET xxx LIMIT yyy, qui permet de gérer de la pagination dans le resultset.

/// Requête qui récupère des lignes de la base de données et permet de sélectionner une ou plusieurs lignes ou colonnes d'une ou de plusieurs tables

Query

SELECT SelectHintOpt RestrictionOpt TopClauseOpt ColumnList FromClauseOpt WhereClauseOpt GroupByClauseOpt HavingClauseOpt

Query (

ORDER

UNION UNION ALL

)

EXCEPT

INTERSECT

OrderItem

,

ASC DESC

OFFSET OffsetExpression

LIMIT LimitExpression BY

(7)

Le HintComment est un commentaire utilisé par ORACLE pour spécifier un hint (conseil) de plan de requête.

Son usage est très spécifique et déconseillé.

Clause From

La clause FROM TableSource spécifie la source des données.

Cette clause est optionnelle comme en MsSQL (pour ORACLE, un FROM DUAL est ajouté par le traducteur CBP), et peut inclure une table, des jointures entre plusieurs tables, une sous requête, un LOOKUP (tablette PGI), et dans un trigger uniquement les tables virtuelles :NEW ou :OLD qui correspondent aux enregistrements ajoutés et supprimés par l’instruction qui a déclenché le trigger.

TableSource:

La clause TEMPORARY.TableName permet de spécifier une table temporaire PGI, créée à l’aide d’un CREATE TEMPORARY.TableName (… ). Cbp.net ouvre et ferme de nombreuses connexions, il n’y donc pas de connexion permanente au serveur et pas de table temporaire au sens Sql Server (supprimée à la fermeture de la connexion).

Ces tables doivent donc être supprimées en fin d’utilisation.

PGI_SHARED_DB(SourceName) permet de rediriger la source de données vers une autre base de données ou dossier PGI. SourceName est le nom d’une base de données ou dossier PGI.

PGI_LOOKUP(LookupName) n’est pas littéralement traduit en SQL mais supporté par le framework via le chargement du MCD (Modèle de données Conceptuel).

SELECT

Query :

HintComment */

/* ALL

DISTINCT

TOP

Variable Reference Constante

ColumnList

TableSource WHERE Condition GROUP BY ValueList HAVING Condition

FROM

(8)

/// Requête valide pour un select statement SelectStatementQuery :

QueryUnionExpression QueryExpression;

/// Sous select statement SubSelectStatement :

( SelectStatement ) /// Expression d'une requête QueryExpression :

Query

SubQueryExpression /// Sous requête

SubQueryExpression : ( QueryExpression ) /// Expression d'une union QueryUnionExpression :

QueryUnion

SubQueryUnionExpression /// Sous union

SubQueryUnionExpression : ( QueryUnionExpression ) /// Union entre deux requêtes QueryUnion :

QueryUnionLeft UnionOperator QueryUnionRight /// Expression valide à droite d'une union

QueryUnionRight :

QueryExpression

SubQueryUnionExpression /// Expression valide à gauche d'une union QueryUnionLeft :

QueryExpression QueryUnionExpression

/// Opérateurs d'union entre deux requêtes UnionOperator

UNION UNION ALL INTERSECT

EXCEPT // Oracle -> MINUS

La clause INTERSECT permet de réaliser l’intersection entre les résultats de deux requêtes, c’est-à-dire l’ensemble de lignes communes aux ensembles résultant de chacune des requêtes.

Clause Where

(9)

WhereClause:

La clause WHERE est facultative. Si elle n’est pas présence, toutes les lignes de la source (table, jointure etc.) seront affectée par l’instruction.

Comparison Operator

Référence du SelectStatement PGI : cf. document SqlGrammar.html

Common Table Expression - CTE

La CTE (Common Table Expression) ou WithStatement est une extension du QueryStatement, elle précède l’instruction SELECT et permet de définir une requête réutilisable dans le SELECT.

WHERE Predicate

=

<>

!=

<

<=

>

>=

(10)

/// Instruction définissant une requête utilisant des CTE (Common Table Expression) WithStatement :

WithClause SelectStatement /// Clause de définition des CTE WithClause :

WITH CommonTableExpressionList /// Liste des CTE

CommonTableExpressionList : CommonTableExpression

CommonTableExpressionList , CommonTableExpression /// Définition d'une CTE

CommonTableExpression :

TableName ColumnsDefinitionOpt AS ( SelectStatementQuery )

Exemples de CTE :

Les familles d’article PGI étant définies comme des « tablettes » enregistrées dans CHOIXCOD dont le type (CC_TYPE) est égal à FN1 pour la famille d’article 1 , FN2 pour la famille no 2 etc. , on peut définir et utiliser la CTE FamilleArticle comme suit :

-- Enregistrements de la famille d'article FNx WITH FamilleArticle ( Famille, Code, Libelle ) AS (

SELECT CC_TYPE, CC_CODE, CC_LIBELLE FROM CHOIXCOD

WHERE CC_TYPE LIKE 'FN[0-9]' )

-- LISTER LA FAMILLE 1 SELECT *

FROM FamilleArticle WHERE Famille = 'FN1' ;

-- Articles de la famille d'articles no 2

WITH FamilleArticle ( Famille, Code, Libelle ) AS (

SELECT CC_TYPE, CC_CODE, CC_LIBELLE FROM CHOIXCOD

WHERE CC_TYPE LIKE 'FN[0-9]' )

SELECT FamilleArticle.Famille, FamilleArticle.Code, FamilleArticle.Libelle, GA_ARTICLE, GA_LIBELLE, GA_LIBCOMPL, GA_DPA

FROM ARTICLE

, WithStatement:

WITH CTE SelectStatement

Name AS ( SelectStatement )

Query

( ColumnName )

,

(11)

INNER JOIN FamilleArticle

ON FamilleArticle.Famille = 'FN2' AND GA_FAMILLENIV2 = FamilleArticle.Code ORDER BY FamilleArticle.Code, ARTICLE.GA_LIBELLE ;

Instruction INSERT

L’instruction INSERT permet d’insérer des nouvelles données dans une table.

InsertStatement

INSERT IntoOpt TableReference ValuesSpecification /// Clauses valides pour la spécification des données à insérer ValuesSpecification

AffectedValues

SelectStatementValues DefaultValues

/// Clause déterminant d'une part les colonnes à modifier et d'autre part une requête retournant la liste des valeurs à affecter SelectStatementValues

( ColumnNames ) SelectStatement

/// Clause déterminant d'une part les colonnes à modifier et d'autre part la liste des valeurs à affecter AffectedValues

( ColumnNames )VALUES( ValueList )

/// Clause indiquant qu'il faut utiliser les valeurs par défaut spécifiées dans la base de données DefaultValues

DEFAULTVALUES Into

INTO

/// Liste de noms de colonnes séparés par des virgules ColumnNames

ObjectIdentifierList

Instruction UPDATE

/// Instruction de mise à jour de données UpdateStatement

UPDATE TableReference SET AssignList UpdateStatementFromClause WhereClauseOpt

UpdateStatement

(12)

/// Liste des mises à jour de colonnes AssignList { AssignStatement, , }

/// Instruction de mise à jour de colonne AssignStatement

ColumnName = Value

/// Alias technique d'une UpdateFromClause optionnelle UpdateStatementFromClause

UpdateFromClauseOpt

/// Détermine une source de données complémentaire qui, jointe à la table mise à jour via la condition (INNER), permettra de déterminer les lignes à modifier et/ou les valeurs à affecter

UpdateFromClause

FROM UpdateFromClauseSource ON Condition /// Sources valide dans un UPDATE FROM

UpdateFromClauseSource TriggerRelatedRows TableReferenceSource SelectStatementSource

Référence du UpdateStatement : cf. document SqlGrammar.html

Instruction DELETE

L’instruction DELETE permet de supprimer des données dans une table DeleteStatement

DELETE FromOpt TableReference WhereClauseOpt FromOpt

[ FROM ];

WhereClause : Voir description du Select

Instruction MERGE

L’instruction MERGE permet la mise à jour d'une table par fusion du résultat d'une requête. Elle permet d’effectuer un INSERT et/ou un UPDATE et/ou un DELETE selon des conditions spécifiées pour chacune de ces clauses.

MergeStatement

UPDATE TableName SET

, ColumnName

Identifier AS

Condition

SelectStatement FROM

= Expression

:NEW :OLD

( )

Identifier AS

Condition

TableName

WHERE

ON

(13)

MERGEINTO MergeStatementTarget

USING MergeStatementSource ON Condition MergeUpdateOpt MergeInsertOpt

/// Cible d'un merge (table) MergeStatementTarget

TableReferenceSource

/// Source de données provenant d'une table TableReferenceSource

TableReference AsClauseOpt

/// Sources d'enregistrement relatives au triggers TriggerRelatedRows

/// Enregistrements insérés ou mis à jour ayant déclenché le trigger :NEW

/// Enregistrements supprimés ou mis à jour ayant déclenché le trigger :OLD

/// Source d'un merge MergeStatementSource

TableReferenceSource SelectStatementSource LookupSource

TriggerRelatedRows MergeInsertOpt

[ MergeInsert ]

/// Instruction de fusion des éléments manquants dans la cible, la source du {MergeStatement} peut être utilisée pour définir une condition de fusion

MergeInsert

INSERT MergeInsertValueSpecification MergeConditionOpt

/// Clauses valides pour la spécification des données à insérer dans un merge

/// la source du {MergeStatement} peut être utilisée pour alimenter les valeurs à insérer MergeInsertValueSpecification

AffectedValues DefaultValues MergeUpdateOpt

[ MergeUpdate ]

/// Instruction de fusion des éléments assortis par mise à jour,

/// la source et la cible du {MergeStatement} peuvent être utilisées pour définir une condition de fusion MergeUpdate

UPDATESET AssignList MergeConditionOpt MergeDeleteOpt MergeDeleteOpt

[ MergeDelete ]

/// Instruction de fusion des éléments assortis par suppression,

(14)

/// la source et la cible du {MergeStatement} peuvent être utilisées pour définir une condition de fusion MergeDelete

DELETE MergeConditionOpt

MergeConditionOpt

[ MergeCondition ]

/// Limitation d'une instruction de fusion MergeCondition

WHEN Condition

Référence du MergeStatement :cf. document SqlGrammar.html

(15)

4. I NSTRUCTIONS DDL

Le terme DDL (Data Definition Language) désigne l’ensemble des instructions de définition (création modification, suppression) d’objets SQL : tables, index, vues, procédures, triggers et fonctions SQL.

SqlDdlStatement

CreateStatement AlterStatement DropStatement ToggleTrigger

RenameTableStatement

Instructions de création d'objets

CreateStatement CreateTable CreateView CreateIndex CreateTrigger CreateProcedure CreateFunction

Instruction de création de table : CREATE TABLE

CreateTable

CREATETABLE TableReference ( TableElementList ) /// Eléments, colonnes et contraintes, définissant une table TableElementList

{ TableElement , }

/// Elément, colonne ou contrainte, de définition d'une table TableElement

ColumnDefinition TableConstraint /// Définition d'une colonne

ColumnDefinition

ColumnName SqlType ColumnDefaultOpt NullConstraintOpt /// Valeur par défaut d'une colonne

ColumnDefault

DEFAULT Value NullConstraint

NULL NOTNULL /// Contrainte de table TableConstraint

CONSTRAINT ConstraintName ConstraintDefinition

(16)

/// Définition de contrainte ConstraintDefinition

ColumnsConstraint ForeignKeyConstraint /// Contrainte de clé étrangère ForeignKeyConstraint

FOREIGNKEY ( ForeignKeyConstraintColumns )

REFERENCES TableReference ( ForeignKeyConstraintKeys ) /// Noms des colonnes de la table définissant la clé étrangère

ForeignKeyConstraintColumns ColumnIdentifierList

/// Noms des colonnes de la table référencée définissant la clé étrangère ForeignKeyConstraintKeys

ColumnIdentifierList /// Contrainte de colonne ColumnsConstraint

ColumnsConstraintType ( ColumnIdentifierList ) /// Type de contrainte : clé primaire ou valeur unique ColumnsConstraintType

PRIMARY KEY UNIQUE

Référence du CreateTable PGI : cf. document SqlGrammar.html

Instruction de création de vue

CreateView

CREATEVIEW ViewName ColumnsDefinitionOpt AS SelectStatement /// Définition des colonnes de la vue

ColumnsDefinition

( ColumnNames )

Instruction de création d'index

CreateIndex

CREATE UniqueOpt ClusteredOpt INDEX IndexName ON TableName ( OrderList ) /// Indique qu'un index doit être unique (optimisation pour certains moteurs)

Unique

UNIQUE

/// Indique qu'un index doit être clustered (spécifique Microsoft SQL Server) Clustered

CLUSTERED

Référence du CREATE INDEX PGI : cf. document SqlGrammar.html

(17)

Types SQL

/// Définition d'un type de donnée SqlType

SqlTypeName PrecisionScaleOpt SqlTypeName

BIT DATETIME DATE TIMESTAMP

// Note : (Entity Framework support)

// TIME et DATETIMEOFFSET ne sont pas supportés pleinement par Oracle et SQLite, // et ne sont donc pas implémentés

DECIMAL DEC REAL FLOAT SMALLINT INT VARCHAR NVARCHAR CHAR NCHAR BIGINT TINYINT // types PGI INTEGER // INT NUMERIC // DECIMAL RATE // NUMERIC COMBO // CHAR(3) BOOLEAN // CHAR(1) DOUBLE // DECIMAL EXTENDED // DECIMAL BLOB // NVARCHAR / TEXT DATA // BLOB / BINARY

LONGCHAR // Obsolete VARCHAR(2000) GUID // UNIQUEIDENTIFIER, RAW(16) /// Définition de précision (ou longueur) et/ou échelle PrecisionScale

SqlTypePrecision

SqlTypePrecisionAndScale

/// Définition de précision (ou longueur) SqlTypePrecision ( Precision )

/// Définition de précision (ou longueur) et d'échelle SqlTypePrecisionAndScale

( Precision , Scale ) /// Précision ou longueur Precision

SqlIntegerLiteral;

(18)

/// Echelle Scale

SqlIntegerLiteral;

Création de Triggers

Les triggers permettent d’exécuter du code SQL après une instruction DML de mise à jour (INSERT, UPDATE ou DELETE) sur une table.

Dans le code du trigger, des pseudo tables virtuelles :NEW et :OLD sont accessibles au code du trigger pour manipuler les enregistrements ajoutés, supprimés ou mis à jour.

Il n’est pas nécessaire d‘ajouter une instruction DROP TRIGGER avant l’instruction CREATE, car la traduction du CREATE inclut un test d’existence et de DROP du trigger s’il existe déjà.

Les triggers PGI sont des triggers déclenchés après l’instruction (trigger AFTER) CreateTrigger

Grammaire :

/// Instruction de création de trigger CreateTrigger

CREATETRIGGER TriggerName FOR TriggerEvents ON TableName AS CreateTriggerBody

/// Liste des types d'évènement déclenchant le trigger séparés par 'OR' TriggerEvents { TriggerEvent, OR }

/// Types d'évènements déclenchant le trigger TriggerEvent

INSERT UPDATE DELETE /// Corps du trigger

CreateTriggerBody DdlStatement

Référence du CREATE TRIGGER :cf. document SqlGrammar.html

Création de procédures

/// Instruction de création d'une procédure CreateProcedure

CREATEPROCEDURE ProcedureName ( Arguments )AS CreateProcedureBody Create Procedure

INSERT UPDATE DELETE CREATE TRIGGER TriggerName FOR

OR

ON TableName AS DDlStatemement

(19)

Argument

/// Liste des arguments d'une procédure ou fonction Arguments ( Argument, , )

/// Argument d'une procédure ou fonction Argument

ArgumentName ArgumentDirectionOpt SqlType /// Corps de la procédure

CreateProcedureBody DdlStatement

/// Direction de l'argument (IN si en entrée, OUT si en sortie) ArgumentDirectionOpt

IN OUT IN OUT

Référence du CREATE PROCEDURE :cf. document SqlGrammar.html

Création de fonctions

Une fonction SQL définie par l’utilisateur peut être utilisée dans toute expression SQL. Son utilisation dans les expressions de jointures ou dans les prédicats de recherche (clause WHERE) peut cependant entrainer une dégradation des performances en invalidant l’utilisation d’index existants.

/// Instruction de création de fonction utilisateur CreateFunction

CREATEFUNCTION FunctionName ( Arguments ) RETURNS SqlType AS DdlStatement

Create Function

Argument

CREATE ProcedureName (

,

)

Argument

DDlStatemement PROCEDURE AS

ArgumentName

IN

OUT

Type

CREATE FunctionName (

,

)

Argument

DDlStatemement AS

FUNCTION RETURNS ReturnType

ArgumentName Type

(20)

Instructions de suppression d'objets

DropStatement

DROPTABLE TableReference

DROPINDEX IndexName ON TableReference DROPVIEW ViewName

DROPTRIGGER TriggerName DROPPROCEDURE ProcedureName DROPFUNCTION FunctionName

Modification (activation/désactivation) des triggers

ToggleTrigger

ToggleTriggerAction TriggerSpecification ON TableReference;

/// Activation ou désactivation de trigger ToggleTriggerAction

ENABLE DISABLE

/// Spécification du trigger à modifier TriggerSpecification

SingleTriggerSpecification AllTriggersSpecification;

/// Spécification du trigger à modifier SingleTriggerSpecification

TRIGGER TriggerName

/// Spécification de l'altération de tous les triggers AllTriggersSpecification

ALLTRIGGERS

Instruction DDL : DdlStatement

Une instruction DDL est une instruction pouvant se trouver dans un TRIGGER, une procédure ou une fonction SQL et peut être instruction de manipulation de données (INSERT, UPDATE, DELETE, MERGE) qui ne renvoie pas de jeu de données, une instruction de contrôle de flot (WHILE, IF, FOREACH, RETURN, EXECUTE, THROW), une affectation (SELECT INTO ou affectation).

/// Instructions DDL pouvant composer un bloc DDL DdlStatement

DdlStatementBlock InsertStatement UpdateStatement DeleteStatement MergeStatement

SelectIntoVariableStatement AffectationStatement ReturnStatement IfThenStatement IfThenElseStatement

(21)

ProcedureCallStatement WhileStatement

ForeachStatement ThrowStatement

Référence du DdlStatement :cf. document SqlGrammar.html /// Définition d'un bloc DDL

DdlStatementBlock

DeclarationBlockOpt BEGIN DdlStatementBlockBody END /// Corps du bloc DDL : liste de DdlStatement séparés par des ‘;’ DdlStatementBlockBody

DdlStatementList InstructionEndOpt /// Liste d'instruction DDL

DdlStatementList

{ DdlStatement, ; } /// Fin d'instruction DDL InstructionEnd;

Déclaration de variables

Un DDL Statement Block peut commencer par une ou plusieurs déclarations de variables (DeclarationBlockOpt)

Declaration Block

DeclarationBlockOpt

[ DeclarationBlock ]

/// Déclaration des variables d'un bloc DDL DeclarationBlock

DECLARE VariableDeclarationList InstructionEndOpt /// Liste de variables séparées par des ',' VariableDeclarationList

{ VariableDeclaration, , } /// Déclaration de variable VariableDeclaration

VariableName SqlType

Instructions de contrôle de flot

Les instructions de contrôle de flot permettent de controler le déroulement du programme par le biais d’instructions itératives (WHILE, FOREACH), ou de branchements (IF, IF ELSE, RETURN, EXECUTE).

IfThenStatement

DECLARE VariableName

,

; SqlType

(22)

IF Condition THEN ThenBody END IfThenElseStatement

IF Condition THEN ThenBody ELSE ElseBody END ThenBody

DdlStatementBlockBody ElseBody

DdlStatementBlockBody WhileStatement

WHILE Condition DO WhileStatementBody END WhileStatementBody

DdlStatementBlockBody

L’instruction FOREACH permet de traiter séquentiellement un jeu de résultat via un SelectIntoVariableStatement

ForeachStatement

FOREACH SelectIntoVariableStatement DO ForeachStatementBody END /// Instructions à exécuter pour chaque élément du jeu de résultat

ForeachStatementBody

DdlStatementBlockBody /// Appel de procédure

ProcedureCallStatement

EXECUTE ProcedureName Parameters /// Instruction de retour

ReturnStatement

RETURN ValueOpt ThrowStatement

THROW( ErrorCode , ErrorMessage ) Annule le traitement en cours et lève une erreur Cette instruction est supportée à partir de CBP 11 /// Code d'erreur

ErrorCode

SqlStringLiteral

Voir SqlStringLiteral : ‘Chaine‘ ou «Chaine»

Les chaines peuvent être délimitées par des simples ou doubles quotes (syntaxe PGI historique, dans la norme ANSI les doubles quotes sont utilisées pour délimiter des alias de colonnes).

/// Message d'erreur ErrorMessage

SqlStringLiteral

Les conditions utilisables dans une instruction de contrôle de flot sont élargies dans le cadre d’un trigger : il est possible de tester l’événement qui a déclenché le trigger (INSERT, UPDATE ou DELETE) en utilisant les mots clés INSERTING, UPDATING, DELETING ou la modification d’une ou plusieurs colonnes via la syntaxe UPDATING ( ColumnName) .

Référence de la Condition :cf. document SqlGrammar.html

(23)

/// Tests sur les conditions de déclenchement d'un trigger TriggerUpdateCondition

TriggerTableUpdateCondition TriggerColumnUpdateCondition

/// Condition testant l'évènement de déclenchement du trigger TriggerTableUpdateCondition

UPDATING INSERTING DELETING

/// Condition testant la mise à jour d'une colonne TriggerColumnUpdateCondition

UPDATING ( ColumnName )

Affectations de variables

L’affectation de variables peut se faire en utilisant l’instruction SELECT INTO ou via l’instruction d’affectation (Variable = Valeur)

L’instruction SELECT INTO est identique à l’instruction SELECT, mais une clause INTO Variable1, Variable2, Variable3 … VariableN précède la clause FROM

/// Instruction permettant d'affecter une ligne de résultat de requête à des variables SelectIntoVariableStatement

SELECT SelectHintOpt RestrictionOpt TopClauseOpt IntoVariableClause

FromClauseOpt

WhereClauseOpt GroupByClauseOpt HavingClauseOpt OrderByClauseOpt

/// Clause déterminant l'association des affectations colonne / variable. Le nombre de colonnes doit impérativement être équivalent au nombre de variables

IntoVariableClause

ColumnList INTO VariableNameList /// Instruction d'affectation

AffectationStatement

VariableName = Value

(24)

5. F ONCTIONS INTERNES ET ÉTENDUES

Les fonctions internes et étendues peuvent être utilisées dans toutes les expressions SQL : liste de colonnes, prédicats dans la clause WHERE, jointures etc. Leur utilisation peut cependant invalider l’utilisation d’index et entrainer une dégradation des performances.

Fonctions internes

Appel de fonction intégrée native sur tous les moteurs (éventuellement avec un nom différent).

Les fonctions étendues (dont la traduction n’existe pas pour tous les moteurs) sont indiquées plus loin.

BuiltInFunctionCall

BuiltInFunction ( Parameters )

/// Nom de la fonction intégrée native. Pour plus d'informations se référer aux documentations des différents moteurs supportés.

BuiltInFunction Function Name

Fonctions chaines

// Character ASCII (Expr )

Renvoie le code ASCII du caractère le plus à gauche de l’expression chaine passée en paramètre.

CHR( IntegerExpression )

Renvoie le caractère dont le code ascii correspond à l’expression entière passée en paramètre.

CHARINDEX( Expr1 , Expr2 [ , Start ] )

Renvoie la position de Expr1 dans Expr2, éventuellement à partir de la position Start si elle est spécifiée.

INSTR ( Expr1 , Expr2 [ , Start ] )

Identique à CHARINDEX, pour compatibilité avec du SQL écrit pour ORACLE LEN ( Expression )

Renvoie la longueur en caractères de l’expression chaine passée en paramètre LENGTH ( Expression )

Identique à LEN LOWER ( Expression )

Renvoie l’expression passée en paramètre transformée en minuscule.

LTRIM ( Expression )

Supprime les espaces à gauche de l’expression passée en paramètre.

REPLACE ( Expression, Pattern, Replacement )

Remplace l’expression Pattern dans Expression par la chaine Replacement. REVERSE ( Expression )

SQL PGI

(25)

Renvoie l’expression chaine passée en paramètre en ordre inverse.

RTRIM ( Expression )

Supprime les espaces à droite de l’expression passée en paramètre.

SOUNDEX ( Expression )

Renvoie un code sur 4 caractères correspondant à l’expression passée en paramètre.

Ce code peut être utilisé pour évaluer la similarité phonétique de plusieurs expressions.

STR ( Expression )

Convertit l’expression passée en paramètre en chaine( CONVERT(VARCHAR…) pour SQL Server, TO_CHAR pour ORACLE).

SUBSTR ( Expression, Start, Length )

Renvoie la sous-chaine extraite de Expression , à partir de la position Start pour une longueur de Length.

SUBSTRING ( Expression, Start, Length ) Equivalent à SUBSTR

TO_CHAR ( Expression ) Equivalent à STR() TRIM ( Expression )

Supprime les espaces à droite et à gauche de Expression.

UPPER ( Expression )

Renvoie l’expression passée en paramètre transformée en majuscules.

Fonctions mathématiques

// Math ABS ROUND SIGN SQRT POWER CEILING EXP LN LOG FLOOR TRUNCATE // Trigo

ACOS ASIN ATAN COS COT DEGREES

(26)

PI RADIANS SIN TAN // Misc

NEWID SYS_GUID

NEWSEQUENTIALID /// Fonctions de création de type

TypeFunctionCall ::= TypeFunction "(" Parameters ")";

/// Nom de la fonction de création de type

TypeFunction ::= "BIT" | "DATE" | "DATETIME" | "TIME" | "TIMESTAMP" | "DECIMAL" |

"NUMERIC" | "DEC" | "REAL" | "FLOAT" | "SMALLINT" | "INT" | "INTEGER" | "INTERVAL" | "VARCHAR" |

"NVARCHAR" | "CHAR" | "NCHAR" | "CHARACTER";

Fonctions étendues

Fonctions étendues par le langage SQL Pgi. Ces fonctions ne sont pas natives à tous les moteurs de base de données (pour la plupart la traduction de ces fonctions est disponible pour SQL Server et ORACLE, mais pas Sqlite).

ExtendedFunctionCall

ExtendedDateTimeFunctionCall ExtendedCharacterFunctionCall ExtendedMathFunctionCal

ExtendedMiscellaneousFunctionCall

Fonctions étendues diverses

ExtendedMiscellaneousFunctionCall PgiGuidFunctionCall HostNameFunctionCall UserNameFunctionCall RowOrderFunctionCall

/// Calcule un guid et le retourne sous forme de chaine - varchar(36) - contenant le guid, /// ex: '{12345678-1234-1234-1234-123456789012}'

PgiGuidFunctionCall PGIGUID()

/// Retourne le nom du serveur SQL HostNameFunctionCall

HOSTNAME()

/// Retourne le nom de l'utilisateur SQL UserNameFunctionCall

USERNAME ( )

/// Retourne le numéro de l'enregistrement d'une requête triée.

/// Cette fonctionnalité n'est compatible qu’avec les requêtes spécifiant un ORDER BY.

RowOrderFunctionCall

(27)

ROWORDER ( )

Fonctions étendues de manipulation de chaines

ExtendedCharacterFunctionCall TrimFunctionCall PaddingFunctionCall StuffFunctionCall TruncateFunctionCall ReplicateFunctionCall SpaceFunctionCall PatIndexFunctionCall

/// Appel de fonction supprimant les espaces en début et fin de chaine TrimFunctionCall

TRIM( Parameter )

/// Appel de fonction permettant de fixer la longueur d'une chaine soit en la tronquant soit en complétant avec une chaine de remplissage

PaddingFunctionCall

PaddingFunction ( Parameter , PaddingFunctionCallLength , PaddingFunctionCallFiller ) /// Chaine de remplissage

PaddingFunctionCallFiller SqlStringLiteral /// Longueur désirée

PaddingFunctionCallLength Value

/// Fonction de remplissage déterminant le côté d'attaque PaddingFunction

PADLEFT PADRIGHT

/// Appel de fonction permettant le remplacement d'une partie d'une chaine par une autre StuffFunctionCall

STUFF( Parameter , Start , Length , Replacement ) /// Index base 1 de début du remplacement

Start Value

/// Nombre de caractères à remplacer Length

Value

/// Chaine de remplacement Replacement

Value

/// Appel de fonction tronquant une chaine à la longueur maximum désirée TruncateFunctionCall

(28)

TruncateFunction ( Parameter , Length );

/// Fonction de tronquage à utiliser TruncateFunction

LEFT RIGHT

/// Appel de fonction permettant de construire une chaine par réplication d'un fragment ReplicateFunctionCall

REPLICATE( Parameter , Count )

/// Appel de fonction produisant une chaine composée d'espaces répétés SpaceFunctionCall

SPACE ( Count )

/// Retourne l'index base 1 de première apparition d'un pattern dans une chaine PatIndexFunctionCall

PATINDEX ( Pattern , Parameter )

Le Parttern est identique au pattern d'un LIKE, à ceci près qu’il DOIT ABSOLUMENT commencer et terminer par

'%'

Fonctions de gestion des dates

/// Fonction de manipulation de date étendues ExtendedDateTimeFunctionCall

DatePartFunctionCall DateDiffFunctionCall DateAddFunctionCall CurrentDateFunctionCall TruncDateFunctionCall IsDateFunctionCall ToDateFunctionCall

/// Appel de fonction d'extraction d'une partie de la date DatePartFunctionCall

DatePartFunction ( Parameter ) /// Fonctions d'extraction de la date

DatePartFunction YEAR QUARTER MONTH

DAY

HOUR MINUTE SECOND MILLISECOND WEEK YDAY WDAY

/// Différence entre deux dates. Retourne un décimal exprimant la durée séparant les 2 dates, dans l'unité de temps définie par la fonction utilisée.

(29)

DateDiffFunctionCall

DateDiffFunction (StartDate , EndDate )

/// Fonctions de calcul de différence définissant l'unité d'expression de l'écart entre les dates DateDiffFunction

DIFFYEARS DIFFMONTHS DIFFDAYS DIFFHOURS DIFFMINUTES DIFFSECONDS DIFFMILLISECONDS DIFFMICROSECONDS DIFFNANOSECONDS

/// Appel de fonction d'ajout de durée à une date DateAddFunctionCall

DateAddFunction ( Parameter , Value )

/// Fonction d'ajout de durée déterminant l'unité de la durée ajoutée DateAddFunction

ADDYEARS ADDMONTHS ADDDAYS ADDHOURS ADDMINUTES ADDSECONDS ADDMILLISECONDS ADDMICROSECONDS ADDNANOSECONDS

/// Appel de fonction déterminant la date courante CurrentDateFunctionCall

CurrentDateFunction ( )

/// Variantes équivalentes du nom de fonction CurrentDateFunction

GETDATE CURRENT_DATE NOW

/// Appel de fonction effectuant la mise à zéro des fractions de jour TruncDateFunctionCall

TRUNC ( DateParameter )

/// Appel de fonction déterminant si l'argument est une date bien formatée (format ISO8160) IsDateFunctionCall

ISDATE( DateParameter )

/// Appel de fonction convertissant une chaine de caractère bien formatée en date (format ISO8160) ToDateFunctionCall

TODATE( StringParameter )

(30)

Fonctions mathématiques étendues

ExtendedMathFunctionCall RandFunctionCall SquareFunctionCall IsNumericFunctionCall ToNumericFunctionCall

/// Appel de fonction retournant un décimal aléatoire compris entre 0 et 1 RandFunctionCall

RAND ( )

/// Appel de fonction retournant le carré d'un nombre SquareFunctionCall

SQUARE( Parameter )

/// Appel de fonction déterminant si la chaine de caractère passée en paramètre représente un nombre valide

IsNumericFunctionCall

ISNUMERIC( Parameter )

/// Appel de fonction convertissant la chaine de caractère passée en paramètre en nombre valide ToNumericFunctionCall

TONUMERIC( Parameter )

Fonction de fenêtrage

/// les fonctions de fenêtrage ne peuvent être utilisées que dans les clauses SELECT /// OrderByClause est optionnelle dans le cas des agrégations

WindowFunctionClause

WindowFunctionClauseFunction

OVER ( PartitionByClauseOpt OrderByClauseOpt ) /// Fonctions compatibles avec le fenêtrage

WindowFunctionClauseFunction Aggregation

WindowFunctionCall /// Appel de fonction de fenêtrage

WindowFunctionCall WindowFunction ( ) /// Fonctions de fenêtrage

WindowFunction ROW_NUMBER RANK

// Limité actuellement à ces 2 fonctions, bien qu’il y en ait d'autres (NTILE, DENSE_RANK) car elles ne sont pas forcément les mêmes sur tous les moteurs

PartitionByClauseOpt [ PartitionByClause ]

(31)

/// Clause de partitionnement d'une fonction de fenêtrage PartitionByClause

PARTITION BY PartitionList

/// Liste des colonnes de partitionnement d'une fonction de fenêtrage PartitionList

ValueList

/// Liste de paramètres Parameters ( Parameter , ); /// Paramètre

Parameter

Value

/// Liste de valeurs séparées par des "," ValueList { Value , }

/// Liste d'identifiants de colonne séparés par des "," ColumnIdentifierList { ColumnIdentifier , }

/// Identifiant de colonne ColumnIdentifier TableColumn ColumnSelector TriggerRelatedColumn

/// Référence à une colonne d'enregistrement déclenchant un trigger TriggerRelatedColumn

TriggerRelatedRows . ColumnSelector;

/// Colonne d'une table ou d'une projection TableColumn

TableName . ColumnSelector /// Sélecteurs de colonne

ColumnSelector AllColumns ColumnName

/// Sélectionne toutes les colonnes disponibles AllColumns

*

/// Identifiant de table ou de projection intermédiaire TableName

ObjectIdentifier /// Identifiant de colonne

ColumnName

ObjectIdentifier

/// Liste d'identifiants ObjectIdentifierList { ObjectIdentifier , }

(32)

/// Identifiant d'objet ObjectIdentifier SqlIdentifier

Références

Documents relatifs

Le joueur doit toucher le chat pour qu'il ralentisse puis qu'il s'arrête.. Ici on baisse de 1 la vitesse Scratchy lorsque le joueur le touche avec

Le langage C/C++ offre la possibilité de conditionner un traitement avec l'instruction if (ou

Appuyez 1x brièvement sur le bouton de ventilation &gt; les moteurs s’ouvrent jusqu’à leur position finale Opération de clé dans la position OUVERT (pression de la

Retire los tres tornillos M8 hexagonales que fijan los tres soportes de montaje del ventilador aspirante original al depósito de la disolución.. Extraiga el ventilador

This chapter describes the proper operation, function, and adjustment of the switch/Indicator Control panel utilized in the MLSI-BAII Series of Chassis

Logic provided on the module consists of integrated-circuit devices in dual-in-line (DIP) packages; and wire-wrap posts used to select interrupt levels and vector addresses,

Address of the device requesting service. The response is placed in the poll response variable. This function does not affect the error code. This function does

When the Teleray is placed in this mode (via keyboard switch) all control characters including Escape and Delete are treated as data and entered into the display