Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#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 ! sad

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

 

Pied de page des forums

Powered by FluxBB