Sunday 27 November 2011

Gestion Utilisateur sous Oracle

Rôle et Utilisateurs sous Oracle

1 - Profil et utilisateur.

Afin d'augmenter la sécurité de la base de données il peut être très interessant
de mettre en place une gestion des mots de passe comme le nombre maximal de tentatives
de connexion à la base, le temps de vérouillage d'une compte, etc...
Il peut parfois aussi être intéressant de limiter les ressources système
allouées à un utilisateur afin d'éviter une surcharge inutile du serveur.
dans cette exemple, je vous montre la création des utilisateur,role sous Oracle.

 



1:Créer deux utilisateurs;	

 Create user  yani   identified by saw ;
 Create user  sami   identified by tiger ;

2:Consulter le dictionnaire pour visualiser ces users;
   select username, account_status from dba_users
	        where username in('YANI','SAMI');
	
3:Accorder le privelege connect au premier user;
   Grant  connect  to yani;	
  
4: Consulter le dictionnaire de YANI
    desc user_objects;
	select object_name,object_type  from user_objects;
	
Lancer un script;
  create  table avion 
( id number(5),
nom varchar2(25));
e  table avion

R à la ligne 1 :
1031: privilèges insuffisants   
--On n'a pas attribuer le privelge ressource

5: Les rôles CONNECT et RESOURCE avec le droit d’accorder ses privilèges 2éme user;

 Grant connect, resource to sami;

6:	Quel profil a été accordé à ces utilisateurs:  
         select *  from dba_profiles
          where profile='DEFAULT';
  
  
 7:  profile utilisateurs
       desc dba_users
	   select profile from dba_users  where  username in ('YANI','SAMI');


		
         		
	   
11: Autoriser le premier utilisateur à créer des tables 
    -accorder son privilège au deuxième  utilisateur
		 GRANT CREATE ANY TABLE TO YANI WITH ADMIN OPTION;   
         Grant connect, resource to yani;

12 Retirer le droit de create de  table
 REVOKE CREATE ANY TABLE FROM YANI;


Creation de rôle
    create role  gestion;
 2-associer des privelge a ce role
      grant  connect, create any table, create view  to gestion;
 
   
 Afficher les roles sys  
  1  select * from dba_sys_privs
  2* where grantee='GESTION'
  3  ;

GRANTEE                        PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
GESTION                        CREATE VIEW                              NO
GESTION                        CREATE ANY TABLE                         NO

 
 --les resources
 select * from dba_sys_privs
 where grantee='RESOURCE';
 
 GRANTEE                        PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
RESOURCE                       CREATE TRIGGER                           NO
RESOURCE                       CREATE SEQUENCE                          NO
RESOURCE                       CREATE TYPE                              NO
RESOURCE                       CREATE PROCEDURE                         NO
RESOURCE                       CREATE CLUSTER                           NO
RESOURCE                       CREATE OPERATOR                          NO
RESOURCE                       CREATE INDEXTYPE                         NO
RESOURCE                       CREATE TABLE                             NO




-limit les utilisateurs sur les profils;
-Modification du profil par défaut
-limiter le temps de connexion d'une session non active à 60 mn

 ALTER PROFILE DEFAULT
LIMIT IDLE_TIME 60;

-création d'un profil pour la gestion des connexions
-limiter à 5 essais la tentative de connexion
-le nombre de changements de mots de passe avant de pouvoir réutiliser
-un mot de passe qui a déjà été employé
-Nombre de jours qui doivent s'écouler avant qu'un mot de passe puisse 
-être réutilisé 
1--Profile 01
CREATE PROFILE connexion 
LIMIT FAILED_LOGIN_ATTEMPS 4
PASSWORD_REUSE_MAX 3
PASSWORD_REUSE TIME UNLIMITED;

2-- Profile 02
CREATE PROFILE connexion01
   LIMIT
   SESSIONS_PER_USER         3         --- Accorder  De 03 tentatives Pour Utilisateurs
   CPU_PER_SESSION           DEFAULT    --- CPU Par User    
   CPU_PER_CALL              DEFAULT    
   CONNECT_TIME              DEFAULT      
   IDLE_TIME                 60         --- 60 Jours   
   LOGICAL_READS_PER_SESSION DEFAULT 
   LOGICAL_READS_PER_CALL    DEFAULT   
   COMPOSITE_LIMIT           DEFAULT 
   PRIVATE_SGA               DEFAULT 
   ;
   
   --Creation de fonction
 CREATE OR REPLACE FUNCTION complexite_pwd (username VARCHAR2,password VARCHAR2,old_password VARCHAR2)
  RETURN boolean IS 
BEGIN
IF (length(password)<06) THEN
raise_application_error(-20009, 'ERROR: Le mot de passe doit être supérieur à 06 caractére');

END IF;

return True;
END; 
/ 

Activer cette fonction avec modification commande.
ALTER PROFILE    connexion01 LIMIT PASSWORD_VERIFY_FUNCTION complexite_pwd;
 
VERIFIER 
 Create user  sami1 identified by tiger01
 PROFILE connexion01
 PASSWORD EXPIRE ;
 
 Grant connect,resource to sami1
 

3-- Profile 03
create profile   prof_connexion
limit
sessions_per_user
cpu_per_session            10000    : centiéme de seconde
cpu_per_call               1        : centiéme de seconde
connect_time               unlimited  : minutes
idle_time                  30         : minutes
logical_reads_per_session  default    : db blocks
logical_reads_per_call     default  :  db blocks
                                           
