Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 29/12/2010, 23h25   #1
Invité de passage
 
Inscription : février 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 6
Points : 2
Points : 2
Par défaut valeur d'un linesize renseignée par un select

Bonjour à tous,

je tiens a dire d'abord que je suis patissier reconverti en teckos exploitation de base

Sinon j'ai beau chercher partout je ne trouve pas comment renseigner par un select une variable d'environnement comme le set linesize !!! Remarquez même au taf je n'ai trouvé personne pour me dire çà.

Je detaille un peu :

au taf dans le cadre d'export de table en fichier texte, on fixe la valeur du linesize "a la main" dans chaque script (lancé sous unix avec sqlplus sur oracle 10.2 g)

J'arrive "déjà" à récupérer dans une variable la longueur de ma ligne avec ce select dans du pl/sql:

Code :
1
2
3
4
5
6
 
SELECT sum(nvl(dataprecision,datalength)
AS MA_VARIABLE
FROM ALL_TAB_COLUMNS
WHERE owner = 'NOM_DU_OWNER'
AND TABLE_NAME = 'NOM_TABLE'
Alors après j'essaye de faire un

Code :
1
2
 
EXECUTE IMMEDIATE ('SET LINESIZE ' || MA_VARIABLE')
Et bien ca marche pas bien du tout !
J'ai un message d'erreur mais je suis à la maison et je n'ai pas accès à distance pour vous dire lequel.

Pourtant si je lance un script sous unix avec

Code :
1
2
 
sqlplus user/pwd @mon_script.sql ma_variable
et que mon script contient

Code :
1
2
3
4
 
SHOW linesize
SET linesize ma_variable
SHOW linesize
Et ben là çà marche bien

Donc je me dis que ca doit être possible de renseigner mon linesize directement avec le résultat d'un select affecté à une variable.

Je tiens à préciser même s'il y a des fautes de frappe ou de syntaxe ici dans mon message, au boulot ca marche bien quand je fais du pl/sql. je n'ai juste pas le script en question sous les yeux !

Est ce qu'un gourou peut me dire s'il est possible de renseigner par "variable" ou select une variable d'environnement ? Et si oui comment ?

Merci d'avance à tous et un grand bravo pour le site dont je me suis inspiré fréquemment.

D.
roto_plouf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 09h57   #2
Invité de passage
 
Inscription : février 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 6
Points : 2
Points : 2
Par défaut pas une réponse mais le script en question et l'erreur !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
SET serveroutput ON
SET echo ON
DECLARE
longueur_ligne number (6);
req_sample VARCHAR2(2048);
BEGIN
-- assigne la valeur dans la variable longueur_ligne
SELECT sum(nvl(data_precision,data_length))
INTO longueur_ligne
FROM ALL_TAB_COLUMNS
WHERE OWNER = 'MARKET'
AND TABLE_NAME = 'CBL29995';
--construction de la requete
req_sample := ' set linesize ' || longueur_ligne ;
-- affiche la variable
DBMS_OUTPUT.PUT_LINE ( 'Longueur Ligne : ' || TO_CHAR(longueur_ligne));
EXECUTE IMMEDIATE (req_sample);
END;
Si je désactive la ligne ca marche !
Sinon voici les erreurs qui apparaissent :

Code :
1
2
3
4
 
ERROR at line 1:
ORA-00922: missing OR invalid OPTION
ORA-06512: at line 15
roto_plouf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 12h46   #3
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
EXECUTE IMMEDIATE c'est pour executer des ordres DDL dans du PL/SQL et ça n'est pas ton besoin.
set linesize est une commande sqlplus, tu peux affecter une variable en utilisant NEW_VALUE

Exemple dans un fichier test2.sql:
Code :
1
2
3
4
5
6
7
8
9
10
11
SET serveroutput ON
SET echo ON
-- assigne la valeur dans la variable longueur_ligne
COLUMN longueur_ligne new_value longueur_ligne
SELECT sum(nvl(data_precision,data_length)) AS longueur_ligne
FROM ALL_TAB_COLUMNS
WHERE OWNER = 'SCOTT'
AND TABLE_NAME = 'EMP';
SHOW linesize 
SET linesize &longueur_ligne
SHOW linesize
et le résultat :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SQL> @test2.sql
SQL> COLUMN longueur_ligne new_value longueur_ligne
SQL> -- assigne la valeur dans la variable longueur_ligne
SQL> SELECT sum(nvl(data_precision,data_length)) AS longueur_ligne
  2  FROM ALL_TAB_COLUMNS
  3  WHERE OWNER = 'SCOTT'
  4  AND TABLE_NAME = 'EMP';
 
LONGUEUR_LIGNE
--------------
            50
 
SQL> SHOW linesize
linesize 80
SQL> SET linesize &longueur_ligne
SQL> SHOW linesize
linesize 50
SQL>
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 30/12/2010, 13h48   #4
Invité de passage
 
Inscription : février 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 6
Points : 2
Points : 2
Par défaut Ben alors je dis Bravo



Super !

Un grand merci à skuatamad en particulier !

Ta solution répond pleinement à mon besoin.
Je vais gagner un temps fou, j'ai environ 20 à 30 fichiers à
extraire par jour (et autant de scripts à modifier) et j'y passais
environ 3 heures !!!!!

Et je vais récupérer le principe pour d'autres besoins ...

Encore Merci !!!

Bonnes fêtes ...
roto_plouf 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 12h38.


 
 
 
 
Partenaires

Hébergement Web