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 :

Procédure avec nom table et valeur d'un champ en paramètre


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Points : 18
    Points
    18
    Par défaut Procédure avec nom table et valeur d'un champ en paramètre
    Bonjour à tous,
    Alors, j'ai deux problèmes dans la conception de ma procédure stockée sous oracle avec SQL Developer.
    Premier souci:
    En fait, ma procédure prend en paramètre le nom d'une table et une valeur d'un des champs de cette table. Je souhaite alors conserver dans une variable (booléenne) le résultat du select sur cette table avec comme condition la valeur du champ concerné. Pour celà j'utilise "EXECUTE IMMEDIATE" pour mon select et "decode" pour vérifier la valeur de retour du select. Mais EXECUTE IMMEDIATE ne prend pas en compte la variable "var_Found_table_attribut"
    Second souci: les cotes dans 'N' et 'Y' que j'utilise dans ma requête n'ont pas l'air d'etre apprécié par le codes.

    Voilà mon code:

    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
    CREATE
      TABLE TABLE_EIM
      (
        ROW_ID                   VARCHAR2(30),
        IF_ROW_BATCH_NUM VARCHAR2(60),
        PRIMARY KEY (ROW_ID)
    );
    
    create or replace
    PROCEDURE DEBUT_ETAPE(NOM_TABLE IN VARCHAR2, BATCH_NUM IN VARCHAR2)
    IS 
    var_Found_table_attribut varchar2(30);
    BEGIN
    EXECUTE IMMEDIATE 'SELECT decode(ROW_ID,null,'N','Y') INTO' || var_Found_table_attribut|| '||NOM_TABLE||' WHERE IF_ROW_BATCH_NUM='||BATCH_NUM;
    --dbms_output.put_line('var_Found_table_attribut);
    END;
    Merci d'avance pour vos réponses ou suggestions.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    1/ C'est une mauvaise idée d'utiliser row_id comme PK, row_id est interne à oracle et ne doit que très très rarement être utilisé.
    Crée ta propre PK que tu incrémenteras via une séquence.

    2/ Le SQL dynamique est dangereux pour des raisons d'injonction SQL
    Pour la table il faut valider que c'est bien une table existante (dbms_assert.sql_object_name) et pour les variables il faut les binder en utilisant USING.

    3/ Pour débugguer du SQL dynamique il faut afficher la requête que l'on souhaite faire exécuter via DBMS_OUPUT.
    Dans ton code il manque FROM, des espaces et le INTO ne se place pas là.
    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
    SQL> declare
     l_query varchar2(1000);
     l_nb number;
     l_usr varchar2(30) := 'SYS';
    begin
     l_query := 'select count(*) as nb from all_users where username = :usr';
     dbms_output.put_line ('la requete est : ' || l_query);
     execute immediate l_query into l_nb using l_usr;
     dbms_output.put_line ('nombre = ' || l_nb);
    end;
    /
    la requete est : select count(*) as nb from all_users where username = :usr
    nombre = 1
     
    PL/SQL procedure successfully completed.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Points : 18
    Points
    18
    Par défaut
    Oui, j'ai du oublié le FROM. mais ça ne répond pas forcément à ce que jee veux dans la mesure où ton (skuatamad) code ne prend pas en compte mes deux paramètres en entrée en l'occurence le nom de la table et la valeur d'un des champ. En outre j'aimerai savoir ce que me retoune le select raison pour laquelle j'ai utilisé le decode.

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Voilà un exemple, il faut doubler les quotes pour les echapper.
    Mais dans ton code le DECODE est inutil car la PK est forcément NOT NULL.
    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
    SQL> create or replace procedure p (p_nom_table varchar2, p_param varchar2) as 
      l_verif_nom_table varchar2(30);
      l_query varchar2(1000);
      l_usr_bool varchar2(1);
    begin
      l_verif_nom_table := dbms_assert.sql_object_name(p_nom_table);
      l_query := 'select decode(username,''SYS'',''T'',''F'') as usr_bool from '|| l_verif_nom_table || ' where username = :usr';
      dbms_output.put_line(l_query);
      execute immediate l_query into l_usr_bool using p_param;
      dbms_output.put_line(l_usr_bool);
    end;
    /
     
    Procedure created.
     
    SQL> exec p('ALL_USERS','SYSTEM');
    select decode(username,'SYS','T','F') as usr_bool from ALL_USERS where username = :usr
    F
     
    PL/SQL procedure successfully completed.
     
    SQL>
    Par ailleurs ta requête avec SELECT INTO risque de tomber en erreur NO_DATA_FOUND ou TOO_MANY_ROWS sauf si IF_ROW_BATCH_NUM est déclaré en NOT NULL UNIQUE.

  5. #5
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut Convertir les données d´un tableau entré en paramètre
    j' aimerais savoir s' il est possible en Plsql d' écrire une procédure qui prendrait un tableau comme paramètre afin d' effectuer certaines convertions dans celui-ci.
    Pour être plus claire voici ce que je tente de faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    create or replace ma_proc(table_name in varchar2) as 
    verif varchar2(40):= dbms_assert.sql_object(table_name); -- pour verifier l´existence de la table dans le dictionnaire de données.
     
    type rty_tab is table of verif%rowtype; -- ici j´ai un prob car le compilateur ne reconnaît pas "verif" comme une table seulement je n´ai pas trouvé d'autre moyen.
     
    tab rty_tab;
     
    res1 varchar2(18);
     
    query1 varchar2(1000):= 'select col1, col2 bulk collect into tab from ' ||verif;
    query2 varchar2(1000):= 'update' ||verif|| 'set tab(i).col1 =  res1 where rowid = v_rowid';
    merci pour toutes suggestions

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    1/ C'est une mauvaise idée d'utiliser row_id comme PK, row_id est interne à oracle et ne doit que très très rarement être utilisé.
    Crée ta propre PK que tu incrémenteras via une séquence.
    Tu t'es trompé, c'est ROWID qui est interne à oracle
    Là, c'est juste un Row_Id en varchar2.. pas de soucis, donc.

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Teddi, Je ne comprends pas ton dernier post.

    Peux tu donner un exemple avec des valeurs de ce que tu veux faire ?

Discussions similaires

  1. Procédure avec CREATE TABLE AS SELECT
    Par toshTosh dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 18/07/2012, 09h12
  2. [Procédure Stockée] Nom table dynamique
    Par Kirua76 dans le forum Développement
    Réponses: 1
    Dernier message: 23/11/2011, 15h36
  3. Procédure avec variable à la place du nom des tables
    Par alex_972 dans le forum PL/SQL
    Réponses: 7
    Dernier message: 28/09/2011, 09h59
  4. Réponses: 4
    Dernier message: 08/03/2011, 18h16
  5. Réponses: 3
    Dernier message: 26/11/2006, 21h05

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