private_sga                20M    
failed_login_attempts      3    :Nombre d'erreurs permises à la saisie 
	                        du mot de passe avant que le compte soit verrouillé
password_life_time         60    : duréé de vie mot passe puis changé (jours)
password_reuse_time        12   : peut pas réutiliser le mot de passe déja 
	                        utiliser avant 12 jours
password_reuse_max         unlimited    :Nombre de changement de mots de passe requis
                                          avant de pouvoir ré-utiliser un mot de passe déjà utilisé
password_lock_time         default    :Durée (en jours) pendant laquelle un compte sera verrouillé 
                                         après qu'il ait atteint le nombre d'erreurs permises 
			                    à la saisie de son mot de passe (FAILED_LOGIN_ATTEMPTS),days
password_grace_time        2    : En cas de péremption d'un mot de passe dû à un délai
                                         fixé par l'administrateur
                                         cette option permet de paramétrer une durée (en jours) pendant  
					laquelle l'utilisateur pourra tout de même se 
					connceter, mais recevra un avertissementdays
password_verify_function  null ;  --permet de préciser une fonction
                           (PL/SQL) vérifiant la compexité du mot de passe.
  
 Exemple de fonction
 
 CREATE OR REPLACE FUNCTION restrict_pwd_change (username VARCHAR2,
password VARCHAR2,
old_password VARCHAR2)
RETURN boolean IS 
BEGIN
raise_application_error(-20009, 'ERROR: Modification du mot de passe impossible');
END; 
/ 

4--Consulter  les profils
       SELECT profile, resource_name, limit
             FROM Dba_Profiles
              WHERE resource_type = 'PASSWORD'
              ORDER BY profile;  

	

Activer cette fonction par la commande suivante :

ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION restrict_pwd_change;

--Pour désactiver cette restriction, utilisez cette commande :

ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION null; 
		  
 
 --associer le profile au utilisateurs
 ALTER USER Yani  PROFILE connexion01;

 

        

Monday 3 October 2011

SQL Loader Oracle

SQL LOADER - Importer CSV dans… - Oracle 10G - 11G   Comment charger un fichier dans plusieurs Tables Oracle avec SQL Loader. ?

Chargement Multiple de données délimitées avec SQL Loader.

Nous allons voir ici avec sqlldr comment, à partir d'un fichier de données unique
on importe dans plusieurs tables Oracle avec plusieurs clause INTO TABLE.

1 - Chargement SQLLDR dans 2 Tables.

Dans l'exemple de chargement ci-dessous, nous n'utiliserons pas d'Input Data File.
nous allons mettre les données à charger directement dans le Fichier de contrôle après la Clause
BEGINDATA pour une meilleure visibilité de l'exemple.

 

Structure des 2 tables cibles.

 
CREATE TABLE EMP
(
  EMPNO     NUMBER(4)                               NULL,
  ENAME     VARCHAR2(10 BYTE)                       NULL,
  JOB       VARCHAR2(9 BYTE)                        NULL,
  MGR       NUMBER(4)                               NULL,
  HIREDATE  DATE                                    NULL,
  SAL       NUMBER(7,2)                             NULL,
  COMM      NUMBER(7,2)                             NULL,
  DEPTNO    NUMBER(2)                               NULL
)
TABLESPACE USERS;

 
CREATE TABLE BONUS
(
  ENAME  VARCHAR2(10 BYTE)                          NULL,
  JOB    VARCHAR2(10 BYTE)                          NULL,
  SAL    NUMBER                                     NULL,
  COMM   NUMBER                                     NULL
)
TABLESPACE USERS;

 

Structure du Control File SQLLDR ( INTO MULTIPLE TABLE ).

 
OPTIONS (DIRECT=TRUE)
    LOAD DATA
    INFILE *
          BADFILE 'test-ora.bad'
          DISCARDFILE 'test-ora.dsc'
    TRUNCATE

       INTO TABLE EMP
       FIELDS terminated by ";" Optionally enclosed by '"'
       (
           empno    INTEGER EXTERNAL,
           ename    CHAR "UPPER(:ename)",
           job      CHAR "RTRIM(:job)",
           mgr      INTEGER EXTERNAL NULLIF (mgr="NULL"),
           hiredate DATE "MM/DD/YYYY HH24:MI:SS",
           sal      DECIMAL EXTERNAL,
           comm     DECIMAL EXTERNAL NULLIF (comm="NULL"),
           deptno   INTEGER EXTERNAL OPTIONALLY ENCLOSED BY "'"
         )
       INTO TABLE BONUS

       FIELDS terminated by ";" Optionally enclosed by '"'
       (
           empno    FILLER POSITION(1),
           ename    CHAR "UPPER(:ename)",
           job      CHAR "RTRIM(:job)",
           mgr      FILLER ,
           hiredate FILLER ,
           sal      DECIMAL EXTERNAL,
           comm     DECIMAL EXTERNAL NULLIF (comm="NULL"),
           deptno   FILLER

         )
