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 :

Pl/SQL utilisation d'une variable dans un select


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 13
    Points : 5
    Points
    5
    Par défaut Pl/SQL utilisation d'une variable dans un select
    Bonjour,

    Je suis débutant en Pl/SQL et voici mon problème.

    Je recois en entrée un fichier texte que je manipule (en ksh) pour ressortir 2 valeurs (A et B).
    je lance une fonction unix avec à l'intérieur du PL/SQL qui doit me renvoyer 2 champs d'un enregistrement qui se trouve soit dans la table X soit dans la table Y.
    Je ne saurai pas à l'avance sur quelle table envoyé la requete (pour la table X, je dois faire un where champsM = A et pour la table Y, where champsN = B, ) Je dois donc faire la requete sur la table X et si je n'ai pas de resultat la faire sur la table Y pour etre sur d'avoir ces 2 champs.
    est-il possible de setter une variable ksh à 1 si aucune donnée n'a été trouvé pour que je puisse traiter dnas le script ksh la deuxième requete.

    J'aimerais donc faire 1 requete type dans une fonction ksh qui serait appelé avec comme paramètre valeur du champ, nom du champ,

    exemple pour une valeur :
    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
     
    BEGIN
     
    -- set des variable PL/SQL a partir des 2 parametres de la fonction
    my_valeur1 := '$1';
    my_valeurSelectionne := '$2';
     
    --J'aimerais donc faire un select du champs qui se trouve dans la chaine
    de caractère $2
    select my_valeurSelectionne  into my_retour my_line from ordresortant where HOSTID = my_valeur1;
     
     
    my_file := UTL_FILE.FOPEN( 'PATH', 'nom_du_fichier', 'a');
    UTL_FILE.PUT_LINE ( my_file, my_retour);
    UTL_FILE.FCLOSE ( my_file);

    je me complique peut etre (cela ne doit d'ailleurs pas être évident à capter) la vie donc si vous trouvez une solution plus simple cela swrait aussi avec plaisir.

    merci d'avance et a+

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    pourquoi ne pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT col1,col2 
    FROM X
    WHERE M=A
    UNION
    SELECT col1,col2 
    FROM Y
    WHERE N=B
    ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    vi effectivement, je n'avais pas pensé à cela. Je pense que cela ba bien me simplifier la tache. merci et a+

  4. #4
    Futur Membre du Club
    Inscrit en
    Octobre 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    après reflexion et discussion avec une collègue, je ne peux pas fais de Union car ce procédé prend bcp de ressource et surtout je dois écrire dans 2 fichier différent (si table X écriture dans FicX....).

    J'aimerais donc quand même connaitre la syntaxe pour utiliser des variables comme nom de champ et autre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT my_variable1 into my_valeur_variable1 from db.table where my_variable2 = my_valeur;
    (c'est ok pour la var my_valeur mais pas pour les 2 autres)

    De plus, il faut que je trouve un moyens de savoir si la premère requete n'a pas rapporté de résultat (pour fais la requete sur la 2ième table). Je pense avec NO_DATA_FOUND. Pour le moment, je suis à la recherche d'un solution.

    merci d'avance et a+

  5. #5
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    un UNION qui prend beaucoup de ressource... mmmmm... ok...

    Si j'ai bien compris, tu voudrais que le nom de champ soit un paramétre de ta requête ? Dans ce cas il faut utiliser le SQL dynamique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute immediate('SELECT my_variable1 into my_valeur_variable1 from db.table where '|| my_variable2 || ' = '|| my_valeur) INTO my_valeur_variable1;

  6. #6
    Futur Membre du Club
    Inscrit en
    Octobre 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    en ce qui concerne l'union, c'est ce que l'on ma dit.....ce n'est pas correct.

    merci pour la syntaxe, je vais essayer.

    a+

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Dans ton cas, c'est pas très adaoté mais dire que ce n'est pas performant là je serais plus modéré

  8. #8
    Futur Membre du Club
    Inscrit en
    Octobre 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    oki.

  9. #9
    Futur Membre du Club
    Inscrit en
    Octobre 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    je galère pas mal

    Ce n'est pas uniquement le champs que j'aimerais comme papramètre de ma requete mais valeur1, my_valeurSelectionne... j'ai essayé cette syntaxe mais cela me donne :

    ERROR at line 1:
    ORA-00905: missing keyword
    ORA-06512: at line 23

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    my_valeur1 := '$1';
    my_valeur2 := '$2';
    my_valeurSelectionne := '$3';
    my_table := '$4';
    my_identification := '$5';
    my_retour :='';
     
    execute immediate('SELECT ' || my_valeurSelectionne || ' into ' || my_retour || ' from ' || my_table || ' where ' || my_identification || ' = ' || my_valeur1 ) INTO my_retour;
    Etant donné que ce bout de code et dans une fonction ksh, je set les variables avec les paramètres de la fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete $valeur1 $valeur2 ...
    De plus, si cette requete ne me renvoi pas de résultat, j'aimerais idéalement sett une variable unix à 1 (pour pouvoir la re executer sur une autre table, avec une autre valeur de my_identification et my_valeur1).

    j'essaye depuis ce matin mais je n'avance pas d'un poil

    merci d'avance et a+

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    oops

    c'est || ' into ' || my_retour || qui est en trop... bien sûr c'est le INTO à la fin de la commande qui permet de récupérer le résultat

  11. #11
    Futur Membre du Club
    Inscrit en
    Octobre 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    cela me paraissait effectivement bizarre.

    Décidement, j'ai bcp de peine aujourd'hui! J'utilise sqlplus, est-ce que cela change qqchose?

    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
     
    DECLARE
     
      my_valeur1	                VARCHAR2(4000);
      my_valeurSelectionne              VARCHAR2(4000);
      my_retour	 	VARCHAR2(4000);
      my_table 	 	VARCHAR2(4000);
      my_identification	VARCHAR2(4000);
     
    BEGIN
    --normalement my_valeur1 := '$1' mais j'ai directement mis la valeur  
    --pour test (valeur fictive car sur Internet mais correct quand je test)
     
    my_valeur1 := 'gergjfdigoédfdgjh'
    my_valeurSelectionne := 'nom de la colonne à selectionner';
    my_table := 'nom de la table';
    my_identification := 'nom de la colonne qui va servir à l'identification de l'enregistrement';
     
     EXECUTE IMMEDIATE ('SELECT ' || my_valeurSelectionne || ' FROM ' || my_table  || ' where ' || my_identification || ' = ' || my_valeur1) INTO my_retour;
    msg d'erreur :

    ERROR at line 1:
    ORA-00904: invalid column name
    ORA-06512: at line 22




    merci d'avance

  12. #12
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    si tu as laissé :
    my_valeurSelectionne := 'nom de la colonne à selectionner';

    je pense que la colonne n'existe effectivement pas

  13. #13
    Futur Membre du Club
    Inscrit en
    Octobre 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    valeur fictive car sur Internet mais correct quand je test
    Vi effectivement mais ce n'est pas le cas. Je le fais pas sécurité car cette base est assez sensible, Je te rassure, quand je test je met le bon nom de colonne et cela me fait une erreur (cf post précédent).

    a+ et merci pour ton aide

  14. #14
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Essaye ceci :

    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
    20
    21
    22
    23
    24
    DECLARE
     
      my_valeur1                   VARCHAR2(4000);
      my_valeurSelectionne              VARCHAR2(4000);
      my_retour       VARCHAR2(4000);
      my_table        VARCHAR2(4000);
      my_identification   VARCHAR2(4000);
     
      my_select VARCHAR2(4000);
    BEGIN
    --normalement my_valeur1 := '$1' mais j'ai directement mis la valeur 
    --pour test (valeur fictive car sur Internet mais correct quand je test)
     
    my_valeur1 := 'gergjfdigoédfdgjh'
    my_valeurSelectionne := 'nom de la colonne à selectionner';
    my_table := 'nom de la table';
    my_identification := 'nom de la colonne qui va servir à l'identification de l'enregistrement';
     
    my_select := 'SELECT ' || my_valeurSelectionne || ' FROM ' || my_table  || ' where ' || my_identification || ' = ' || my_valeur1;
     
      DBMS_OUTPUT.PUT_LINE(my_select);
     EXECUTE IMMEDIATE (my_select) INTO my_retour;
    END;
    /
    Exécute cette procédure après avoir fait un :

    ainsi tu verras le SELECT exécuté et tu devrais comprendre ce qui ne va pas

  15. #15
    Futur Membre du Club
    Inscrit en
    Octobre 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    super! :o

    Je crois comprendre le problème. la requete se forme correctement mise a part qu'il faudrait mettre la valeur de my_valeur1 entre ''

    j'arrive à cela comme requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT VARIABLEOK FROM TABLEOK WHERE VARIABLEOK =valeur
    alors qu'il faudrait arriver à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT VARIABLEOK FROM TABLEOK WHERE VARIABLEOK ='valeur'
    Je ne sais pas si ce que j'avance est correct mais cela me parait logique. Alors comment faire pour mettre ces quotes?

    merci d'avance et a+

  16. #16
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    c'est ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'mavar:= ''' ||mavar || ''';';  :arrow: mavar := 'titi';
    Essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 'Je suis ''' || 'content' || ''' avec mes guillemets.' from dual;

  17. #17
    Futur Membre du Club
    Inscrit en
    Octobre 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    SUPER!

    ca marche!

    en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my_valeur1 := ' ''$1'' ';
    ma requete ne se termine pas par ; mais cela pas l'air de poser de problème.


    un grand merci pour ton aide et a+[/code]

  18. #18
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    effectivement, il ne faut pas de ; en SQL dynamique

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

Discussions similaires

  1. Utilisation d'une variable dans une procédure PL/SQL
    Par WOLO Laurent dans le forum PL/SQL
    Réponses: 6
    Dernier message: 31/10/2011, 11h00
  2. Réponses: 5
    Dernier message: 22/01/2008, 09h54
  3. utilisation d'une variable dans une requete SQL
    Par ezneti dans le forum Visual C++
    Réponses: 1
    Dernier message: 30/04/2007, 09h47
  4. Utilisation d'une variable dans un bloc pl/sql
    Par paris2000fr dans le forum PL/SQL
    Réponses: 2
    Dernier message: 29/03/2006, 14h08
  5. Réponses: 9
    Dernier message: 05/07/2005, 08h37

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