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 :

Passage d'un paramètre décimal à une procédure


Sujet :

PL/SQL Oracle

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Par défaut Passage d'un paramètre décimal à une procédure
    Bonjour,

    Je cherche à passer à une procédure stockée ORACLE des arguments de types décimaux.

    Via un client TOAD l'appel de la procédure est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    call test_proc(to_number('1,2'));
    Les arguments de la procédure stockée sont : IN NUMBER.

    Cet appel ne fonctionne pas : ORA-00913: too many values.

    Merci pour votre retour.

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Peut être que vous travaillez avec le point décimal et non pas la virgule décimale, vérifiez votre paramètrage NLS.... En plus c'est quoi le to_number('1,2') ..., vous pouvez passer directement une constante numérique à votre procédure; nul besoin de passer par tous ces conversions.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Par défaut
    Lorsque je fais un : select * from nls_database_parameters

    J'obtiens : NLS_LANGUAGE = AMERICAN.

    Les arguments de la procédure :

    CREATE OR REPLACE PROCEDURE INTEGRATION_TARIF_BRN(
    p_client IN VARCHAR2,
    p_num_engagement IN VARCHAR2,
    p_intervention IN NUMBER,
    p_montant IN NUMBER,
    p_date_validite IN VARCHAR2,
    p_annee IN VARCHAR2,
    p_composant IN NUMBER,
    p_lib_intervention IN VARCHAR2
    )

    L'appel à la procédure qui renvoie une erreur sur le quatrième argument :

    call integration_tarif_brn('50188','50188ST01',8,5.2,to_date('01/01/2011','dd/mm/yyyy'),'2011',2,'Mouvements de titres');

    Le problème vient du nombre décimal d'où l'idée de faire une conversion avec to_number()....

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Regardez les paramètres NLS de votre session
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM NLS_SESSION_PARAMETERS

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Par défaut
    OK mais quel paramètre regarder dans cette liste ?

    J'ai par exemple un NLS_NUMERIC_CHARACTERS qui vaut ',' ?

    Merci par avance pour tout complément d'information.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Je ne vois rien de faux sur le quatrième argument, mais en tout cas sur le cinquième oui, vous envoyez une date alors qu'une chaîne de caractères est attendue.

    Essayez celà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call integration_tarif_brn('50188', '50188ST01', 8, 5.2, '01/01/2011', '2011', 2, 'Mouvements de titres');

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Alors, ça devrait aller
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    mni@DIANA> select * from nls_session_parameters
      2  /
     
    PARAMETER                      VALUE
    ------------------------------ ----------------------------------------
    NLS_LANGUAGE                   FRENCH
    NLS_TERRITORY                  FRANCE
    NLS_CURRENCY                   Ç
    NLS_ISO_CURRENCY               FRANCE
    NLS_NUMERIC_CHARACTERS         ,
    NLS_CALENDAR                   GREGORIAN
    NLS_DATE_FORMAT                DD/MM/RR
    NLS_DATE_LANGUAGE              FRENCH
    NLS_SORT                       FRENCH
    NLS_TIME_FORMAT                HH24:MI:SSXFF
    NLS_TIMESTAMP_FORMAT           DD/MM/RR HH24:MI:SSXFF
    NLS_TIME_TZ_FORMAT             HH24:MI:SSXFF TZR
    NLS_TIMESTAMP_TZ_FORMAT        DD/MM/RR HH24:MI:SSXFF TZR
    NLS_DUAL_CURRENCY              Ç
    NLS_COMP                       BINARY
    NLS_LENGTH_SEMANTICS           BYTE
    NLS_NCHAR_CONV_EXCP            FALSE
     
    17 ligne(s) sélectionnée(s).
     
    mni@DIANA> create or replace procedure mni_test (
      2    p1       In number,
      3    p2       In varchar2
      4  ) IS
      5  Begin
      6    Null;
      7  End;
      8  /
     
    Procédure créée.
     
    mni@DIANA> show errors
    Pas d'erreur.
    mni@DIANA> exec mni_test(1,2,'test')
    BEGIN mni_test(1,2,'test'); END;
     
          *
    ERREUR à la ligne 1 :
    ORA-06550: Ligne 1, colonne 7 :
    PLS-00306: numéro ou types d'arguments erronés dans appel à 'MNI_TEST'
    ORA-06550: Ligne 1, colonne 7 :
    PL/SQL: Statement ignored
     
     
    mni@DIANA> exec mni_test(p1 => 1,2, p2=> 'test')
    BEGIN mni_test(p1 => 1,2, p2=> 'test'); END;
     
                           *
    ERREUR à la ligne 1 :
    ORA-06550: Ligne 1, colonne 24 :
    PLS-00312: association de paramèt. de pondération ne doit pas suivre une assoc nommée
    ORA-06550: Ligne 1, colonne 7 :
    PL/SQL: Statement ignored
     
     
    mni@DIANA> exec mni_test('1,2','test')
     
    Procédure PL/SQL terminée avec succÞs.
     
    mni@DIANA> exec mni_test(to_number('1,2'),'test')
     
    Procédure PL/SQL terminée avec succès.
     
     
    mni@DIANA>

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Par défaut
    Merci pour ces réponses mais mon appel ne fonctionne toujours pas.

    Ci-dessous le résultat de la requête "SELECT * FROM NLS_SESSION_PARAMETERS" :

    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
     
    NLS_LANGUAGE	FRENCH
    NLS_TERRITORY	FRANCE
    NLS_CURRENCY	¿
    NLS_ISO_CURRENCY	FRANCE
    NLS_NUMERIC_CHARACTERS	, 
    NLS_CALENDAR	GREGORIAN
    NLS_DATE_FORMAT	DD/MM/RR
    NLS_DATE_LANGUAGE	FRENCH
    NLS_SORT	FRENCH
    NLS_TIME_FORMAT	HH24:MI:SSXFF
    NLS_TIMESTAMP_FORMAT	DD/MM/RR HH24:MI:SSXFF
    NLS_TIME_TZ_FORMAT	HH24:MI:SSXFF TZR
    NLS_TIMESTAMP_TZ_FORMAT	DD/MM/RR HH24:MI:SSXFF TZR
    NLS_DUAL_CURRENCY	¿
    NLS_COMP	BINARY
    NLS_LENGTH_SEMANTICS	BYTE
    NLS_NCHAR_CONV_EXCP	FALSE
    Donc j'essaie via un client TOAD de faire l'appel suivant mais cela ne passe pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    call integration_tarif_brn('50188', '50188ST01', 8, to_number('5,2'), '01/01/2011', '2011', 2, 'Mouvements de titres');
    L'erreur obtenue est la suivante : ORA-00913: too many values
    ORA-06512: at "LS1A.INTEGRATION_TARIF_BRN", line 147.

    Voilà donc si vous avez d'autres pistes je suis preneur.
    Merci par avance.

  9. #9
    Invité
    Invité(e)
    Par défaut
    virer voter to_number puisque votre séparateur est la virgule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call integration_tarif_brn('50188', '50188ST01', 8, '5,2', '01/01/2011', '2011', 2, 'Mouvements de titres');

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Est-ce que votre procédure fonctionne avec un entier ?

    Je veux dire, est-ce que l'erreur ne peut pas provenir d'un autre appel à l'intérieur de cette procédure ?

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Par défaut
    Le premier appel ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    call integration_tarif_brn('50188', '50188ST01', 8, '5,2', '01/01/2011', '2011', 2, 'Mouvements de titres');
    En effet le quatrième argument attendu est un nombre et non une chaine de caractères.

    Par contre, si je fais un appel avec un nombre non décimal cela fonctionne bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    call integration_tarif_brn('50188', '50188ST01', 8, 5, '01/01/2011', '2011', 2, 'Mouvements de titres');
    La procédure en question ne fait pas d'appel vers d'autres procédures sinon.

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vraiment étrange.
    Que donne le test suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    call integration_tarif_brn
    (
        '50188', '50188ST01', 8,
        to_number('5,2', '9D9', 'nls_numeric_characters='', '''),
        '01/01/2011', '2011', 2, 'Mouvements de titres'
    );

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Par défaut
    Cela donne la même erreur :

    ORA-00913: too many values
    ORA-06512: at "LS1A.INTEGRATION_TARIF_BRN", line 147

  14. #14
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par david71 Voir le message
    Cela donne la même erreur :

    ORA-00913: too many values
    ORA-06512: at "LS1A.INTEGRATION_TARIF_BRN", line 147
    913 n'est pas lié au passage des paramètres dans la procédure PL/SQL (sinon ça devrait être une erreur PLS comme dans mon exemple) mais au SQL qui s'exécute dans cette procédure.

    ORA-00913 too many values

    Cause: The SQL statement requires two sets of values equal in number. This error occurs when the second set contains more items than the first set. For example, the subquery in a WHERE or HAVING clause may return too many columns, or a VALUES or SELECT clause may return more columns than are listed in the INSERT.

    Action: Check the number of items in each set and change the SQL statement to make them equal.



  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Par défaut
    Oui donc en fait cela vient du PL SQL au moment de l'insert je pense :

    Je passe donc l'argument to_number('5,2') à la procédure.
    Lorsque j'affiche le paramètre reçu j'obtiens la valeur avec dbms output :
    Puis vient l'insert qui ne peut effectivement rien faire avec cela, la virgule doit gêner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    requete := 'INSERT INTO TARIF(C_ID_TARIF, C_ID_INTERVENTION, C_TYP_TARIF, M_FORFAIT, M_PRIX_UNIT, D_DEB_VALIDITE, D_FIN_VALIDITE, ' ||
    'D_CREATION, C_UT_CREATION, D_MAJ, C_UT_MAJ, C_ID_LG_PRESTATION, C_ID_PRESTATION) ' ||
    'VALUES('||m_tarif||','||p_intervention||',''2'',0,'||p_montant||',''01/01/'||p_annee||''',''31/12/'||p_annee||''',''03/12/2009'',''MOA'',''03/12/2009'',''MOA'', ' ||
    code_lp||','||code_prestation||')';
    EXECUTE IMMEDIATE requete;
    Seule solution que je vois remplacer dans la procédure la virgule dans le montant par un point si virgule il y a ?

  16. #16
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Quelle est la description de la table TARIF ?
    Pas besoin de faire un execute immediate ici à priori.

  17. #17
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Chaque fois que vous utilisez du SQL dynamique passez les valeurs via des variables de liaison (binding variables). Considérez les requêtes SQL dynamiques où les valeurs des variables sont concaténées avec le texte de la requête comme un bug majeur. Une fois que vous avez une bonne compréhension des implications des valeurs littérales collées dans les requêtes SQL dynamiques, vous pouvez vous affranchir de cette règle.

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Par défaut
    Finalement je suis parvenu à résoudre le problème : je passe en paramètre le montant en chaine de caractères puis je fais un remplacement de la virgule par un point avant de faire l'insert :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dbms_output.put_line(p_montant);
    montant:= translate(p_montant, ',', '.');
    dbms_output.put_line(montant);
    Merci à tous.

  19. #19
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Non, vous ne faites que mettre une mauvaise rustine sur un pneu déjà crevé !

    Profitez de cette discution pour mettre à plat votre procédure et comprendre les typages de données !

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Par défaut
    OK merci pour ces précisions mais avez-vous des exemples d'utilisation des variables de liaison ? Par exemple comment remplacer les paramètres actuels de ma procédure par des variables de liaison ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE OR REPLACE PROCEDURE INTEGRATION_TARIF_2(
    	p_client IN VARCHAR2,
    	p_num_engagement IN VARCHAR2,
    	p_intervention IN NUMBER,
    	p_montant IN VARCHAR2,
    	p_date_validite IN VARCHAR2,
    	p_annee IN VARCHAR2,
    	p_composant IN NUMBER,
    	p_lib_intervention IN VARCHAR2,
    	p_type_tarif IN NUMBER
    )
    IS
    ...
    Les colonnes relatives aux montants sont typées comme étant des NUMBER(18,6).

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 11
    Dernier message: 22/05/2014, 11h45
  2. Passage d un nom de table en paramètre d'une procédure stockée
    Par Cedric33 dans le forum Développement
    Réponses: 22
    Dernier message: 10/02/2009, 16h12
  3. [SQL Server] Passage d'un paramètre dans une procédure
    Par navis84 dans le forum Bases de données
    Réponses: 3
    Dernier message: 14/01/2005, 13h19
  4. Passage d'un paramètre d'une fenêtre à une autre ?
    Par almisuifre dans le forum C++Builder
    Réponses: 10
    Dernier message: 06/12/2004, 22h42
  5. Un fichier .bmp comme paramètre d'une Procédure stockée
    Par FONKOU dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/10/2004, 17h56

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