BEGINDATA
7369;smith;CLERK ;7902;;800,50;;30
7499;"Allen";"SALESMAN ";NULL;"02/20/1981 00:00:00";1600;300;'30'
7521;"WARD";"SALESMAN";7698;"02/22/1981 00:00:00";1250;500,56;30

  • Nous avons deux clauses INTO TABLE.
  • L'option TRUNCATE est placée en haut par défaut.
    L'option s'applique pour les deux tables. On peut définir deux options differentes,
    dans ce cas on place l'option TRUNCATE juste après la clause INTO TABLE.
  • INTO TABLE EMP
    TRUNCATE
    ...
    INTO TABLE BONUS
    TRUNCATE
    
  • Dans la deuxièmes clauses INTO TABLE, nous désactivons les champs
    qui ne correspondent pas à notre structure de la table Bonus avec le type FILLER.
  • Vous remarquerez le mot clé POSITION avec la valeur 1 sur la première colonne.
    Ceci est obligatoire, pour réinitialiser le pointeur dans SQLLOADER.
    Ici la valeur est 1 car nous voulons qu'il commence la lecture à partir du début de la ligne.
    Si vous omettez ce mot clé, la deuxième table ne sera pas mise à jour.

 

Chargement avec la commande SQLLDR.

ici le fichier de contrôle test-ora.ctl est dans le dossier D:\SQLLOADER

 
C:\SQLLOADER>SQLLDR scott/tiger@orcl CONTROL=D:\test-ora.ctl

SQL*Loader: Release 10.2.0.1.0 - Production on Vendredi. Septembre 30 19:36:17 2011
Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Chargement terminé - calcul enregistrement(s) logique(s) 5.

C:\SQLLOADER>
 
C:\SQLLOADER>SQLPLUS scott/tiger

SQL*Plus: Release 10.2.0.1.0 - Production on Vendredi. Septembre 30 19:42:17 2011
Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connecté à :
Oracle Database 10g Release 10.2.0.1.0 - Production

SQL> SET LINESIZE 130
SQL> SELECT * FROM EMP;

     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902                 800,5                    30
      7499 ALLEN      SALESMAN             20/02/1981       1600        300         30
      7521 WARD       SALESMAN        7698 22/02/1981       1250     500,56         30
    
SQL> SELECT * FROM BONUS;

ENAME      JOB               SAL       COMM
---------- ---------- ---------- ----------
SMITH      CLERK           800,5
ALLEN      SALESMAN         1600        300
WARD       SALESMAN         1250     500,56

SQL>

 

Vérification du fichier LOG

 
C:\SQLLOADER>TYPE test-ora.log

SQL*Loader: Release 10.2.0.1.0 - Production on Vendredi. Septembre 30 19:45:17 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Fichier de contrôle :   test-ora.ctl
Fichier de données :    test-ora.ctl
  Fichier BAD :     test-ora.bad
  Fichier DISCARD : test-ora.dsc

 (Allouer tous les rebuts)
Nombre à charger : ALL
Nombre à sauter: 0
Erreurs permises: 50
Continuation :    aucune spécification
Chemin utilisé:   Direct
Table EMP, chargé à partir de chaque enregistrement physique.
Option d'insertion en vigueur pour cette table : TRUNCATE
....
...
..
Table BONUS, chargé à partir de chaque enregistrement physique.
Option d'insertion en vigueur pour cette table : TRUNCATE
.....
...
..
Table EMP :
  Chargement réussi de 5 Lignes.
  0 Lignes chargement impossible dû à  des erreurs de données.
  0 Lignes chargement impossible car échec de toutes les clauses WHEN.
  0 Lignes chargement impossible car tous les champs étaient non renseignés.

Table SCOTT."BONUS" :
  Chargement réussi de 5 Lignes.
  0 Lignes chargement impossible dû à des erreurs de données.
  0 Lignes chargement impossible car échec de toutes les clauses WHEN.
  0 Lignes chargement impossible car tous les champs étaient non renseignés.

Nombre total d'enregistrements logiques ignorés :          0
Nombre total d'enregistrements logiques lus :             5
Nombre total d'enregistrements logiques rejetés :         0
Nombre total d'enregistrements logiques mis au rebut :        0

C:\SQLLOADER>

Saturday 1 October 2011

Installation Appex 4.1

Installation Apex 4.1 sous window 7

Installation Apex 4.1 sous window 7


1- Técharger Apex 4.1  sur ce lien:  Apex 4.1 

2- Démpresser le dossier dans un dossier (exemple :D:\LOGICIEL\apex_4.1\apex)

3- Sous Dos: D:\LOGICIEL\apex_4.1\apex
   3-1-  Placer vous sous le repertoire ou vous avez mis le  dossier  apex 
   3-2-  Connectez sous sqlplus comme SYS. Éxécutez apepxins  pour commencer l'installation
  D:\> sqlplus  sys as sydba 
             password: ********

 sql> @appexins  sysaux sysaux temp /i/      //création du reférentiel 
pour le dévloppement de nos application
 
L'installation va commencer 
vous allez voir le diffellement de creation de table utilisateur, beaucoup d'objet oracle
ca prend 20 à 25 min

vous devez avoir a la fin les lignes suivantes en cas de bonne installation , et la
déconexion automatique  de la base de données

...6 types
...0 type bodies
...0 operators
...0 index types
...Begin key object existence check 17:30:34
...Completed key object existence check 17:30:34
...Setting DBMS Registry 17:30:34
...Setting DBMS Registry Complete 17:30:34
...Exiting validate 17:30:34
timing for: Validate Installation
Elapsed: 00:04:54.06
timing for: Development Installation
Elapsed: 00:18:14.34
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Pr
oduction
With the Partitioning, OLAP and Data Mining options

Discounected from Oracle Database 10g Entreprise Edition 


D:\LOGICIEL\apex_4.1\apex>

ʸecution de apxldimg.sql

 4- Reconecter sur sqlplus en tant que administrateur, on va éxécuter  le script(apxldmg.sql)
  

D:\LOGICIEL\apex_4.1\apex>sqlplus sys as sysdba

