Instruction. Exécution d'un bloc Programming Language / Structured Query Language (PL/SQL).
BlocSql
ListeDeBlocsSql
BlocSql
NomSql ParametresSqlTransmis
TempsDeGardeTransmis SourceBlocSql
BlocSql
permet de déclarer des blocs Programming Language / Structured Query Language (PL/SQL) statiques.
Un bloc Pl/Sql peut être déclaré globalement ou localement. Son accès peut être défini au moyen des instructions Prive, Protege et Public.
La déclaration du bloc Pl/Sql au niveau de la source de données relationnelles est établie tout le temps de la portée de la déclaration. Ainsi, un bloc Pl/Sql global est résidant, ce qui permet de factoriser les phases d'analyse et de calcul du plan effectuées par le moteur de la source de données pour plusieurs exécutions successives. La contre-partie est que le source du bloc Pl/Sql ne peut être que statique.
Un bloc Pl/Sql possède éventuellement des paramètres dont la liste est introduite par l'instruction ParametreSql. Il peut s'agir de paramètres d'entrée, d'entrée-sortie ou de sortie. Les paramètres sont identifiés dans le source du bloc Pl/Sql par des pseudo-variables de même nom.
Le source d'un bloc Pl/Sql est constitué de plusieurs commandes Pl/Sql, éventuellement isolées dans un bloc Pl/Sql stricto sensus. Il est introduit par l'instruction SqlStatique.
Un bloc Pl/Sql est particulièrement intéressant parce que toutes les commandes sont envoyées d'un seul bloc au moteur de la source de données.
Le source d'une commande Pl/Sql est écrit en clair dans le programme. Il doit respecter la syntaxe et la sémantique du moteur de la source de données. Il se termine par le caractère point-virgule ; .
Une commande Pl/Sql peut être :
SELECT ename:=${NomEmploye}, hiredate:=${DateEmbauche}, empno:=${NumeroEmploye}, sal:=${Salaire}
FROM emp
WHERE deptno=${NumeroDepartement};
INSERT INTO emp(ename, hiredate, empno, sal)
VALUES (${NomEmploye}, ${DateEmbauche}, ${NumeroEmploye}, ${NumeroDepartement}, ${Salaire});
UPDATE emp set sal=${Salaire}
WHERE empno=${NumeroEmploye};
DELETE * FROM emp;
${SalaireMoyen}:=MaFonction(${NumeroDepartement})
DROP TABLE emp;
Employée en tant qu'instruction BlocSql
, permet aussi d'exécuter directement plusieurs ordres Programming Language / Structured Query Language (PL/SQL).
Les ordres Pl/Sql sont envoyés d'un seul bloc au moteur de la source de données relationnelles, ce qui permet d'optimiser la communication avec elle ainsi que son usage.
Les ordres Pl/Sql peuvent être déclarés au niveau de la source de données relationnelles le temps de son exécution ou ils ont pu être déclarés au préalable. Dans ce second cas, les phases d'analyse et de calcul du plan effectuées par le moteur de la source de données ont déjà été effectuées.
Les ordres Pl/Sql ne peuvent produire de résultat.
Les ordres Pl/Sql statiques possèdent éventuellement des paramètres dont la liste est introduite par l'instruction ParametreSql. Il s'agit de paramètres d'entrée, d'entrée-sortie ou de sortie. Les paramètres sont identifiés dans le source de l'ordre Sql par des pseudo-variables de même nom.
Le source des ordres Pl/Sql peut être :
Le source des ordres Pl/Sql doit respecter la syntaxe et la sémantique du moteur de la source de données.
Un bloc Pl/Sql est un objet implicite d'un type implémentant l'interface IBlocSql. Le type est automatiquement déduit de la connexion associée au bloc Pl/Sql.
Pour connaître les propriétés et les méthodes de ce type, veuillez vous reporter à la fiche Description de l'interface IBlocSql.
Variable
/******/
NomEmploye : Nul Ou Caractere;
DateEmbauche : Nul Ou Date;
NumeroDepartement : Entier;
NumeroEmploye : Entier;
Salaire : Reel;
ConnexionSql
/*******/
MaConnexionSql(Oracle, "scott/tiger");
BlocSql
/*****/
Public :
MonBlocSql ConnexionSql MaConnexionSql
ParametreSql (NomEmploye : Nul Ou Caractere TailleMaxSql 20 Sortie, DateEmbauche : Nul Ou Date Sortie,
NumeroEmploye : Nul Ou Entier Sortie, Salaire : Nul Ou Reel Sortie, NumeroDepartement : Nul Ou Entier)
SqlStatique
SELECT ename:=${NomEmploye}, hiredate:=${DateEmbauche}, empno:=${NumeroEmploye}, sal:=${Salaire}
FROM emp
WHERE deptno=${NumeroDepartement};
Fin SqlStatique
MonBlocSql2 ConnexionSql MaConnexionSql
ParametreSql (NomEmploye : Nul Ou Caractere TailleMaxSql 20,
DateEmbauche : Nul Ou Date, NumeroEmploye : Nul Ou Entier, NumeroDepartement : Nul Ou Entier, Salaire : Nul Ou Reel,
NumeroEmploye2 : Entier, Salaire2 : Reel)
SqlStatique
INSERT INTO emp(ename, hiredate, empno, sal)
VALUES (${NomEmploye}, ${DateEmbauche}, ${NumeroEmploye}, ${NumeroDepartement}, ${Salaire});
UPDATE emp set sal=${Salaire2}
WHERE empno=${NumeroEmploye2};
DELETE * FROM emp;
Fin SqlStatique
Protege :
MonBlocSql3 ConnexionSql MaConnexionSql
SqlStatique
DELETE FROM emp
WHERE deptno=40;
Fin SqlStatique
MonBlocSql4 ConnexionSql MaConnexionSql
ParametreSql (NumeroDepartement : Entier, SalaireMin : Reel Sortie, SalaireMax : Reel Sortie)
SqlStatique
MaProcedure(${NumeroDepartement}, ${SalaireMin}, ${SalaireMax});
Fin SqlStatique
Prive :
MonBlocSql5 ConnexionSql MaConnexionSql
ParametreSql (NumeroDepartement : Entier, SalaireMoyen : Reel Sortie)
SqlStatique
${SalaireMoyen}:=MaFonction(${NumeroDepartement});
Fin SqlStatique
Principal
/*******/
...
/* Bloc Sql dont le source est statique. */
BlocSql MonBlocSql6 ConnexionSql MaConnexionSql ParametreSql (NomEmploye : Nul Ou Caractere TailleMaxSql 20,
DateEmbauche : Nul Ou Date, NumeroEmploye : Nul Ou Entier, NumeroDepartement : Nul Ou Entier, Salaire : Nul Ou Reel,
NumeroEmploye2 : Entier, Salaire2 : Reel=-Salaire) SqlStatique
INSERT INTO emp(ename, hiredate, empno, sal)
VALUES (${NomEmploye}, ${DateEmbauche}, ${NumeroEmploye}, ${NumeroDepartement}, ${Salaire});
UPDATE emp set sal=${Salaire2}
WHERE empno=${NumeroEmploye2};
DELETE * FROM emp;
Fin SqlStatique
...
/* Bloc Sql dont le source statique est factorise via l'objet semantique MonBlocSql2. */
BlocSql MonBlocSql2 ParametreSql (NomEmploye, DateEmbauche, NumeroEmploye, NumeroDepartement, Salaire, NumeroEmploye, -Salaire);
...
/* Bloc Sql dont le source est calcule dynamiquement. */
BlocSql MonBlocSql7 ConnexionSql MaConnexionSql SqlDynamique
"INSERT INTO emp(ename, hiredate, empno, sal) VALUES ("+NomEmploye+", "+Caractere(DateEmbauche,"%jj-%mm-%A")+"}, "
+Caractere{NumeroEmploye,"&&")+", "+Caractere(NumeroDepartement, ""}+", "+Caractere(Salaire,"&&&&,##")+");";
"UPDATE emp set sal="+Caractere(Salaire,"+&&&.&")+" WHERE empno="+Caractere(NumeroEmploye,"&&")+");";
"DELETE * FROM emp;";
...
Fin Principal
- | - | - | - | - | - | - | - | - |