#1 Tue 28 July 2009 14:00
- Pierre
- DesCartesPourUnMondeMeilleur
- Date d'inscription: 22 Sep 2005
- Messages: 1643
[ORACLE]:select sur une liste de table
Aloha
Je cherche à vérifier le bon état des géométries des objets d'une liste de table.
Quelqu'un a-t'il déjà une requête ?
J'ai testé ceci :
Code:
SELECT GID, SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(GEOMETRY,10) FROM ( SELECT table_name FROM all_tables WHERE lower(table_name) LIKE 'pp_%' AND lower(table_name) NOT LIKE '%_relation' ) WHERE SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(GEOMETRY,10)!='TRUE';
Cela ne fonctionne évidemment pas (un select from select... :( ).
Quelqu'un a-t'il une idée ?
D'avance merci,
art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.
Hors ligne
#2 Tue 28 July 2009 15:35
- Cartosig
- Participant assidu
- Date d'inscription: 16 Oct 2006
- Messages: 222
Re: [ORACLE]:select sur une liste de table
Je pense que vous êtes obligé d'utiliser PL/SQL pour réaliser ce traitement.
Hors ligne
#3 Tue 28 July 2009 15:46
- François
- Membre
- Lieu: Grenoble
- Date d'inscription: 4 Apr 2007
- Messages: 257
Re: [ORACLE]:select sur une liste de table
Bonjour,
Votre requête n'aboutit probablement pas à cause des select imbriqués qui demandent un temps d'execution trop long.
Avant de passer en PL/SQL, j'essayerais de remplacer le select imbriqué
Code:
SELECT table_name FROM all_tables WHERE lower(table_name) LIKE 'pp_%' AND lower(table_name) NOT LIKE '%_relation' )
par une clause
Code:
WHERE EXISTS
qui je crois optimise le temps de traitement.
Cordialement
François
Hors ligne
#4 Tue 28 July 2009 18:09
- Cartosig
- Participant assidu
- Date d'inscription: 16 Oct 2006
- Messages: 222
Re: [ORACLE]:select sur une liste de table
Je pense que vous n'êtes pas sur la bonne piste sisyphe !
Il ne s'agit pas d'un problème de perfs (la table SYS.ALL_TABLES est généralement très petite, si c'est bien de celle-là qu'il s'agit) mais d'un problème de construction de la requête :
Pour que la clause
Code:
WHERE SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(GEOMETRY,10)!='TRUE'
fonctionne, il faut que le 1er select pointe sur la table à valider elle-même et non pas sur le nom de la table qui sera renvoyé par le select imbriqué.
Donc je pense que la seule solution est bien de faire un curseur PL/SQL qui renvoie le nom de chaque table a valider...
Dernière modification par Cartosig (Tue 28 July 2009 18:09)
Hors ligne
#5 Tue 28 July 2009 19:59
- François
- Membre
- Lieu: Grenoble
- Date d'inscription: 4 Apr 2007
- Messages: 257
Re: [ORACLE]:select sur une liste de table
Autant pour moi !!!!
J'ai mal lu la requête !
Cordialement.
François
Hors ligne
#6 Wed 29 July 2009 09:52
- Pierre
- DesCartesPourUnMondeMeilleur
- Date d'inscription: 22 Sep 2005
- Messages: 1643
Re: [ORACLE]:select sur une liste de table
Merci Cartosig, mais cela ne m'aide pas beaucoup. Auriez-vous un exemple de curseur PL/SQL ?
art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.
Hors ligne
#7 Wed 29 July 2009 11:22
- Cartosig
- Participant assidu
- Date d'inscription: 16 Oct 2006
- Messages: 222
Re: [ORACLE]:select sur une liste de table
Voici un exemple basique : http://www.fast-track.cc/t_easyoracle_p … r_loop.htm
Il suffit de vous en inspirer pour boucler sur la liste des tables a valider et réaliser votre traitement dans la boucle For ... Loop.
La petite difficulté si vous n'êtes pas habitué au PL/SQL sera de construire l'instruction de traitement en SQL dynamique via EXECUTE IMMEDIATE.
Hors ligne
#8 Wed 29 July 2009 14:30
- Pierre
- DesCartesPourUnMondeMeilleur
- Date d'inscription: 22 Sep 2005
- Messages: 1643
Re: [ORACLE]:select sur une liste de table
Quelque chose dans ce style ?
Code:
DECLARE CURSOR c8 IS SELECT 'A_REIMS.' || table_name l_name FROM all_tables WHERE LOWER (table_name) LIKE 'ca\_%' ESCAPE '\' AND LOWER (table_name) NOT LIKE '%_relation' ; BEGIN FOR r_c8 IN c8 LOOP EXECUTE IMMEDIATE 'SELECT ''SelectionAjouterObjet ObjetOracleVersApic "'' r_c8 ''"||GID as COMMANDE, GID as ID, SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(GEOMETRY,1) as erreur from r_c8 WHERE SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(GEOMETRY,1)!= ''TRUE'' ;' ; END LOOP; END;
Qui ne fonctionne pas.
art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.
Hors ligne
#9 Wed 29 July 2009 15:06
- Cartosig
- Participant assidu
- Date d'inscription: 16 Oct 2006
- Messages: 222
Re: [ORACLE]:select sur une liste de table
Oui tout à fait, le curseur est à mon avis bon par contre j'ai un doute sur la string SQL. Essayez de la printer avec DBMS_OUTPUT pour vérifier qu'elle est correcte (il y a peu être un problème au niveau des quotes et des concaténations).
Et si ca ne fonctionne pas donnez votre numéro d'erreur Oracle.
Hors ligne
#10 Wed 29 July 2009 16:20
- Pierre
- DesCartesPourUnMondeMeilleur
- Date d'inscription: 22 Sep 2005
- Messages: 1643
Re: [ORACLE]:select sur une liste de table
J'ai essayé ceci :
Code:
DECLARE CURSOR c8 IS SELECT 'A_REIMS.' || table_name l_name FROM all_tables WHERE LOWER (table_name) LIKE 'ca\_%' ESCAPE '\' AND LOWER (table_name) NOT LIKE '%_relation'; BEGIN FOR r_c8 IN c8 LOOP DBMS_OUTPUT.put_line(r_c8.l_name); END LOOP; END; /
Mais si j'ai bien un "Statement:29/07/2009 16:15:44 0:00:00.109: Executed Successfully" sybillin en résultat, je n'ai pas d'affichage de ligne.
Et dans sqlplus, je n'ai pas plus de résultat.
Sinon auparavant, l'erreur était :
"Error 29/07/2009 16:13:09 0:00:00.531 Toad for Data Analysts: ORA-06550: line 11, column 19:
PLS-00103: '"||GI" to continue.
" was substituted for "SELECT 'SelectionAjouterObjet ObjetOracleVersApic "' r_c8 '"||GI" to continue.
" was substituted for "SELECT 'SelectionAjouterObjet ObjetOracleVersApic "' r_c8 '"||GI" t 1 261
"
Et effectivement les quotes sont problématiques mais comme je me souhaite créer une chaîne de caractère qui est une instruction APIC, j'ai besoin de ces quotes.
Correction.
J'ai essayé ce code :
Code:
SET SERVEROUTPUT ON; DECLARE CURSOR c8 IS SELECT 'A_REIMS.' || table_name l_name FROM all_tables WHERE LOWER (table_name) LIKE 'ca\_%' ESCAPE '\' AND LOWER (table_name) NOT LIKE '%_relation'; BEGIN DBMS_OUTPUT.ENABLE( 1000000 ) ; FOR r_c8 IN c8 LOOP DBMS_OUTPUT.put_line('SELECT GID as ID, SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(GEOMETRY,100) as erreur from '||r_c8.l_name||' WHERE SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(GEOMETRY,100)!=''TRUE'';'); END LOOP; END; /
Et cela fonctionne. Mais dans TOAD, pas de sortie, pas de listing...
Dernière modification par Pierre (Wed 29 July 2009 16:52)
art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.
Hors ligne
#11 Wed 29 July 2009 17:27
- Cartosig
- Participant assidu
- Date d'inscription: 16 Oct 2006
- Messages: 222
Re: [ORACLE]:select sur une liste de table
[Edit] oops je n'avais pas vu la 1ere ligne de code ^^
Vous avez fait un "set serveroutput on" dans votre session ?
Sous Sql*Plus je n'ai le retour de DBMS_OUTPUT que si j'ai passé cette commande avant...
Sinon on peut toujours spooler avec UTL_FILE, je reconnais que c'est un peu pénible...
Dernière modification par Cartosig (Wed 29 July 2009 17:34)
Hors ligne
#12 Thu 30 July 2009 09:35
- Pierre
- DesCartesPourUnMondeMeilleur
- Date d'inscription: 22 Sep 2005
- Messages: 1643
Re: [ORACLE]:select sur une liste de table
Comment fais-je pour exécuter la commande que je mets dans le buffer ?
art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.
Hors ligne
#13 Thu 30 July 2009 11:23
- Cartosig
- Participant assidu
- Date d'inscription: 16 Oct 2006
- Messages: 222
Re: [ORACLE]:select sur une liste de table
Le code que vous avez proposé est bon dans sa logique.
L'instruction SQL dynamique est éxécutée par le EXECUTE IMMEDIATE.
Code:
DECLARE CURSOR c8 IS SELECT 'A_REIMS.' || table_name l_name FROM all_tables WHERE LOWER (table_name) LIKE 'ca\_%' ESCAPE '\' AND LOWER (table_name) NOT LIKE '%_relation' ; BEGIN FOR r_c8 IN c8 LOOP EXECUTE IMMEDIATE 'SELECT ''SelectionAjouterObjet ObjetOracleVersApic "'' r_c8 ''"||GID as COMMANDE, GID as ID, SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(GEOMETRY,1) as erreur from r_c8 WHERE SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(GEOMETRY,1)!= ''TRUE'' ;' ; END LOOP; END;
Mais il faut résoudre le problème de construction de la string SQL pour corriger les erreurs retournées.
Les doubles quotes doivent pouvoir être inclues sans provoquer d'erreur si elles sont correctement encapsulées par des simple quotes (ce qui n'est pas le cas dans votre exemple a mon avis).
1. Validez votre string SQL définitivement pour 1 table en corrigeant les erreurs de quotes (la string que vous utilisez pour DBMS_OUTPUT est correcte)
2. Utilisez le curseur comme dans l'exemple pour boucler sur les noms de tables
Hors ligne