SQL*Plus: Release 10.1.0.4.2 - Production on Sat Oct 1 17:41:58 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Enter password:

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> @apxldimg D:\LOGICIEL\apex_4.1

PL/SQL procedure successfully completed.

old   1: create directory APEX_IMAGES as '&1/apex/images'
new   1: create directory APEX_IMAGES as 'D:\LOGICIEL\apex_4.1/apex/images'
Directory created.
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
Commit complete.
timing for: Load Images
Elapsed: 00:01:23.81
Directory dropped.

SQL>
-5- Execution du script de configuration(apxconf.sql) pour terminer  notre installation
    definir un mot de passe pour l''administrateur user
    changer le port par défaut, si ce dérnier et pris  par un autre programme


SQL> @apxconf

      PORT
----------
      8080
Enter values below for the XDB HTTP listener port and the password for the Appli
cation Express ADMIN user.
Default values are in brackets [ ].
Press Enter to accept the default value.
Enter a password for the ADMIN user              []
Enter a port for the XDB HTTP listener [      8080] 8090
...changing HTTP Port
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
Session altered.
...changing password for ADMIN
PL/SQL procedure successfully completed.
Commit complete.
SQL>


6-Ouvrez votre Browser 
http://localhost:port/apex/apex_admin
localhost: 8080/apex/apex_admin
changer le mot de passe administrateur
Reconnecter vous avez l''interface APEX.
Commencer à Travailler
 

Monday 5 September 2011

Tablespace Oracle

Composant logique Oracle

 
 
 Définition:
Un tablespace est un espace logique qui contient les objets stockés dans 
la base de données comme les tables ou les indexes.
Un tablespace est composé d'au moins un datafile, c'est à dire un fichier de données
qui est physiquement présent sur le serveur à l'endroit stipulé lors de sa création.
Chaque datafile est constitué de segments d'au moins un extent (ou page) lui-même
constitué d'au moins 3 blocs : l'élément le plus petit d'une base de données. 

Exemple de création de table space 
SQL>CREATE TABLESPACE  tabledata DATAFILE 
       'C:\oracle\oradata\oradba\tabledata.ora' 
        SIZE 75M DEFAULT storage
     (INITIAL 100k NEXT 100k minextents 1 MAXEXTENTS unlimited pctincrease 0);

Remarque : changer le chemin selon votre installation de la base de données 
          dans mon cas ('C:\oracle\oradata\oradba').

SQL> CREATE TABLESPACE tableindex DATAFILE
     'C:\oracle\oradata\oradba\tableindex.ora' size 100M default storage
      (INITIAL 100k NEXT 100k minextents 1 MAXEXTENTS unlimited pctincrease 0);

SQL>Select * from dba_tablespace_usage_metrics order by used_percent desc;

TABLESPACE_NAME                USED_SPACE             TABLESPACE_SIZE        USED_PERCENT           
------------------------------ ---------------------- ---------------------- ------------- 
SYSTEM                         91048                  2338840                3.892 
SYSAUX                         84656                  2306840                3.66 
TABLEINDX                      128                    12800                  1                      
TABLEDATA01                    128                    19200                  0.667 
EXAMPLE                        9960                   2228760                0.446
UNDOTBS1                       1968                   2221028                0.088
USERS                          968                    2217080                0.043
TEMP                           0                      2216548                0                      
 8 rows selected 


Pour Modifier la taille du table space

SQL>ALTER DATABASE datafile 'C:\oracle\oradata\oradba\tabledata.ora' resize 150M;

Pour modifier le tablespace system

SQL>ALTER TABLESPACE SYSTEM add datafile  'C:\oracle\oradata\oradba\tableadd.ora' size 140M;

Définition  d'un tablespace temporaire
Un tablespace temporaire est un tablespace spécifique aux opérations 
de tri pour lesquelles la SORT_AREA_SIZE  ne serait pas suffisamment grande.
Ce tablespace n'est pas destiné à accueillir des objets de la base de données 
et son usage est réservé au système. 
 
Pour créer un table space Temporaire, utilisez le mot clé Tempfile
au lieu du mot Datafile

SQL>CREATE TEMPORARY TABLESPACE tabletemp  TEMPFILE
     'C:\oracle\oradata\oradba\tabletempuser.ora' size 10M ;

Création d'un utilisateur et attacher à un tablespace.
Attribuer un nom utilisateur et votre mot de passe.

SQL>CREATE USER  NOM_USER identified by MOTPASSE
        DEFAULT TABLESPACE tabledata TEMPORARY TABLESPACE tabletemp;

Friday 29 July 2011

Oracle forms10g

Oracle Forms 10g

Gestion d'un écran de connexion forms

	  utilisation du déclencheur When-Button-pressed pour acceder par un formulaire oracle forms10g 	
DECLARE
 	userid  compte.identifiant%type;
	pwd     compte.motpasse%type;
  alert  number;
  CURSOR C_connect  IS 
   SELECT identifiant, motpasse  FROM compte;            
 
