IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

script sql et passage de paramètres


Sujet :

Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut script sql et passage de paramètres
    Sous oracle 10g

    J'ai un souci avec un script sql auquel je passe des paramètres, dans ce script j'ai ce genre de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    grant SELECT on TABLE_CONSTRAINTS to ROL_&5_TOTO;
    où &5 est le 5ème paramètre passé au script.

    Il s'avère que quand le script passe sur cette commande, il repasse en mode interactif et réclame &5 et supprime la fin de la commande (après &5), d'où plantage.

    Comment remédier à ce pb sans passer par un execute immediate ?

    Cordialement.

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Bonsoir

    Dans un environnement SQL*Plus standard, le caractère & signale le début du nom d'une variable (positionnelle ou de substitution).
    Mais il faut aussi un moyen d'identifier la fin de ce nom.

    Certains caractères sont considérés comme des terminateurs implicites du nom de la variable. Outre le saut de ligne et l'espace, on peut citer :
    ; / \ : *

    Mais le tiret de soulignement (_) ne fait pas partie de ces terminateurs implicites. Dans votre cas, cela signifie que "&5_TOTO" est considéré comme le nom d'une variable.
    Il faut alors utiliser un moyen explicite pour indiquer que votre variable s'arrête à 5. C'est justement le rôle du caractère de concaténation, qui, par défaut, est le point.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SQL> show concat
    concat "." (hex 2e)
    Si vous transformez votre commande comme suit, tout rentrera dans l'ordre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    grant SELECT on TABLE_CONSTRAINTS to ROL_&5._TOTO;
    Contrairement aux terminateurs implicites, qui sont affichés tels quels, l'opérateur de concaténation est "muet" : il n'apparaît pas à l'affichage.

    Si l'on veut concaténer une variable avec un point, il faut donc doubler le point. Le premier représente l'opérateur de concaténation, alors que le second a sa pleine valeur de caractère affichable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL> set VERIFY ON
    SQL> define SCHEMA=SYSTEM
    SQL> define TABLE=TEST
    
    SQL> select count(*) from &SCHEMA..&TABLE;
    ancien   1 : select count(*) from &SCHEMA..&TABLE
    nouveau   1 : select count(*) from SYSTEM.TEST
    
    COUNT(*)
    -------
          9

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut
    Merci beaucoup !!!!!!!!!!!!!
    Faut-il préciser en début de script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SHOW concat
    concat "." (hex 2e)

    Bon, j'essaierai avec/sans pour voir ce qui marche.

    Je pensais que || était la concaténation.

    Merci encore.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut
    PS : J'ai aussi dans mon scriptsql paramétré, des commandes du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update cd_fdw_structure set table_name=upper('ROL_&1._INT_TMP') where object_type='APPLICATION_ROLE' and standard_custom='S' and table_name like upper('ROL_%_TMP') and table_name<>upper('ROL_&1._INT_TMP');
    où le paramètre &1 est entre '', j'ai l'impression en voyant défilé les commandes à l'écran (script appelé par un .bat) qu'il ne remplace pas le paramètre &1. par la bonne valeur mais par la valeur 1.

    Me trompé-je ?

    Cordialement.

  5. #5
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Normalement ça marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SQL> SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME = 'TEST&1._TMP';
    Entrez une valeur pour 1 : 2
    ancien   1 : SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME = 'TEST&1._TMP'
     
    nouveau   1 : SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME = 'TEST2_TMP'
     
    TABLE_NAME
    ------------------------------
    TEST2_TMP

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut
    ok c'est bon !

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut
    En fait c'est pas tout à fait bon, dans un script le passage du paramètre se passe mal, dans un fichier trace du script j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ancien   1 : update cd_fdw_structure set table_name=upper('ROL_&1._REP_RO') where object_type='APPLICATION_ROLE' and standard_custom='S' and table_name like upper('ROL_%_REP_RO') and table_name<>upper('ROL_&1._REP_RO')
    nouveau   1 : update cd_fdw_structure set table_name=upper('ROL_1_REP_RO') where object_type='APPLICATION_ROLE' and standard_custom='S' and table_name like upper('ROL_%_REP_RO') and table_name<>upper('ROL_1_REP_RO')


    Il remplace &1. par '1' au lieu de la valeur passée.

    Y a-t-il des commandes oracle dans un script qui font perdre la valeur des paramètres passés ? (déconnexion, ...).

    Bizarre, bizarre, dans la plupart des cas la substitution des paramètres se passe bien.

    Il y a surement quelque chose qui m'échappe !

    Cordialement.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut
    bon je crois que j'ai un début de réponse, ce script appelle à son tour d'autres scripts en leur passant des paramètres, au retour de l'appel de ces scripts les paramètres initiaux (passés au script principal) auraient changé et pris les valeurs des paramètres passés aux scripts "secondaires" appelés. Faudrait peut-être passer par des variables globales renseignées dès le début du script pour ne pas perdre leurs valeurs. On va essayer ça !!

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut
    Bon c'est effectivement ce que je craignais, Oracle se paume entre les paramètres en entrée du script et les paramètres des scripts appelés par le script principal, ex :

    toto = 1;
    tata = 2;
    titi = 3;

    scriptPrincipal toto tata titi;
    @script2nd1 0 3
    @script2nd2 0 1

    Au retour de script2nd2, toto (=&1) vaut 0 et tata (=&2) vaut 1.

    Eh oui.........

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/05/2014, 14h49
  2. [Script SQL] Passage comme paramètre du nom de la base de données
    Par kha_yassine dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 08/11/2013, 17h45
  3. Réponses: 0
    Dernier message: 29/01/2010, 14h13
  4. VB,SQl et passage de paramètre
    Par christian_manzoni dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 07/07/2006, 15h45
  5. Réponses: 7
    Dernier message: 10/02/2005, 13h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo