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 :

Tableau en paramètre d'une procédure stockée


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 54
    Par défaut Tableau en paramètre d'une procédure stockée
    Bonjour,

    Je souhaiterai passer un tableau en paramètre d'une procédure stockée sur oracle 10g.

    Ma procédure est bien crée sans erreur mais je n'arrive pas à l'exécuter.

    Le message d'erreur est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    BEGIN utiinsert('nomtest', 'prenomtest', 'logintest', 'mdptest', 'mailtest', 'teltest', 1, 1); END;
     
          *
    ERREUR à la ligne 1 :
    ORA-06550: Ligne 1, colonne 7 :
    PLS-00306: numéro ou types d'arguments erronés dans appel à 'UTIINSERT'
    ORA-06550: Ligne 1, colonne 7 :
    PL/SQL: Statement ignored
     
     
    SP2-0103: Rien à exécuter dans la mémoire tampon SQL.
    Pas d'erreur.
    Voici le type et la procédure :
    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 OR REPLACE TYPE ARRAY_INT IS TABLE of number;
    CREATE OR REPLACE PROCEDURE utiinsert
    (
    p_utinom IN VARCHAR2, p_utiprenom IN VARCHAR2, p_utilogin IN VARCHAR2, p_utimdp IN VARCHAR2, p_utimail IN VARCHAR2, p_utitel VARCHAR2, p_utiprof IN NUMBER, p_utifonc IN ARRAY_INT
    )
    IS
    v_utiid varchar2(50);
    BEGIN
    INSERT INTO utilisateur 
    (utiid, profid, utinom, utiprenom, utilogin, utimdp, utimail, utitel, utisuppr) 
    VALUES
     (S_UTILISATEUR.NEXTVAL, p_utiprof, p_utinom, p_utiprenom, p_utilogin, p_utimdp, p_utimail, p_utitel, 0) returning rowid into v_utiid;
    FORALL i IN p_utifonc.FIRST..p_utifonc.LAST
            INSERT INTO FONC_UTI(utiid, foncid) VALUES(v_utiid, p_utifonc(i));
    END;
    Exécution de la procédure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    exec utiinsert('nomtest', 'prenomtest', 'logintest', 'mdptest', 'mailtest', 'teltest', 1, 1);

    Script de création de la base en pièce jointe.


    Je n'arrive pas à trouver mon erreur.
    Merci d'avance.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut Jusqu'au bout
    Bonjour,
    C'est juste votre dernier argument qui n'est pas du bon type. Vous lui donnez un nomber au lieu d'un ARRAY_INT.

    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
    TMP@MINILHC >desc number_tt
     number_tt TABLE OF NUMBER
    TMP@MINILHC >REM Pareil que votre ARRAY_INT du coup
     
    TMP@MINILHC >create or replace function tmp_proc ( param number_tt) return number is
      2  begin
      3     return param.count;
      4  end;
      5  /
     
    Function created.
     
    Elapsed: 00:00:00.01
    TMP@MINILHC >show errors
    No errors.
    TMP@MINILHC >exec dbms_output.put_line(tmp_proc(1));
    BEGIN dbms_output.put_line(tmp_proc(1)); END;
     
                               *
    ERROR at line 1:
    ORA-06550: line 1, column 28:
    PLS-00306: wrong number or types of arguments in call to 'TMP_PROC'
    ORA-06550: line 1, column 7:
    PL/SQL: Statement ignored
     
     
    Elapsed: 00:00:00.00
    TMP@MINILHC >exec dbms_output.put_line(tmp_proc(number_tt()));
    0
     
    PL/SQL procedure successfully completed.
     
    Elapsed: 00:00:00.00
    TMP@MINILHC >exec dbms_output.put_line(tmp_proc(number_tt(1,2,3)));
    3
     
    PL/SQL procedure successfully completed.
     
    Elapsed: 00:00:00.00

  3. #3
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 54
    Par défaut
    Merci pour cette réponse,

    Seulement je ne comprend pas vraiment, je dois recréer une fonction à côté pour traiter mon tableau ?

    En fait, je ne vois pas comment intégrer votre réponse dans ma procédure stockée.

    Merci encore.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut
    Pardon, en fait c'est simplement (sauf si je me trompe), que votre dernier argument: p_utifonc
    Dans l'appel a votre procedure, vous mettez un nombre tout bete:1.
    Alors que ca devrait etre un ARRAY_INT: ARRAY_INT(1), ou ARRAY_INT(1,2,3,..)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BEGIN utiinsert('nomtest', 'prenomtest', 'logintest', 'mdptest', 'mailtest', 'teltest', 1, ARRAY_INT(1)); END;

  5. #5
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 54
    Par défaut
    Oui j'ai essayé de faire de cette façon aussi mais j'ai une erreure d'exécution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    BEGIN utiinsert('nomtest', 'prenomtest', 'logintest', 'mdptest', 'mailtest', 'teltest', 1, ARRAY_INT(1)); END;
     
    *
    ERREUR à la ligne 1 :
    ORA-01722: Nombre non valide
    ORA-06512: à "FIL.UTIINSERT", ligne 12
    ORA-06512: à ligne 1
     
     
    SP2-0103: Rien à exécuter dans la mémoire tampon SQL.
    Pas d'erreur.

  6. #6
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 54
    Par défaut
    En essayant j'ai réussi a exécuter ma procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    exec utiinsert('nomtest', 'prenomtest', 'logintest', 'mdptest', 'mailtest', 'teltest', 1, ARRAY_INT());
    /
    SET serverout ON
    SHOW error
    Mais dès que je lui met un nombre du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    exec utiinsert('nomtest', 'prenomtest', 'logintest', 'mdptest', 'mailtest', 'teltest', 1, ARRAY_INT(1));
    J'ai l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ERREUR à la ligne 1 :
    ORA-01722: Nombre non valide
    ORA-06512: à "FIL.UTIINSERT", ligne 12
    ORA-06512: à ligne 1
    C'est la déclaration de mon tableau qui ne doit pas aller mais j'ai essayer avec des varchar2 et ça ne fonctionne pas non plus.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/12/2006, 12h37
  2. Réponses: 2
    Dernier message: 27/06/2006, 15h21
  3. Réponses: 4
    Dernier message: 14/02/2006, 15h33
  4. Passer le nom de colonne en paramètre d'une procédure stocké
    Par theartist dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 04/01/2005, 15h39
  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