Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/02/2012, 09h07   #1
Candidat au titre de Membre du Club
 
Inscription : avril 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 45
Points : 10
Points : 10
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 :
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 :
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 :
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
Type de fichier : sql base_fil_rouge.sql (31,5 Ko, 2 affichages)
seb76250 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 09h42   #2
Membre expérimenté
 
François
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : François

Informations forums :
Inscription : février 2010
Messages : 306
Points : 537
Points : 537
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 :
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
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 10h38   #3
Candidat au titre de Membre du Club
 
Inscription : avril 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 45
Points : 10
Points : 10
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.
seb76250 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 10h49   #4
Membre expérimenté
 
François
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : François

Informations forums :
Inscription : février 2010
Messages : 306
Points : 537
Points : 537
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 :
BEGIN utiinsert('nomtest', 'prenomtest', 'logintest', 'mdptest', 'mailtest', 'teltest', 1, ARRAY_INT(1)); END;
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 10h54   #5
Candidat au titre de Membre du Club
 
Inscription : avril 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 45
Points : 10
Points : 10
Oui j'ai essayé de faire de cette façon aussi mais j'ai une erreure d'exécution :

Code :
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.
seb76250 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 11h22   #6
Candidat au titre de Membre du Club
 
Inscription : avril 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 45
Points : 10
Points : 10
En essayant j'ai réussi a exécuter ma procédure :

Code :
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 :
1
2
 
exec utiinsert('nomtest', 'prenomtest', 'logintest', 'mdptest', 'mailtest', 'teltest', 1, ARRAY_INT(1));
J'ai l'erreur :
Code :
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.
seb76250 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 14h03   #7
Membre Expert
 
Inscription : août 2008
Messages : 1 274
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 274
Points : 1 934
Points : 1 934
Code :
returning rowid INTO v_utiid;
Ca devrait être :
Code :
returning utiid INTO v_utiid;
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 11h21   #8
Candidat au titre de Membre du Club
 
Inscription : avril 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 45
Points : 10
Points : 10
C'était bien ça l'erreur, merci skuatamad.
seb76250 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h07.


 
 
 
 
Partenaires

Hébergement Web