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

PL/SQL Oracle Discussion :

Utilisation d'un paramètre dans plusieurs 'select' [11g]


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juin 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2019
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Utilisation d'un paramètre dans plusieurs 'select'
    J'essaie actuellement de déclarer un paramètre où je peux l'utiliser dans plusieurs select. Lorsque j'essaie de lancer la requête ci dessous, plusieurs erreurs apparaissent, notamment:
    declare
    Bon NUMBER(20) default &1;
    15:09:11 [DECLARE - 0 rows, 0.006 secs] [Code: 6550, SQL State: 65000] ORA-06550: Ligne 2, colonne 42 :
    PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

    . ( * @ % & = - + ; < / > at in is mod remainder not rem
    <exposant (**)> <> or != or ~= >= <= <> and or like like2
    like4 likec between || indicator multiset member submultiset
    Voici la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    declare
                    Bon NUMBER(20) := &1; --Exemple : 12345678
                    rec1 BonTable%rowtype;
                    rec2 BonTable2%rowtype;
    begin
                    select * into rec1  from BonTable
                    where BonChamp = Bon
                    and BonChamp2 = 'FBON'
                    and BonChamp3 is not null;
     
                    select * into rec2 from BonTable2
                    where BonChamp4 = Bon
                    and rownum = 1;
    end;
    Avez-vous une idée ou me guider vers la bonne voix, s'il vous plaît? A savoir que je suis sous DbVisualizer

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 790
    Points
    30 790
    Par défaut
    Est-ce qu'un paramètre est passé au script SQL lors de son exécution ?
    En cas d'absence de celui-ci, le script ne peut en effet pas s'exécuter correctement.

    Il y a une manière de contourner ce risque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bon NUMBER(20) := to_number(coalesce("&1", -1));
    Et si la valeur du paramètre n'est pas numérique, un message d'erreur le dira.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juin 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2019
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Effectivement oui un paramètre est passé lorsque j'exécute ma requête, exemple : 12345789 (de cette longueur la)
    Par contre, quand je renseigne ce que tu m'as mis en bout de code et que je l'exécute, cela ne me propose plus de renseigner de valeur (du fait que le &1 soit entre guillemet je pense). Il me met toujours le même message d'erreur malheureusement, et je comprend pas pourquoi il me dit que le caractère de fin ';' ne doit pas être la, si tu as d'autres idées ou si quelqu'un d'autre aurait une idée.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 790
    Points
    30 790
    Par défaut
    Ce sont des apostrophes qu'il fallait utiliser, pas des guillemets.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juin 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2019
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Oh ^^' Mais que j'essai avec guillemet ou apostrophe le résultat est la même il exécute la requête sans me demander la valeur que l'on souhaite renseigner.
    Sinon pour être plus simple je vais revenir à mon code d'origine et vous demandez si une autre solution que le Declare est possible, comme dis au début de ma problématique, j'utilise dans deux select différent le même paramètre, mais quand je les exécute ensemble, il me demande deux fois le paramètre alors que je souhaite qu'il ne le fasse qu'une fois, voila le code :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DELETE FROM BonTable
    where BonChamp = &1
    and BonChamp2 = 'F_BON'
    and BonChamp3 is not null;
     
    commit;
     
    DELETE FROM BonTable2 
    where BonChamp4 = &1
    and rownum = 1;
     
    commit;
    Si une personne a une idée ou si tu en as une ça serait le bienvenue

  6. #6
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    Généralement les variables numérotées sont réservées pour des appels distants.
    Dans votre cas, la bonne utilisation de &1 (ou &1.) serait de transmettre la valeur de ce paramètre lors de l'appel au SQL

    Exemple d'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sqlplus MaBase/Pwd@Instance @C:\scripts\requete.sql 25
    De cette manière on transmet le paramètre 25 et &1 prendra cette valeur
    Cela fonctionne aussi lorsque l'on a plusieurs paramètres (&1 &2 &3 etc..)

    Dans votre cas, si vous préférez que la question vous soit posée et utiliser la valeur saisie plusieurs fois, utilisez la commande ACCEPT
    Exemple avec la variable MV
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    ACCEPT MV NUMBER PROMPT 'Valeur de MV : '
    Valeur de MV : 15
     
    SQL> select &MV. from dual;
    ancien   1 : select &MV. from dual
    nouveau   1 : select         15 from dual
     
            15
    ----------
            15
     
    SQL> select &MV.-10 from dual;
    ancien   1 : select &MV.-10 from dual
    nouveau   1 : select         15-10 from dual
     
         15-10
    ----------
             5
    Une autre façon de faire, notamment pour nommer les paramètres positionnels (&1 &2 &3 etc..), c'est de récupérer les valeurs via la commande DEFINE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DEFINE Param1=&1
    DEFINE Param2=&2
    DEFINE Param3=&3
     
    SELECT &Param1., &Param2., &Param3
    FROM dual;
    Une dernière chose, il est préférable de prendre l'habitude d'ajouter le caractère point ( . ) de fin de variable car cela peut "générer" des bugs lorsque l'on utilise une variable pour un nom de base.
    En effet, les caractères & et . étant reconnus comme bornes début/fin de la variable, ils sont automatiquement supprimés

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DEFINE MaBase=BDD_ORA
     
    -- Mauvaise utilisation qui va donner BBDORAarticles
    SELECT *
    FROM &MaBase.article;
     
    -- Bonne utilisation qui va donner BBDORA.articles
    SELECT *
    FROM &MaBase..article;
    SELECT

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juin 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2019
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Super merci beaucoup pour les informations apportées !
    Donc si je comprend bien, en sqlplus lorsque l'on exécutera mes deux requêtes dans le même fichier sql, si les deux ont le &1 il n'y aura pas besoin de le ressaisir deux fois ?
    Et par contre quand j'essai de saisir un DEFINE sur DbVisualizer il semblerait ne pas le reconnaître ? J'ai également essayé même si le DEFINE n'était pas reconnu de déclarer ma variable sous , mais lorsque je veux l'utiliser ensuite dans ma requête
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    where BonChamp4 = &Bon.
    , cela me demande de saisir une valeur pour &Bon. ce que je ne veux pas vu que je suis censé l'avoir déclaré au début dans le DEFINE.

  8. #8
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    C'est normal si le DEFINE pointe sur une variable non-initialisée et que vous utilisez ensuite la variable définit dans le DEFINE, il va bien falloir lui donner une valeur.

    Il faut choisir la façon de faire avec le DEFINE
    - Soit vous l'utilisez pour récupérer la valeur d'un paramètre positionnel (Transmis lors de l'appel au script SQL tel qu'expliqué dans mon post précédent)
    - Soit vous l'utilisez comme déclaration de constante (Cf. exemple ci-dessous)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DEFINE Constante=250
     
    SELECT &Constante.
    FROM dual;
    Si vous voulez avoir une question de posée, il faut alors utiliser le ACCEPT


    PS : La portée des variables est à la session, techniquement on pourrait initialiser des variables dans un premier script et les ré-utiliser dans d'autres, après c'est à chacun de voir

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation dynamique de String dans un <select>
    Par NikoBe dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 24/10/2006, 16h25
  2. Ré-utilisation d'un AS dans un select
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 31/08/2006, 15h55
  3. [Firebird] Paramètres dans un SELECT
    Par Neilos dans le forum Connexion aux bases de données
    Réponses: 3
    Dernier message: 06/04/2006, 23h01
  4. Pl/SQL utilisation d'une variable dans un select
    Par larg dans le forum PL/SQL
    Réponses: 17
    Dernier message: 30/11/2004, 17h08
  5. utiliser le même fichier dans plusieurs projets vc++6
    Par yannick_sch dans le forum MFC
    Réponses: 5
    Dernier message: 12/02/2004, 17h39

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