Object-PL/SQL (Object-Procedural Language/Structured Query Language ou tout simplement O-PL/SQL) est une méthode d'usage de l'extension procédurale pour le langage SQL dans la Base de Données Oracle[1]. Les particularités additionnelles de la version 7 au-delà d'autres améliorations ultérieures sont orientées vers l'usage du paradigme de la base de données orientée objet[2].
Bien que la syntaxe générale du langage PL/SQL ressemble à celle du Pascal et de l'Ada, il y a eu beaucoup d'améliorations, qui incluent surtout le code java intégré[3] et la syntaxe orientée objet[4] dans le SQL.
L'intégration de déclencheurs et de procédures stockées constituent conjointement une des plus grandes percées qui ont favorisé l'usage du PL/SQL dans un paradigme orienté objet[5]. L'inclusion pour le syntaxe SQL de déclarations comme [class].[object], et aussi l'implementation de l'objet type[6] (similaire à presque tous les langages OO), ont complété le minimum d'articles nécessaires pour la démarche d'une extension du SQL sans l'usage d'aucun logiciel particulier de projection ou persistence framework[7].
L'O-PSL/SQL n'est pas simplement l'usage d'une version d'un langage de programmation, mais c'est le modus faciendi qui définit l'autonomie du thème[8] Chacune des versions du PL/SQL, en débutant de la 7e, apporte de si nombreuses innovations que c'est impossible de traiter ces usages-ci de sub-thèmes du PL/SQL. Il y a eu une vraie révolution qui a établi la frontière entre le langage usé jadis et l'aspect orienté objet dans ce nouveau langage. C'est précisément cet abord qui a provoqué l'emploi à large échelle de l'O-PL/SQL[9].
On ne doit pas confondre les notions d'objet de base de données avec celles-là d'objet de classe. Il faut, en chaque situation, identifier qu'est-ce que c'est un objet dans un contexte donné.
Objet de base de données est un concept qui concerne la base de données relationnelle ou séquentielle et qui est utilisé dans les nouveaux modèles. Tables, déclencheurs, colonnes, indices sont des exemples d'objets de base de données[6] qui sont rencontrés dans Object-PL/SQL, mais les mêmes éléments peuvent être traités dans l'autre contexte, de la notion des objets Java, spécifiquement un élément d'un ensemble dont le début de son existence se passe à partir de l'instanciation d'une classe.
le PL/SQL est le langage SQL étendu utilisé par la Base de données Oracle.
PL/SQL est disponible dans l'Oracle (depuis version 7) et dans l'IBM Db2 (depuis version 9.7)[10].
O-PL/SQL permet de définir des classes et les instancier comme objets, de créer des types de données définis par l'utilisateur (programmateur) et constructeurs, au-delà d'écrire des procédures stockées et des déclencheurs en Java, et aussi de la création de types user-defined et de constructeurs.
Il y a ici un petit ensemble d'exemples extraites de la documentation officielle[11] et d'autres sources:
Un exemple simple d'object-oriented PL/SQL[12]
create or replace type base_type as object ( a number, constructor function base_type return self as result, member function func return number, member procedure proc (n number) ) instantiable not final; /
Maintenant, la codification du type est accomplie. Donc, il est défini comment se conduisent-ils les fonctions de type, les procédures et les constructeurs:
create or replace type body base_type as constructor function base_type return self as result is begin a:=0; return; end base_type; member function func return number is begin return a; end func; member procedure proc (n number) as begin a:=n; end proc; end; /
On est prêt à dériver de base_type. Le mot-clé under est utilisé pour la dérivation. Le type dérivé definit un nouveau attribut (nommé m), qui superpose func.
create or replace type deriv_type under base_type ( m number, overriding member function func return number ); /
Bien comme les types bases, il faut codifier les méthodes superposées au type dérivé:
create or replace type body deriv_type as overriding member function func return number is begin return m*a; end; end; /
Les types créés peuvent être instanciés et les méthodes peuvent être demandées:
declare b1 base_type :=base_type(); b2 base_type :=base_type(4); d1 deriv_type:=deriv_type(5,6); d2 deriv_type:=deriv_type(5,6); begin dbms_output.put_line(b1.func); dbms_output.put_line(b2.func); d1.proc(4); dbms_output.put_line(d1.func); dbms_output.put_line(d2.func); end; /
Résultats
Les types créés sont devenus des types réels et on les peut utiliser pour attributs dans tables:
create table table_base ( b base_type ); declare base base_type := base_type(); deriv deriv_type:= deriv_type(8,9); begin insert into table_base values(base); insert into table_base values(deriv); end; / select t.b.func() from table_base t; T.B.FUNC()
Résultats :
select avg(t.b.func()) from table_base t; AVG(T.B.FUNC())
Résultat :
Un autre exemple de procédure stockée en Java intégré est rencontré dans Oracle Documentation[13].