Académique Documents
Professionnel Documents
Culture Documents
Oracle Objet
Oracle Objet
Relationel-objet en Oracle
Le paquetage DBMS_LOB et la
Relationel-objet en Oracle
IBM Oracle
4
Dpartement de gnie logiciel et des TI
5
Dpartement de gnie logiciel et des TI
6
Dpartement de gnie logiciel et des TI
7
Dpartement de gnie logiciel et des TI
#---video CREATE OR REPLACE TYPE video_t under multimedia_t (num_video INTEGER, taille FLOAT, nb_bits_p INTEGER, format VARCHAR2(20), video BLOB, codec REF codec_t, duree FLOAT(126), freq_echant FLOAT(126)) FINAL;
Interface utilisateur
Connecteur SGBD
JDBC
Dpartement de gnie logiciel et des TI
ODBC
SQLJ
10
Connexion au SGBD
API spcifique au SGBD Commerciale
e.g. Oracle Call Interface non portable
Connexion au SGBD
SQL/CLI de SQL:1999 inspire de ODBC
JDBC pour Java Norme ISO/IEC 9075-3:2003.
12
Dpartement de gnie logiciel et des TI
Moins portable
pr-compilateur spcifique au SGBD traduit en API du SGBD SQLJ (partie 0) traduit en API standard JDBC
13
Dpartement de gnie logiciel et des TI
PL/SQL est le nom commercial du SQL-PSM pour Oracle, mais l'quivalent existe pour dautres SGDB (Sybase, DB2 ) Norme ISO existe : SQL-PSM (Persistent Stored Module) (SQL3)
14
Dpartement de gnie logiciel et des TI
la demande); des dclencheurs triggers (procdures dclenches automatiquement) pour implmenter des contraintes d'intgrit complexes; des mises jour de champs redondants. des paquetages.
15
Dpartement de gnie logiciel et des TI
alphanumrique);
Elle s'intgre aux requtes SQL comme n'importe quelle fonction incluse par dfaut avec le SGBD (Oracle, DB2).
Dpartement de gnie logiciel et des TI
16
Exemple de fonction
CREATE OR REPLACE FUNCTION normale (x NUMBER) RETURN NUMBER AS result NUMBER; BEGIN result := exp(-x**2); RETURN result; END; / SELECT normale(1) FROM DUAL /
GTI660: Introduction aux DBMM Hiver 2010 17
leNoClient
Client.noClient%TYPE;
leNoClient
INTEGER;
Affectation en PL/SQL
Transfert d'une valeur de colonne d'un SELECT dans une variable (clause INTO) (De Robert Godin)
SELECT INTO FROM WHERE noClient, dateCommande leNoClient, laDateCommande Commande noCommande = leNoCommande;
LOOP
<commandes>
END LOOP;
Dpartement de gnie logiciel et des TI
(De Robert
SQL> 2 3 4 5 6 7 8 9 10 11 12 13 14
CREATE OR REPLACE FUNCTION fQuantitEnStock (unNoArticle Article.noArticle%TYPE) RETURN Article.quantitEnStock%TYPE IS uneQuantitEnStock Article.quantitEnStock%TYPE; BEGIN SELECT quantitEnStock Article INTO uneQuantitEnStock FROM Article noArticle uneQuantitEnStock WHERE noArticle = unNoArticle; 10 20 RETURN uneQuantitEnStock; 12 100 END fQuantitEnStock; /
Function created.
SQL> select fQuantitEnStock(10) from dual; FQUANTITENSTOCK(10) -------------------20
Dpartement de gnie logiciel et des TI
(De Robert
Godin) CURSOR lignesCommande(unNoCommande Commande.noCommande%TYPE)IS SELECT noArticle, quantit FROM LigneCommande WHERE LigneCommande.noCommande = unNoCommande ;
OPEN lignesCommande(leNoCommande); -- Le OPEN ouvre le CURSOR en lui passant les paramtres LOOP FETCH lignesCommande INTO leNoArticle, laQuantitCommande; -- Le FETCH retourne la ligne suivante EXIT WHEN lignesCommande%NOTFOUND; -- %NOTFOUND est un attribut du CURSOR qui permet de dterminer -- si le FETCH a atteint la fin de la table END LOOP; -- Le CLOSE ferme le CURSOR CLOSE lignesCommande;
noCommande = 50
open
LignesCommande
noArticle quantit
10 12 6 3
SHOW ERRORS sous SQL*PLUS pour voir les erreurs de compilation Table USER_SOURCE dans la mtabase
SQL> 2 3 4 SELECT text FROM USER_SOURCE WHERE name = 'FQUANTITENSTOCK' AND type = 'FUNCTION' ORDER BY line;
TEXT -------------------------------------------------------------------------------FUNCTION fQuantitEnStock (unNoArticle Article.noArticle%TYPE) RETURN Article. quantitEnStock%TYPE IS uneQuantitEnStock Article.quantitEnStock%TYPE; BEGIN SELECT quantitEnStock INTO uneQuantitEnStock FROM Article WHERE noArticle = unNoArticle; RETURN uneQuantitEnStock; TEXT -------------------------------------------------------------------------------END fQuantitEnStock; 13 rows selected.
Bloc PL/SQL
[DECLARE dclaration [dclaration] ...] BEGIN squenceEnoncs [EXCEPTION exception_nonc [exception_nonc] ...] END
SQL> DECLARE 2 laQuantitEnStock Article.quantitEnStock%TYPE; 3 BEGIN 4 SELECT quantitEnStock INTO laQuantitEnStock 5 FROM Article 6 WHERE noArticle = 10; 7 IF laQuantitEnStock = 0 THEN 8 DBMS_OUTPUT.PUT_LINE('L article est en rupture de stock'); 9 ELSE 10 DBMS_OUTPUT.PUT('Quantit en stock :'); 11 DBMS_OUTPUT.PUT_LINE(laQuantitEnStock); 12 END IF; 13 EXCEPTION 14 WHEN NO_DATA_FOUND THEN 15 DBMS_OUTPUT.PUT_LINE('Numro d article inexistant'); 16 WHEN OTHERS THEN 17 RAISE_APPLICATION_ERROR(-20001,'Erreur souleve par le SELECT'); 18 END; 19 / Quantit en stock :20 PL/SQL procedure successfully completed.
nomException EXCEPTION;
RAISE nomException;
Procdure stocke
Une procdure stocke dfinit un calcul plus ou moins complexe;
Elle est compile; Elle est appele avec des paramtres; Elle ne retourne rien (sauf paramtres OUT);
Le calcul se droule entirement sur le serveur (excution centralise); Ne ncessite aucun autre transfert de donnes que celui des paramtres;
30
Dpartement de gnie logiciel et des TI
(De
CREATE OR REPLACE PROCEDURE suppr_dept_sans_emp IS BEGIN DELETE FROM DEPT WHERE NOT EXISTS (SELECT * FROM EMP WHERE EMP.DEPTNO = DEPT.DEPTNO); END; /
Dpartement de gnie logiciel et des TI
CREATE OR REPLACE PROCEDURE stat_dept(dept IN INTEGER, nombre OUT INTEGER, salaire_min OUT INTEGER, salaire_max OUT INTEGER) IS BEGIN SELECT COUNT(*), MIN(sal), MAX(sal) INTO nombre, salaire_min, salaire_max FROM EMP WHERE DEPTNO = dept; END; /
Utile l'intrieur d'un bloc PL/SQL pour rcuprer les valeurs des variables OUT ou IN OUT
Dpartement de gnie logiciel et des TI
Procdure stocke
SQL> 2 3 4 5 6 7 8 9
CREATE PROCEDURE pModifierQuantitEnStock (unNoArticle Article.noArticle%TYPE, nouvelleQuantitEnStock Article.quantitEnStock%TYPE) IS BEGIN UPDATE Article SET quantitEnStock = nouvelleQuantitEnStock WHERE noArticle = unNoArticle; END pModifierQuantitEnStock; /
Procedure created.
SQL> EXECUTE pModifierQuantitEnStock(10,20); PL/SQL procedure successfully completed. SQL> SELECT * FROM Article WHERE noArticle = 10; NOARTICLE DESCRIPTION PRIXUNITAIRE QUANTITENSTOCK ---------- -------------------- ------------ --------------10 Cdre en boule 10,99 20
SQL> EXECUTE pStatutCommande(2); Commande #:2 noArticle :40 quantit :2 livraison complte noArticle :95 quantit :3 quantit en attente :2 PL/SQL procedure successfully completed. SQL> EXECUTE pStatutCommande(5); Commande #:5 noArticle :10 quantit :5 livraison en attente noArticle :20 quantit :5 livraison en attente noArticle :70 quantit :3 quantit en attente :1 PL/SQL procedure successfully completed. SQL> EXECUTE pStatutCommande(10); Commande #:10 Numro de commande inexistant PL/SQL procedure successfully completed.
Oracle PL/SQL
packages; support direct des types SQL pour les variables; excution au niveau serveur de BD (directement dans linterface SQL*Plus); Stocke dans le schma relationnel.
Dpartement de gnie logiciel et des TI
JDBC
API normalise pour JAVA Ensemble de classes Besoin dinstaller un pilote JDBC dans lenvironnement JAVA
http://java.sun.com/products/jdbc/index.jsp http://www-db.stanford.edu/~ullman/fcdb/oracle/or-jdbc.html http://otn.oracle.com/tech/java/sqlj_jdbc/htdocs/jdbc_faq.htm
Serveur JDBC
Serveur de BD
Re sultSet
getString("shrfirm")
getInt("shrqty")
Chargement d'un pilote JDBC (DriverManager) et tablissement d'une connexion (Connection) (De
Robert Godin)
Excution d'une opration de mise jour (INSERT, DELETE, UPDATE) (De Robert Godin)
import java.sql.*; class ClientInsertJDBC { public static void main (String args []) throws SQLException, ClassNotFoundException, java.io.IOException { // Charger le pilote JDBC d'Oracle Class.forName (new oracle.jdbc.driver.OracleDriver()); // Connexion une BD Connection uneConnection = DriverManager.getConnection ", "godin", "oracle");
("jdbc:oracle:thin:@142.137.17.23:1521:rgodin
// Cration d'un nonc associ la Connection Statement unEnoncSQL = uneConnection.createStatement (); // Insertion d'une ligne dans la table Client int n = unEnoncSQL.executeUpdate ("INSERT INTO CLIENT " + "VALUES (100, 'G. Lemoyne-Allaire', '911')"); System.out.println ("Nombre de lignes inserees:" + n); // Fermeture de l'nonc et de la connexion unEnoncSQL.close(); uneConnection.close();
} }
// Cration d'un nonc associ la Connexion Statement unEnoncSQL = uneConnection.createStatement(); // Excution d'un SELECT ResultSet rsultatSelect = unEnoncSQL.executeQuery ("SELECT noClient, nomClient "+ "FROM CLIENT " + "WHERE noClient > 40"); // Itrer sur les lignes du rsultat du SELECT et extraire les valeurs // des colonnes dans des variables JAVA while (rsultatSelect.next ()){ int noClient = rsultatSelect.getInt ("noClient"); String nomClient = rsultatSelect.getString ("nomClient"); System.out.println ("Numro du client:" + noClient); System.out.println ("Nom du client:" + nomClient); }
ResultSet dfilable (scrollable), modifiable (updatable), sensible (sensitive) - JDBC2 (De Robert
Godin)
// Cration d'un nonc avec ResultSet dfilable (srollable) Statement unEnoncSQL = uneConnection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); // Excution d'un SELECT ResultSet rsultatSelect = unEnoncSQL.executeQuery ("SELECT noClient, nomClient FROM CLIENT");
//Positionnement la premire ligne du ResultSet rsultatSelect.first(); // Positionnement la dernire ligne du ResultSet rsultatSelect.last(); // Positionnement la troisime ligne rsultatSelect.absolute(3); // Positionnement relatif (avancer de 2 lignes) rsultatSelect.relative(2); // Positionnement la ligne prcdente rsultatSelect.previous();
resultSetType:
TYPE_FORWARD_ONLY (dfaut) dfilement avant 1 fois MAJ non visibles TYPE_SCROLL_INSENSITIVE dfilement av/ar MAJ non visibles TYPE_SCROLL_SENSITIVE dfilement av/ar MAJ visibles
resultSetConcurrency:
CONCUR_READ_ONLY (dfaut) CONCUR_UPDATABLE lecture seulement select, insert, delete, update
noClient 10 20 70 { insertRow()}
Navigation: first(); last(); next(); previous(); absolute(int); relative(int); moveToInsertRow(); Mises jour dans le ResultSet: updateXXX(); (XXX=type) cancelRowUpdates(); Dpartement de gnie logiciel et des TI
// Chercher le BLOB locator ResultSet unResultSet = unEnoncSQL.executeQuery ("SELECT * FROM tableBlob WHERE idBlob = 1"); if (unResultSet.next()){ int idBlob = unResultSet.getInt(1); Blob unBlob = unResultSet.getBlob(2); // Chercher la taille du BLOB et l'afficher int taille = (int)unBlob.length(); System.out.println("Taille du BLOB" + taille); } // Lire le BLOB dans un tableau d'octets byte octets[] = unBlob.getBytes(1, taille); // Crer un fichier contenant les octets lus FileOutputStream unFichier = new FileOutputStream("C:/forte4j/Development/ExemplesJDBC/CopieCoq1.gif"); unFichier.write(octets); unFichier.close();
Par dfaut : auto-commit PouruneConnection.setAutoCommit(false); modifier PouruneConnection.commit(); un commit explicite : Pour un rollback :
uneConnection.rollback();
(De Robert
CallableStatement unCall = uneConnection.prepareCall("{call pModifierQuantitEnStock(?,?)}"); // Spcification des paramtres d'entre unCall.setInt(1,10); unCall.setInt(2,20); // Excution de l'appel unCall.execute(); unCall.close(); uneConnection.close();
Le rsultat du SELECT contient 2 colonnes La colonne 1 qui se nomme NOCLIENT est de type NUMBER La colonne 2 qui se nomme NOMCLIENT est de type VARCHAR2
Plan de la prsentation
Interfaces entre SQL et un programme SQL-PSM, fonctions et procdures API JBDC Java enchss SQLJ Le paquetage DBMS_LOB et la manipulation de LOBs
SQLJ
Partie 0 de SQLJ
Partie 1 de SQLJ
Routines stockes (mthodes static)
Partie 2 de SQLJ
Utilisation de classes Java en tant que
types SQL
http://otn.oracle.com/software/tech/java/sqlj_jdbc/index.html
Dpartement de gnie logiciel et des TI
Variables partages
Int no; String nom; String tel; #sql {INSERT INTO CLIENT VALUES (:no, :nom, :tel)};
//Exemple d'insertion d'un Client avec SQLJ package ExemplesSQLJ; import sqlj.runtime.*; import sqlj.runtime.ref.*; import java.sql.*;
Exemple
public class ClientInsertSQLJ{ public static void main (String args []) throws SQLException, ClassNotFoundException, java.io.IOException { // Charger le pilote JDBC d'Oracle Class.forName ("oracle.jdbc.driver.OracleDriver"); // Cration du contexte de connexion de dfaut avec autocommit (true) DefaultContext unContexte = new DefaultContext ("jdbc:oracle:thin:@localhost:1521:ora817i", "godin", "oracle", true); DefaultContext.setDefaultContext(unContexte); // Insertion en utilisant le contexte de dfaut #sql {INSERT INTO CLIENT VALUES (100, 'G. Lemoyne-Allaire', '911')}; // Fermeture du contexte de connexion unContexte.close(); } }
Dpartement de gnie logiciel et des TI
// Utilisation de la clause INTO #sql { SELECT nomClient, noTlphone INTO :nom, :tel FROM Client WHERE noClient = 10};
// Dfinition de la classe IteratorClient avec liaison par nom #sql iterator IteratorClient implements sqlj.runtime.ForUpdate (int noClient, String nomClient);
// Accs au rsultat du SELECT par itration sur les lignes while (unIteratorClient.next()){ if (unIteratorClient.noClient()== 60){ #sql {UPDATE Client SET noTlphone = '(111)111-1111' WHERE CURRENT of :unIteratorClient}; } else if (unIteratorClient.noClient()== 80){ #sql {DELETE FROM Client WHERE CURRENT of :unIteratorClient}; }
int laQuantite = 0; int noArticle = 10 ; // Appel de la fonction stocke #sql laQuantite = {VALUES (fQuantitEnStock(:noArticle))}; // Fermeture du contexte de connexion unContexte.close(); System.out.println("Quantit en stock :" + laQuantite);
62
Dpartement de gnie logiciel et des TI
Le paquetage DBMS_LOB
Ensemble de fonctions additionnelles pour la gestion des LOBs Accs ces fonctions :
l'utilisateur SYS doit excuter les scripts
dbmslob.sql et prvtlob.plb, ou le script catproc.sql il doit donner les droits d'accs ce paquetage aux utilisateurs appropris
Utilisation via SQL, PL/SQL, SQLJ en gnral Ne distinguent pas explicitement CLOB et BLOB
Dpartement de gnie logiciel et des TI
Le paquetage DBMS_LOB
Enregistrer et manipuler des grands objects BFILEs, BLOB, CLOB, NCLOB Max 4 gigabits 17 fonctions disponibles
Appends the contents of a source internal LOB to a destination internal LOB Compares two LOBs of the same type; parts of LOBs can also be compared Copies all or part of the contents of a source internal LOB to a destination internal LOB Erases all or part of an internal LOB Closes an open BFILE Closes all open BFILEs
No No No
Checks if a given file exists Returns directory alias and filename of given file locator Opens a BFILE for read-only access Determines if a BFILE was opened with the given file locator Returns the length of the input LOB; length is in bytes for BFILEs and BLOBs; length is in characters for CLOBs and NCLOBs
INSTR
Returns matching offset location in the input LOB of the Nth occurrence of a given pattern Loads all or part of external LOB to internal LOB Provides piece-wise read access to a LOB Provides piece-wise read access to a LOB Trims the contents of an internal LOB to the length specified by the newlenparameter Writes a given number of bytes or characters to an internal LOB at a specified offset
No No Yes No
WRITE
No
Le paquetage DBMS_LOB
Exemples dappels de fonctions
E/S DBMS_LOB.OPEN, DBMS_LOB.READ, DBMS_LOB.WRITE, DBMS_LOB.WRITEAPPEND, DBMS_LOB.LOADFROMFILE, DBMS_LOB.CLOSE Manipulation de LOBs DBMS_LOB.SUBSTR, DBMS_LOB.INSTR, DBMS_LOB.GETLENGTH, DBMS_LOB.TRIM, DBMS_LOB.APPEND, DBMS_LOB.ERASE Divers DBMS_LOB.CREATETEMPORARY
Dpartement de gnie logiciel et des TI
Commentaires
Nombre max de fichiers ouverts
INIT.ORA) dfaut fix 10, modifiable par
dfini par SESSION_MAX_OPEN_FILES (fichier
table VARCHAR2(n) limit 32 Ko comme variable PL/SQL Pour charger des LOBs plus gros, utiliser SQL*LOADER (chargement en lot)
Corps de la Procdure
BEGIN DBMS_LOB.OPEN(Lob_loc, /*Open BFILE:*/ DBMS_LOB.LOB_READONLY); DBMS_LOB.READ(Lob_loc, /*Read data:*/ Amount, Position, Buffer); DBMS_LOB.CLOSE(Lob_loc);/*Close BFILE:*/ END;
Avant dinsrer des donnes dans une colonne image vous devez Assurer que le localisateur est non-nul. Initialisation du localisateur de la colonne BFILE. Associer lobjet BFILE avec un rpertoire dans votre ordinateur (lequel va contenir les fichiers)
CREATE DIRECTORY "PHOTO_DIR" AS 'C: \PICTURES';
Sommaire cours #3
Accs divers une BD par des langages:
Appels BD de plusieurs manires Introduction PL/SQL, SQLJ et JDBC Lutilisation de PL/SQL pour manipuler les