Imprimer Imprimer

Problème export SQL avec SQL Developer

scripts et trucs pas de Commentaire »

SQLDeveloper présente une fonctionalité fort sympatique , il permet d’exporter au format SQL tout ou partie de la base, d’un schema , d’une table, ou d’une table filtrée.
Et on peut mettre ca dans le presse papier ou dans un fichier.
Ca s’appelle faire du reverse Engineering et c’est beau.
On peut s’en servir pour migrer des données d’Oracle à Oracle, ou d’Oracle vers d’autres SGBDRs…

Pour l’export de tables , il crée des ‘INSERT’ …mais malheureusement les valeurs sont séparées par des ‘espaces’.
Plus précisément la clause ‘VALUES’ de l’INSERT au lieu d’utiliser des valeurs séparés par des ‘,’ utilise le séparateur de groupe pour afficher des numériques.

Ce bug apparait notamment avec la version SQL Developer 1.51

Pour y remédier et mettre des ‘,’ comme en SQL (!).
Il faut changer le parametre NLS séparateur de groupe par défaut :

Sous sql developer
clic -> tools -> preferences -> Database -> NLS Parameters
puis Mettre le séparateur decimal à “.” et le separateur de groupe à “,”

PS : prendre en compte que cela affectera vos affichages de (gros) numériques…

Imprimer Imprimer

utilisation des tables externes

Divers, scripts et trucs pas de Commentaire »

Un exemple de script pour gérer et utiliser des tables externes Oracle (external tables)

On va charger emp a partir d’un fichier externe CSV, en utilisant SQL et les tables externes Oracle ( Oracle 9i, Oracle 10g et + si affinités )

D’abord, creer un repertoire oracle de travail (Oracle directory) associé au repertoire ou se trouve le fichier d’entree.
Pour ce faire, SCOTT doit avoir le privilège Systeme ‘CREATE ANY DIRECTORY’
…et le CREATE TABLE bien sur !

sous SQL>

CONNECT SYSTEM/xx@db
GRANT CREATE ANY DIRECTORY TO scott;
CONNECT scott/tiger@db
create or replace directory dossier_temp as ‘/tmp’;
drop table table_externe_emp;

rem : si le user qui lit/ecrit dans la directory n’est pas celui qui l’a créé
(ici c’est SCOTT qui fait tout), ce uyser aura aussi besoin des droitsd R/W sur la directory :

SQL> grant read,write on directory dossier_temp to scott;

Créer une ‘table’ externe attachee au fichier d’entree

create table table_externe_emp
(EMPNO NUMBER(4) ,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7, 2),
COMM NUMBER(7, 2),
DEPTNO NUMBER(2)
)
ORGANIZATION EXTERNAL
( type oracle_loader
default directory dossier_temp
access parameters
( records delimited by newline
badfile ‘charge_emp.bad’
logfile ‘charge_emp.log’
fields terminated by ‘,’
(empno, ename, job, mgr, hiredate date, sal, comm, deptno)
)
location (’emp.csv’)
)
– attention c’est important sinon ca marche moins bien !
reject limit unlimited
/

Lire la table externe

select * from table_externe_emp;

!! Attention en cas de problème regardez les fichiers LOG et BAD sur le serveur

– lecture table externe et INSERTION dans une autre cible
– on insère dans la table destination si elle existe

insert into mon_emp
select * from table_externe_emp;
commit;

– lecture table externe et CREATION/INSERTION dans une autre cible
– on peut aussi pour aller + vite recopier la table externe ET son contenu !

create table mon_emp
as select * from table_externe_emp;

Imprimer Imprimer

Calculer les statistiques pour tous les objets d’un schema

Divers, scripts et trucs pas de Commentaire »

Si l’optimiseur est un peu fatigué et que les requetes sql ne sont pas meix on peut toujours essayer d’aider le dit optimiseur en recalculant les statistiques pours tous les objets du schema.

Il existe un package Oracle pour ca en 9i et 10g, plutot que de faire de fastidieux ANALYZE TABLE…COMPUTE .

C’est DBMS_STATS et la procedure GATHER_SCHEMA_STATS

begin
dbms_stats.gather_schema_stats(’&OWNER’,DBMS_STATS.AUTO_SAMPLE_SIZE,false,
‘FOR ALL COLUMNS SIZE AUTO’,1,’GLOBAL’,true,null,null,’GATHER AUTO’);
end;
/

ou plus simplement (en utilisant les valeurs par defaut des parametres :

execute dbms_stats.gather_schema_stats(ownname=>’nom_du_proprietaire’);

Pour plus d’infos sur le paramétrage voir la doc officielle PL/SQL supplied packages

et la procedure GATHER_SCHEMA_STATS du package DBMS_STAT

Bonnes stats !