Oracle : WRAP obsfucation PL/SQL

parfois on a besoin de distribuer du code PL/SQL sans exposer le code source, pour cela Oracle propose un utilitaire autonome qui masque le code source en le convertissant en code portable, le code resultant est independant de la plate forme,permet un chargement et une liaison dynamique, la syntaxe est simple :
C:\>wrap iname=proc.sql oname=proc.plb
PL/SQL Wrapper: Release 9.2.0.1.0- Production on Lu Jan 11 15:18:35 2010
Copyright (c) Oracle Corporation 1993, 2001. All Rights Reserved.
Processing proc.sql to proc.plb
C:\>

le fichier proc.sql contient le code suivant :
create or replace procedure hello is
begin
dbms_output.put_line('Appel de procedure');
end;
/

une fois le fichier converti on l'appel comme n'importe quel fchier sql :
SQL> @c:\proc.plb
Procédure créée.
SQL> set serveroutput on
SQL> exec hello
Appel de procedure

Procédure PL/SQL terminée avec succés.
SQL>

vous pouvez consulter la vue user_source pour voire le code source converti de la procedure,c'est la meme chose que vous trouverez dans le fichier plb.
SQL> col name format a10
SQL> set pagesize 1000
SQL> col text format a30
SQL> set linesize 1000
SQL> select NAME,TYPE,TEXT from user_source where NAME='HELLO';
NAME TYPE TEXT
HELLO PROCEDURE procedure hello wrapped


0


abcd


abcd


abcd


abcd


abcd


abcd


abcd


abcd


abcd


abcd


abcd


abcd


abcd


abcd


abcd


3


7


9200000


1


4


0


4


2 :e:


1HELLO:


1DBMS_OUTPUT:


1PUT_LINE:


1Appel de procedure:


0





0


0


14


2


0 9a b4 55 6a :2 a0 6b 6e


a5 57 b7 a4 b1 11 68 4f


1d 17 b5


14


2


0 3 17 18 1c 20 24 28


2b 30 31 36 38 3c 3e 4a


4e 50 51 5a


14


2


0 b 0 :3 1 :2 d 16 :b 1


14


4


0 1 0 :2 1


:6 3 :2 2 :7 1


5c


4


:3 0 1 :a 0 f


1 :8 0 2 :2 0


f 1 3 :2 0


2 :3 0 3 :3 0


5 6 0 4


:4 0 3 7 9


:2 0 b 5 e


:3 0 e 0 e


d b c :6 0


f :2 0 1 3


e 12 :3 0 11


f 13 :8 0


7


4


:3 0 1 8 1


a


1


4


0


12


0


1


14


1


1


0 0 0 0 0 0 0 0


0 0 0 0 0 0 0 0


0 0 0 0


1 0 1


0



Oracle : clause returning

Supposons que vous voulez faire un update sur un enregistrement et par la même occasion récupérer d'autres champs dont vous avez besoin dans votre application la solution la plus répondue et de faire un update puis un select, si vous avez 4000 enregistrements vous aurez 4000 select et 4000 update.
La clause RETURNING méconnue dans les instructions update et delete dans oracle permet de faire la même chose mais dans une seule instruction update, un exemple simple la table suivante :

SQL> select * from études;

ID MAT PROF
1 maths kats
3 physiques jay
2 arabe kamel
4 français hector
5 philo hartz
6 sport ramboo


6 ligne(s) sélectionnée(s).

On déclare une variable attachée nom ou on va récupérer le champ prof et on ajoute la clause returning à l'instruction update.

SQL> variable nom varchar2(20);
SQL> update études
2 set prof='hantz'
3 where id=5
4 returning prof into :nom;
1 ligne mise à jour.

Et :
SQL> print :nom
NOM
---------------------------------
hartz

Vous pourrez récupérer plusieurs champs tant qu'il y a des variables, la clause returning marche aussi avec l'instruction delete.

SQL> delete etudes
2 where id=6
3 returning prof into :nom;
1 ligne supprimée.

SQL> print :nom
NOM
---------------------------------
ramboo

Oracle : le paramètre DIAGNOSTIC_DEST

à partir de la version 11g d'oracle les parameteres d'initialistation suivants sont obsolets :
BACKGROUND_DUMP_DEST
USER_DUMP_DEST
CORE_DUMP_DEST
ils ont été remplacés par le parametere d'initialistation DIAGNOSTIC_DEST :
> show parameters diagnostic_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
diagnostic_dest string /data/oracle


ce parameter donne le chemin du ADR (AUTOMATIC DIAGNOSTIC REPOSITORY);il contient toute sorte de fichiers de diagnostique (les fichiers traces,les dumps ,le fichier alerte...), utilisé aussi par plusieurs composants oracle comme le listenenr et l'ASM.
s'il n'est pas définit lors de la creation de la base DIAGNOSTIC_DEST prend la valeur ORACLE_BASE/diag si ORACLE_BASE n'est pas définit alors DIAGNOSTIC_DEST prend la valeur ORACLE_HOME/log.
une vue utile rassemblant les chemins utils lors d'un diagnostique est la vue v$DIAG_INFO :
SELECT * FROM V$DIAG_INFO;
INST_ID NAME VALUE
---------- -------------------------------------------------- --------------------------------------------------
1 Diag Enabled TRUE
1 ADR Base /data/oracle
1 ADR Home /data/oracle/diag/rdbms/db11/db11
1 Diag Trace /data/oracle/diag/rdbms/db11/db11/trace
1 Diag Alert /data/oracle/diag/rdbms/db11/db11/alert
1 Diag Incident /data/oracle/diag/rdbms/db11/db11/incident
1 Diag Cdump /data/oracle/dbs
1 Health Monitor /data/oracle/diag/rdbms/db11/db11/hm
1 Default Trace File /data/oracle/diag/rdbms/db11/db11/trace/db11_ora_9757.trc
1 Active Problem Count 1
1 Active Incident Count 1

11 ligne(s) selectionnee(s).