Paramétrage pour appel de blocs PL/SQL

Concept

Ce document vous décrit le paramétrage à effectuer pour pouvoir appeler des blocs PL/SQL à partir de la configuration et intégrer les résultats au flux de présentation.

L’exploitation de l’appel de blocs PL/SQL nécessite d’être en version ACE 1.3 ou supérieure. La prise en compte étant effectuée en premier lieu au niveau du socle, la librairie impactée est « technical_framework.jar ».

Fichier de configuration

Principes

Déclaration des blocs

Les blocs PL/SQL sont déclarés dans la configuration sous la forme d’un nouveau type. Ils sont liés à un type de vue au même titre que les ViewObject et ApplicationModule.

L’appel d’un bloc PL/SQL est défini de la façon suivante :

  • key : clé publique de bloc PL/SQL ,
  • resolverClass : classe métier attachée. Cette classe permet la résolution des inconnues du bloc PL/SQL ,
  • value : le code pour appeler le bloc PL/SQL lui-même.

L’appel au bloc PL/SQL se trouve intégré dans la déclaration d’un type de vue, sous le nœud retrieve.

Le Document propre au PL/SQL

Le Document est d’un type particulier. Il ne fait référence ni à une ViewObject, ni un ApplicationModule. Il utilise une classe d’implémentation spécifique qui fait le lien entre la View et le moteur PL/SQL. Il porte le nom de :

fr.ACE.technicalframework.application.document.PLSQLDocumentImpl

Exemple de configuration

< view_type name =" PLSQL " document =" PLSQL ">

< retrieve >

< plsql_bloc key =" TEST " resolverClass =" fr.ACE.technicalframework.application.DefaultPLSQLBlockResolver " value =" begin insert into roa values (?); end; "/>

< plsql_bloc key =" OT " resolverClass =" fr.ACE.technicalframework.application.DefaultPLSQLBlockResolver " value =" begin gxp_ot.pro_rec_fast(); end; "/>

</ retrieve >

< sort />

</ view_type >

< document name =" PLSQL " class =" fr.ACE.technicalframework.application.document.PLSQLDocumentImpl "/>

Exécution d’un bloc PL/SQL

Cinématique d’exécution

La cinématique est du type :

retrieve(),assimilate()

L’action retrieve() provoque la résolution des inconnues, l’action assimilate() provoque l’exécution du bloc PL/SQL.

L’appel étant asynchrone, aucun résultat n’est attendu. Seule l'action assimilate() permet l'exécution. Un code retour éventuel est positionné dans le flux XML de présentation.

Transaction

Les blocs PL/SQL définis dans la configuration ne doivent pas, sauf cas exceptionnel, gérer eux-mêmes les validations/annulations de la transaction courante. Le cas particulier de la définition de procédures stockées, capable de s'exécuter dans une autre transaction Oracle, ne vient pas perturber la transaction courante.

Néanmoins, il est fortement déconseillé de gérer une seconde transaction.

Description générale

La syntaxe est la suivante :

begin toto(?,?,~); end;

On ne considère dans ce type de document les variables de type bindées (définies par des ?) en entrée, les remplacements littéraux étant inutiles pour des appels à des procédures stockées. Afin de permettre de retourner d'éventuels codes erreurs dans le flux de présentation, deux mécanismes peuvent être exploités :

  • Soit un positionnant un paramètre de retour, signifié par le caractère "~" (il n'y a pas de limite quant au nombre de paramètres de retours de la procédure stockée),
  • Soit en utilisant le package dbms_output au sein même de la procédure stockée

Le caractère "~" a été choisi arbitrairement car il n'est en général pas utilisé dans des blocs PL/SQL. Le mécanisme mis en place remplace (lors de l’exécution du retrieve()) tous les " ~" par des variables bindées nommées. En interne, le nom de ces variables bindées débute par " :returnValue" suivi d'un numéro d'indice correspondant à la position du paramètre dans le bloc PL/SQL.

Retour d’exécution

On trouvera pour les codes retours un élément père (balise) de type <executed> directement sous le nom du document dans le flux de présentation. Sous cet élément, une liste de balise <outputParameter> donne les codes de retour. Chaque <outputParameter> est indicée via l'attribut 'index', ce numéro représentant l'indice du paramètre de code retour. La dernière annotation est allouée au buffer dbms_output avec un nœud de même nom. Le flux est de la forme suivante :

Exemple de flux suite à un appel qui s’est bien passé :

< executed >

< outputParameter index =" 1 "> retour de paramètre 1 </ outputParameter >

< outputParameter index =" 2 "> retour de paramèter 2 </ outputParameter >

< dbmsOutput > Exemple de retour dbms </ dbmsOutput >

</ executed >

Exemple de flux suite à un appel qui s’est mal passé :

< executed >

< outputParameter index =" 2 "> null </ outputParameter >

< outputParameter index =" 1 "> -1 </ outputParameter >

< dbmsOutput > Erreur ; ORA-00001: violation de contrainte unique (SOC3.EVE_IDX1) </ dbmsOutput >

</ executed >

A titre informatif, le code exécutant les blocs PL/SQL exploite un adaptateur. Cela permet éventuellement de disposer de plusieurs classes d'implémentations en fonction des versions d' Oracle, de BC4J ou de drivers JDBC exploités.

Exemples de blocs exécutables:

begin update pro set fampro=? where codsoc=? and fampro=?; end;

begin gxp_ot.pro_rec_complete(); end;

begin select to_char(sysdate,'yyyymmdd hh24mi') into ~ from dual; end;