Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/01/2012, 17h01   #1
Membre confirmé
 
Avatar de awalter1
 
Inscription : août 2004
Messages : 665
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 665
Points : 232
Points : 232
Par défaut Limitation de 2000 car dans une ligne retournée par sql

Bonjour,
Je ne sais pas si ma question concerne oracle ou sqlplus (j'ai fait un post similaire pour sqlplus).
J'exécute sous sqlplus un script sql qui produit en sortie un fichier XML. J'utilise pour cela la fonctionnalité XML d'oracle. Voici mon script sql simplifié:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
set pagesize 0
set line 2000
set head off
set echo off
set feedback off
set verify off
set termout off
SET HEAD OFF
SET LONG 2000 

SPOOL &1
SELECT
XMLELEMENT("gml:featureMember",
XMLELEMENT("SECTOR",
   XMLELEMENT("GDO_GEOMETRY", 
         XMLELEMENT("gml:Polygon", 
            XMLELEMENT("gml:outerBoundaryIs", 
               XMLELEMENT("gml:LinearRing",     
                  XMLELEMENT("gml:coordinates",ops$ope.gmlpos.GetCoordStringFromVol(se_vol.AIRSPACE_ENV_NAME,se_vol.VOLUME_NAME)
                  )
               )
            )
         )
     )   
   )) FROM r_se_vol se_vol, CTL_AREA se, VOLUME vo;
SPOOL OFF
exit;
La directive gml:coordinates fait appel à une procédure stockée (en vert), celle ci renvoie une chaine de caractères (au maximum de 4000 car.). La ligne XML correspondante (dans le fichier SPOOL) est tronquée à 2000 car !!!
Même si je fais , la troncature est toujours à 2000. D"ou vient cette limitation ? Est t'elle connue ? Comment faire ?

Merci de votre aide
awalter1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 20h00   #2
Membre Expert
 
Avatar de pachot
 
Homme Franck Pachot
DBA Oracle
Inscription : novembre 2007
Messages : 709
Détails du profil
Informations personnelles :
Nom : Homme Franck Pachot
Âge : 41
Localisation : Suisse

Informations professionnelles :
Activité : DBA Oracle
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2007
Messages : 709
Points : 1 652
Points : 1 652
Bonjour
C'est cela qui limite la taille du XML lu.
Cordialement,
Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
pachot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 23h20   #3
Membre confirmé
 
Avatar de awalter1
 
Inscription : août 2004
Messages : 665
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 665
Points : 232
Points : 232
oui, j'avais oublié le sens de cette directive, mais je l'ai aussi augmenté à 3000, j'ai toujours la troncature à 2000.
Cordialement
awalter1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 11h03   #4
Membre confirmé
 
Avatar de awalter1
 
Inscription : août 2004
Messages : 665
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 665
Points : 232
Points : 232
J'ai trouvé en effet sur d'autres forums que la directive LONG définit la longueur max retournée. Je constate qu'en mettant
Code :
1
2
3
SET long 20
SET long 50
SET long 500
l'output est bien tronqué au maximum de la directive LONG, mais si je l'augmente à 3000 ou 20000 j'ai toujours une troncature précise à 2000.
Cordialement
awalter1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 11h10   #5
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 688
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 688
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
C'est peut-être lié à votre version, quelles sont les versions d'Oracle et de SQL*Plus ?

Sinon un coup de google m'envoie sur ces paramètres, je n'ai aucune idée s'ils répondent à vos besoin, enfin ça vaut le coup d'essayer :
Code :
1
2
3
4
5
6
7
8
9
SET ECHO OFF
SET NEWPAGE 0
SET SPACE 0
SET LONG 1999999
SET PAGESIZE 0
SET FEEDBACK OFF
SET HEADING OFF
SET TRIMSPOOL ON
SET TERMOUT OFF
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 11h19   #6
Membre confirmé
 
Avatar de awalter1
 
Inscription : août 2004
Messages : 665
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 665
Points : 232
Points : 232
Dans le cas ou j'ai SET LONG 3000, je n'ai pas de troncature en fait mais une fin de ligne au 2000ème caractère comme ceci:
Code :
1
2
<gml:featureMember><SECTOR><GDO_GEOMETRY><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates> 5.1302777778,46.325 5.1333333333,5.15,46.3833333333</gml:coordinates></gml:LinearRing></gml:oute     
rBoundaryIs></gml:Polygon></GDO_GEOMETRY></SECTOR></gml:featureMember>
Ce qui fait qu'après le parser XML voit une erreur de syntaxe. Je rappelle que j'ai bien SET LINE 3000, il doit y avoir alors une autre limitation ...
Merci
awalter1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 12h00   #7
Membre confirmé
 
Avatar de awalter1
 
Inscription : août 2004
Messages : 665
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 665
Points : 232
Points : 232
Voici mes versions d'oracle/outils :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
> sqlplus ....
 
SQL*Plus: Release 10.2.0.1.0 - Production ON Fri Jan 27 11:57:47 2012
 
Copyright (c) 1982, 2005, Oracle.  ALL rights reserved.
Connected TO:
Oracle DATABASE 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
WITH the Partitioning, OLAP, DATA Mining AND Real Application Testing options
 
SQL> SELECT * FROM v$version;
 
BANNER
----------------------------------------------------------------
Oracle DATABASE 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS FOR Solaris: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production
 
SQL>
Sinon j'ai essayé les paramètres proposés : pas de changement.
Cordialement


Citation:
Envoyé par Waldar Voir le message
C'est peut-être lié à votre version, quelles sont les versions d'Oracle et de SQL*Plus ?

Sinon un coup de google m'envoie sur ces paramètres, je n'ai aucune idée s'ils répondent à vos besoin, enfin ça vaut le coup d'essayer :
Code :
1
2
3
4
5
6
7
8
9
SET ECHO OFF
SET NEWPAGE 0
SET SPACE 0
SET LONG 1999999
SET PAGESIZE 0
SET FEEDBACK OFF
SET HEADING OFF
SET TRIMSPOOL ON
SET TERMOUT OFF
awalter1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 12h16   #8
Membre confirmé
 
Avatar de awalter1
 
Inscription : août 2004
Messages : 665
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 665
Points : 232
Points : 232
TROUVE TROUVE TROUVE TROUVE TROUVE TROUVE TROUVE TROUVE TROUVE



la solution : mettre la directive :
Code :
COLUMN col format a3000
et mettre col en pseudo colonne :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
XMLELEMENT("gml:featureMember",
XMLELEMENT("SECTOR",
   XMLELEMENT("GDO_GEOMETRY", 
         XMLELEMENT("gml:Polygon", 
            XMLELEMENT("gml:outerBoundaryIs", 
               XMLELEMENT("gml:LinearRing",     
                  XMLELEMENT("gml:coordinates",ops$ope.gmlpos.GetCoordStringFromVol(se_vol.AIRSPACE_ENV_NAME,se_vol.VOLUME_NAME)
                  )
               )
            )
         )
     )   
   )) col FROM r_se_vol se_vol, CTL_AREA se, VOLUME vo;
awalter1 est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 27/01/2012, 12h49   #9
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 688
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 688
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Dans la documentation Oracle, j'ai trouvé ce passage :
Citation:
The default width of datatype columns is the width of the column in the database. The column width of a LONG, CLOB, NCLOB or XMLType defaults to the value of SET LONGCHUNKSIZE or SET LONG, whichever is the smaller.
Ça vaut le coup de réessayer sans toucher à la colonne avec en plus :
Code :
SET LONGCHUNKSIZE 1999999
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/01/2012, 13h25   #10
Membre Expert
 
Avatar de pachot
 
Homme Franck Pachot
DBA Oracle
Inscription : novembre 2007
Messages : 709
Détails du profil
Informations personnelles :
Nom : Homme Franck Pachot
Âge : 41
Localisation : Suisse

Informations professionnelles :
Activité : DBA Oracle
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2007
Messages : 709
Points : 1 652
Points : 1 652
Bonjour,

Exact. Pour afficher tous les caractères il faut:
  1. que sqlplus récupère tout -> c'est le SET LONG qui est par défaut à 80
  2. que la ligne puisse tout afficher tout sans tronquer -> c'est le SET LINESIZE qui est par défaut à 80
  3. que la colonne puisse tout afficher sans tronquer -> c'est le COLUMN FORMAT qui est par défaut à la valeur du LONCHUCKSIZE ... qui est par défaut à 80
Donc pour afficher au moins 2000 caractèes, après avoir fait SET LONG 2000 LINESIZE 2000 il faut:
  • COLUMN ... FORMAT 2000
  • ou SET LONGCHUNCKSIZE 2000
Si on met LONGCHUNCKSIZE à 2000 il va tout chercher d'un coup. Si on le laisse à 80 il va faire 2000/80=25 aller-retours.

Cordialement,
Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
pachot est déconnecté   Envoyer un message privé Réponse avec citation 60
Vieux 28/01/2012, 11h53   #11
Membre confirmé
 
Avatar de awalter1
 
Inscription : août 2004
Messages : 665
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 665
Points : 232
Points : 232
Merci pour ces précisions
awalter1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h39.


 
 
 
 
Partenaires

Hébergement Web