BEGIN
    OPEN C_connect ;
   
    	FETCH C_connect  INTO userid,pwd;
          IF((userid=:compte.identifiant) and (pwd=:compte.motpasse)) THEN
    	    --  aller sur la fenetre d'acceuil de l' application  
    	    BELL;
    	    CLEAR_FORM(NO_COMMIT, FULL_ROLLBACK);
           NEW_FORM('ACCEUIL.fmx',FULL_ROLLBACK, NO_QUERY_ONLY ,SHARE_LIBRARY_DATA,'default');  
	             
              		
     	ELSE 
	
			set_alert_property('Message',alert_message_text,'Erreur de conncexion:
                            			verifier votre idtentifiant et mot de passe');
      alert := show_alert('Message');
       go_item('nom');
       :control.nbre:=:control.nbre+1;

    END IF;   
 
   
    CLOSE C_connect;
        IF (:control.nbre)>=3 Then
        		set_alert_property('Message',alert_message_text,'Erreur de conncexion:
                                         				nombre de tentatavie atteint');
            alert := show_alert('Message');
            exit_form(No_COMMIT,NO_ROLLBACK);
            RAISE FORM_TRIGGER_FAILURE;
        END IF;    
		
END;





 
.

Saturday 16 July 2011

Connexion a une base de donneé Oracle avec JAVA

JAVA: JDBC

Oracle JAVA: acces Base de donnee

Cette Classe vous permet de vous connecter à une base de donnée Oracle pour faire un SELECT, et si la meme
chose pour les autres commande du LMD

 
   /*
 * To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package jdbc1_cours09;
/**
* * @author Hakim akkache
*/ import java.sql.*;
public class connexion {
/**
* @param args the command line arguments
*/
public static void main(String[] args)throws SQLException, ClassNotFoundException, java.io.IOException {
{ //charger le driver
Class.forName("oracle.jdbc.OracleDriver");
Connection connexion=null;
Statement stmt=null;
try
{
connexion=DriverManager.getConnection("jdbc:oracle:thin:@Localhost:1521:BaseTets, " +"nomUser","password");
stmt=connexion.createStatement();
ResultSet rset=stmt.executeQuery("SELECT department_name,count(*)"
+"from employees,departments "
+"where employees.department_id=departments.department_id "
+"group by department_name "
+"order by department_name ");
//parcourir le r?ltat de la requete pour affichage
while (rset.next()){
System.out.println(" le département :"+rset.getNString(1)
+" dispose de "+rset.getInt(2)+ " employes");
}
}finally {
if (stmt!=null){
stmt.close();
}
if(connexion!=null){
connexion.close(); //Fermer la connexion apres avoir terminer vos requetes.
}
}
}
} } le resultat de l'exécution est le suivant
le département :Administration dispose de 1 employes
le département :Executive dispose de 3 employes
le département :Finance dispose de 6 employes
le département :Human Resources dispose de 1 employes

BUILD SUCCESSFUL (total time: 3 seconds).

Sunday 26 June 2011

les Packages PL/SQL

Oracle PL-SQL : Utilisation des Packages

Oracle PL-SQL : Utilisation des Packages

Un package permet de stocker dans le meme objet , un ensemble de procedure, fonction, curseur, triggers
afin de permettre une bonne gestion des objets d'un utilisateur.
dans cette exemple, je vous montre un package avec une fonction et une procedure
à l'éxecution, l'appel de la fonction ou bien de la procedure est indixé par le nom du package
Nompackage.nomFonctoin.

 
SQL> SET SERVEROUTPUT ON
SQL> CREATE OR REPLACE PACKAGE PkTeste 
    IS
         
  TYPE Typ_rec IS RECORD
 (Nom employe.empnom%TYPE,
  Fonction employe.fonction%TYPE);
 -- declaration du type tableau pour les noms et fonctions  
  TYPE TypeFonct IS TABLE OF Typ_rec 
  INDEX BY BINARY_INTEGER; 
 TabFonc TypeFonct;
 AucuneFonct EXCEPTION; 
 --déclaration de la fonction qui retourne les fonctions des employés
 -- ayant un certain salaire fourni en paramétre
 FUNCTION FonctionEmp (Salaire NUMBER DEFAULT 1500)  
  RETURN  TypeFonct;
PROCEDURE AffichageResFct;
 END PkTeste;
 /
 
  CREATE OR REPLACE PACKAGE BODY PkTeste
 IS
 FUNCTION FonctionEmp (Salaire NUMBER DEFAULT 1500)
  RETURN  TypeFonct
  IS
  CURSOR CurFoncEmp
   IS
   SELECT empnom,fonction
   FROM employe
   WHERE sal=Salaire;
  Indice BINARY_INTEGER:=1;
 BEGIN
  FOR EnrCur in CurFoncEmp
   LOOP
    -- chargement du tableau à partir du curseur
    TabFonc(Indice).Nom:=EnrCur.empnom;
    TabFonc(Indice).Fonction:=EnrCur.fonction;
    Indice:=Indice+1;
   END LOOP;
  RETURN TabFonc;
 END FonctionEmp;
 
PROCEDURE AffichageResFct
IS
BEGIN
--appel de la fonction avec valeur par defaut
TabFonc:=FonctionEmp;
--affichage des noms et fonctions des employés
IF TabFonc.COUNT=0 THEN
  RAISE AucuneFonct;
 ELSE 
  DBMS_OUTPUT.PUT_LINE('Les employés touchant le salaire de 1500 occupent les fonctions');
  DBMS_OUTPUT.PUT_LINE('   Nom         '||'  Fonction ');
  DBMS_OUTPUT.PUT_LINE('******************************');
  FOR Ind IN 1 ..TabFonc.COUNT
    LOOP
    DBMS_OUTPUT.PUT_LINE(TabFonc(Ind).Nom||' '||TabFonc(Ind).Fonction);
    END LOOP; 
 END IF;
--appel de la fonction avec la valeur 2500
TabFonc:=FonctionEmp(2500);
--affichage des fonctions des employés
IF TabFonc.COUNT=0 THEN
  RAISE AucuneFonct;
 ELSE
  DBMS_OUTPUT.PUT_LINE('Les employes touchant le salaire  de 2500 ' 
    ||' occupent les fonctions');
  DBMS_OUTPUT.PUT_LINE('   Nom         '||'  Fonction ');
  DBMS_OUTPUT.PUT_LINE('******************************');
  FOR Ind IN 1 ..TabFonc.COUNT
    LOOP
    DBMS_OUTPUT.PUT_LINE(TabFonc(Ind).Nom||'    '||TabFonc(Ind).Fonction);
    END LOOP; 
 END IF;
EXCEPTION  
 WHEN AucuneFonct THEN
 DBMS_OUTPUT.PUT_LINE('Il n''y a aucun employé qui touche ce salaire ');
END AffichageResFct;
END PkTeste;
 
PL/SQL  successfully completed.

Wednesday 8 June 2011

Oracle PL-SQL: Division par zero

Erreur Oracle -PL-SQL

Oracle PL/SQL Gestion des éxception Utilisateur avec le RAISE.

Definition d'une EXCEPTION non associee à une erreur Oracle ?

PL/SQL permet de definir ses propres EXCEPTIONS, avec la commande RAISE qui interrompt le programme et transfère au gestionnaire d'EXCEPTION.

La déclaration du nom de l'exception doit se trouver dans la partie déclarative.

Voici un exemple (avec et sans gestion des erreurs) ou PLSQL soulève :

? EXCEPTION UTILISATEUR e_dept_innexistant car le département40 n'existe pas dans la base.
On s’aperçoit que pour la même requête nous avons deux messages bien différent.

APPEL EXCEPTION UTILISATEUR avec RAISE.

 
SQL> SET SERVEROUTPUT ON;
SQL> BEGIN

  2      DELETE FROM emp WHERE deptno = 40;
  3      COMMIT;
  4      dbms_output.put_line('Lignes departement 40 supprimees');
  5  END;
  6  /
Lignes departement 40 supprimees

PL/SQL procedure successfully completed.
 
SQL> SET SERVEROUTPUT ON;
SQL> DECLARE
  2      dept_InnexistantEXCEPTION;
  3  BEGIN

  4      DELETE FROM emp WHERE deptno =40;
  5      IF sql%NOTFOUND THEN
  6          RAISE dept_Innexistant;
  7      END IF;
  8      COMMIT;
  9      dbms_output.put_line('Lignes departement40 supprimees');
 10
 11  EXCEPTION
 12       WHEN dept_InnexistantTHEN

 13             dbms_output.put_line('Departement40 innexistant');
 14       WHEN OTHERS THEN
 15             dbms_output.put_line('Autres Erreurs');
 16  END;
 17  /
Departement 40 innexistant

PL/SQL procedure successfully completed.

 

----------------------------------------------------------------------------------- ------------------------------------------------------------------------------------

Oracle PL/SQL ERROR CURSOR ZERO_DIVIDE EXCEPTIONS.

Comment gérer l'érreur Oracle  ORA-01476: divisor is equal to zero  dans un bloc EXCEPTION PLSQL ?

PL/SQL dispose d'un mécanisme de gestion des érreurs qui permet de traiter ces évènements dans le BLOC EXCEPTION.

Ce curseur c_emp renvoit des enregistrements dont le champ v_emp.comm qui renvoit des valeurs égales à 0. Céla provoque une division par zéro.

Voici un exemple (avec et sans gestion des érreurs) ou PLSQL soulève :

? EXCEPTION prédéfinie ZERO_DIVIDE si v_emp.comm=0.

EXCEPTION prédéfinie ZERO_DIVIDE.

 
SQL> SET SERVEROUTPUT ON;
SQL> DECLARE

  2      v_eval_prime  emp.comm%type;
  3      v_emp         emp%rowtype;
  4      CURSOR c_emp IS
  5      SELECT ename, job, comm, sal
  6        FROM emp
  7       WHERE deptno = 20;
  8  BEGIN
  9      OPEN c_emp;
 10      LOOP
 11          FETCH c_emp INTO v_emp.ename, v_emp.job, v_emp.comm, v_emp.sal;
 12          EXIT WHEN c_emp%NOTFOUND;
 13          v_eval_prime :=  v_emp.comm + (v_emp.sal/v_emp.comm);
 14          dbms_output.put_line('Name = '||v_emp.ename || '   Job = ' || v_emp.job ||
 15          '  Nouvelle Prime = ' ||v_eval_prime);
 16      END LOOP;
 17      CLOSE c_emp;
 18  END;
 19  /
Name = ALLEN   Job = SALESMAN  Nouvelle Prime = 305.33
Name = WARD   Job = SALESMAN  Nouvelle Prime = 480.5
Name = MARTIN   Job = SALESMAN  Nouvelle Prime = 1400.89

Name = BLAKE   Job = MANAGER  Nouvelle Prime =
DECLARE
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at line 13
 
SQL> SET SERVEROUTPUT ON;
SQL> DECLARE

  2      v_eval_prime  emp.comm%type;
  3      v_emp         emp%rowtype;
  4      CURSOR c_emp IS
  5      SELECT ename, job, comm, sal
  6        FROM scott.emp
  7       WHERE deptno = 30;
  8  BEGIN
  9      OPEN c_emp;
 10      LOOP
 11          FETCH c_emp INTO v_emp.ename, v_emp.job, v_emp.comm, v_emp.sal;
 12          EXIT WHEN c_emp%NOTFOUND;
 13          v_eval_prime :=  v_emp.comm + (v_emp.sal/v_emp.comm);
 14          dbms_output.put_line('Name = '||v_emp.ename || '   Job = ' || v_emp.job || 
 15           '  Re-evaluation Prime = ' ||v_eval_prime);
 16      END LOOP;
 17      CLOSE c_emp;
 18  EXCEPTION
 19       WHEN ZERO_DIVIDE THEN

 20             dbms_output.put_line(SQLERRM(SQLCODE)||'  SALARIE SANS PRIME !!');
 21       WHEN OTHERS THEN
 22             dbms_output.put_line('Autres Erreurs');
 23  END;
 24  /
Name = ALLEN   Job = SALESMAN  Re-evaluation Prime = 305.33
Name = WARD   Job = SALESMAN  Re-evaluation Prime = 480.5
Name = MARTIN   Job = SALESMAN  Re-evaluation Prime = 1400.89
Name = BLAKE   Job = MANAGER  Re-evaluation Prime =
ORA-01476: divisor is equal to zero  SALARIE SANS PRIME !!

PL/SQL procedure successfully completed.

 

Quand le programme prend en compte l’érreur dans une entrée WHEN, les instructions de cette entrée sont exécutées et le programme se termine.

Erreur ORA-12560

Erreur Ora-12560

Oracleb ERROR: ORA-12560

1- Vérifier que vous votre Listner est dans le répertoire (C:\oracle\ora92\network).

2-demarrez le service du listner et de la base de donnée s'il sont en arrêt.

Fixez la variable d'environnement relative a votre base de donnée.

définissez une variable d'environnement de type Base de donnée oracle dans votre PATH:

pour procédez sous Windows 7

allez sur: Démarer(Start) -->Panneau de configuration(Control Pannel)

-->Mon ordinateur(My computer)--->proprieties-->Option avancées

--->variable environnement--->clique sur Ajouter

Dans la fenêtre qui apparait :

Dans la première zone de saisie du haut Tapez: Oracle_sid

Dans la deuxième zone de saisie, Tapez: Le nom de votre BDD (exemple ORCL)

Friday 3 June 2011

Oracle PL/SQL NO_DATA_FOUND et TOO_MANY_ROWS EXCEPTIONS.

ORACLE ERROR

Oracle PL/SQL NO_DATA_FOUND et TOO_MANY_ROWS EXCEPTIONS.

PL/SQL a un mécanisme de gestion des erreurs qui permet de traiter ces évènements dans le BLOC EXCEPTION.
Cette requête SELECT INTO doit renvoyer impérativement 1 seul enregistrement sinon une erreur est declenchée.
Voici deux exemples (avec et sans gestion des erreurs) ou PLSQL soulève :
/-- EXCEPTION prédéfinie NO_DATA_FOUND si aucune ligne n'est retournée (empno = 889 introuvable).
? EXCEPTION prédéfinie TOO_MANY_ROWS si plusieurs lignes sont retournées (job = 'ANALYSTE' 4 enreg. retournés).
I-  EXCEPTION prédéfinie NO_DATA_FOUND.

 

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2 v_ename emp.ename%type;
3 v_job emp.job%type;
4 v_sal emp.sal%type;
5 BEGIN
6 SELECT ename, job, sal
7 INTO v_ename, v_job,v_sal
8 FROM emp
9 WHERE empno = 889;
10 dbms_output.put_line('Name = '||v_ename || ' Job = ' || v_job||'Salaire: '||v_sal);
11 END;
/

DECLARE
*

ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 6

Traitement de l'erreur :Introduire la clause EXCEPTION
 

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2 v_ename emp.ename%type;
3 v_job emp.job%type;
4 v_sal emp.sal%type;
4 BEGIN
5 SELECT ename, job,sal
6 INTO v_ename, v_job,sal
7 FROM emp
8 WHERE empno = 889;
9 dbms_output.put_line('Name = '||v_ename || ' Job = ' || v_job||'Salaire: '||v_sal);
10 EXCEPTION
11 WHEN NO_DATA_FOUND THEN
12 dbms_output.put_line(SQLERRM(SQLCODE)||' SALARIE INNEXISTANT !!');
13 WHEN OTHERS THEN
14 dbms_output.put_line('Autres Erreurs');
15 END;
/

ORA-01403: no data found SALARIE INNEXISTANT !!
PL/SQL procedure successfully completed.

II-   EXCEPTION prédéfinie TOO_MANY_ROWS.
 

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2 v_ename emp.ename%type;
3 v_job emp.job%type;
4 v_sal emp.sal%type;
5 BEGIN
6 SELECT ename, job, sal
7 INTO v_ename, v_job,v_sal
8 FROM emp
9 WHERE job = 'ANALYSTE';
10 dbms_output.put_line('Nom = '||v_ename || ' Job = ' || v_job||'Salaire: '||v_sal);
11 END;
/

DECLARE
*

ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 6

Traitement de l'erreur :Introduire la clause EXCEPTION
 

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2 v_ename emp.ename%type;
3 v_job emp.job%type;
4 v_sal emp.job%type;
5 BEGIN
6 SELECT ename, job
7 INTO v_ename, v_job
8 FROM scott.emp
9 WHERE job = 'ANALYSTE';
10 dbms_output.put_line('Name = '||v_ename || ' Job = ' || v_job||'Salaire: '||v_sal);
11 EXCEPTION
12 WHEN TOO_MANY_ROWS THEN
13 dbms_output.put_line(SQLERRM(SQLCODE)||' Ce Job n''est pas Unique !!');
14 WHEN OTHERS THEN
15 dbms_output.put_line('Autres Erreurs');
16 END;
17 /

>ORA-01422: exact fetch returns more than requested number of rows Ce Job n'est pas Unique !!

PL/SQL procedure successfully completed.
Lorsque le traitement est transferé dans le BLOC EXCEPTION, il n'est plus possible de revenir dans le corps du bloc BEGIN (sauf utilisation de blocs imbriquées).
Quand le programme prend en compte l’erreur dans une entrée WHEN, les instructions de cette entrée sont exécutées et le programme se termine.
pour remedier au problemme de TO_MANY_ROWS: utilsez des Curseur ou bien des TYPES Tables

Sunday 29 May 2011

Erreur Ora-01033 sous Linux

Erreur ORA-01033!:

ora-01033 :Oracle initialisation or shutdown in progress: Sous linux Debian

Pour remedier a cette erreur suivez les étapes ci-dessus

Se connecter comme administrateur: Sys

Arreter la base de donnée: sql> shutdown immediate

refaire le mountage de la base de donnée: sql> startup mount

réouvrir la base de donnée: sql> alter database open

se connecter sql> conn scott/tiger ou bien votre compte habituelle!!

Cliquez sur l'écran ci-dessous !!

Friday 20 May 2011

Insaller Oracle sous Linux

Insallation oracle 10g Express Edition sous Linux !

Installation de Oracle Database 10g Release 2 (10.2.0.1) Express Edition for Linux x86

Cliquer içi pour Télécharger Oracle10g Express Edition
Recuperation du paquet puis install:
vous pouvez avoir un probléme de taille de memoire alors redifinit la taille de la memoire:

root@debian:/mnt/programe# dd if=/dev/zero of=/tmp/swap bs=1M count=1024

Commencer l'installation

root@debian:/mnt/programe# dpkg -i oracle-xe-universal_10.2.0.1-1.0_i386.deb

Des erreurs ont ete rencontrees pendant l'execution?: oracle-xe-universal
.
. On corrige: Insallez le package libaio1 et oracle-xe-universal

root@debian:/mnt/programe# apt-get install libaio1 && dpkg -i oracle-xe-universal_10.2.0.1-1.0_i386.deb


ou bien en deux étapes:

root@debian:/mnt/programe# apt-get install libaio1

Parametrage de libaio1 (0.3.106-3) ...
installez oracle-xe

root@debian:/mnt/programe# dpkg -i oracle-xe-universal_10.2.0.1-1.0_i386.deb

Parametrage de oracle-xe-universal (10.2.0.1-1.0) ...
Executing Post-install steps...
You must run '/etc/init.d/oracle-xe configure' as the root user to configure the database.

root@debian:/usr/lib/oracle# /etc/init.d/oracle-xe configure

Oracle Database 10g Express Edition Configuration
.
=> J'accepte les options par defaut et specifie un mot de passe pour l'utilisateur SYSTEM.
Specify the HTTP port that will be used for Oracle Application Express [8080]:
Specify a port that will be used for the database listener [1521]:
Do you want Oracle Database 10g Express Edition to be started on boot (y/n) [y]:n
Starting Oracle Net Listener...Done
Configuring Database...Done
Starting Oracle Database 10g Express Edition Instance...Done
Installation Completed Successfully.

To access the Database Home Page go to "http://127.0.0.1:8080/apex"

root@debian:/usr/lib/oracle#

root@debian:/etc# netstat -lnp

Connexions Internet actives (seulement serveurs)
Proto Recv-Q Send-Q Adresse locale Adresse distante Etat
tcp 0 0 0.0.0.0:37 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:13 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN
.
.
Sockets du domaine UNIX actives(seulement serveurs)

Proto RefCpt Indicatrs Type Etat I-Node PID/Program name Chemin
unix 2 [ ACC ] STREAM LISTENING 9925 3017/tnslsnr /var/tmp/.oracle/sEXTPROC_FOR_XE
Un petit coup d'oeil sur les fichiers installes:

root@debian:/usr/lib/oracle/xe# ll

total 16
drwxr-xr-x 4 oracle dba 4096 2008-04-11 15:47 .
drwxr-xr-x 5 oracle oinstall 4096 2008-04-11 15:49 ..

root@debian:/usr/lib/oracle/xe# ll oradata/
total 12 drwxr-xr-x 3 oracle oinstall 4096 2008-04-11 15:47 .
drwxr-xr-x 4 oracle dba 4096 2008-04-11 15:47 ..
drwxr-x--- 2 oracle oinstall 4096 2008-04-11 15:49 XE

Testez la connexion à la base de donnée en tapant dans un navigateur web:

"http://127.0.0.1:8080/apex"

Ecran d'identification

Page d'acceuil Oracle Entrprise Manager

Saturday 30 April 2011

Création et manipulation de vue

les vues ont un apport considérable dans la manipulation des données sur les tables. une bonne conception des ces vues alors s'impose, pour bien gérer les vues et les comprendre,  voici un lien qui explique  leurs manipulation sous Oracle:
Les Vues sous Oracle  

Sunday 13 March 2011

ORACLE

 Pour télécharger les produits d'Oracle:
- Cliquez sur le lien suivant pour la base de donnée 11g:
  
-Cliquer sur ce lien pour la suite developper 10g

Saturday 5 March 2011

Gestion de transaction

Voila le code pour débloquer le compte de scott, entrez en mode administrateur: avec le compte Sys
SQL*PLUS

ALTER USER SCOTT IDENTIFIED BY TIGER  ACCOUNT UNLOCKED;