Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 01/01/2008, 19h16   #1
Invité régulier
 
Inscription : décembre 2007
Messages : 28
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 28
Points : 6
Points : 6
Par défaut pb de tableau en pl sql

Bonsoir à tous,
je veux créer une fonction, dans un package, qui retourne un tableau d'entiers, j'ai bien déclaré le type tableau et tt va bien apparement pr la compilation mais lors de l'exécution, il me sort une erreur de type non valide concernant le type de tableau que j'ai déclaré, j'ai remplacé le type de retour par un type simple, et du coup tout fonctionne bien ce qui fait que j'ai le pb dans la déclaration de mon tableau mais je vois pas pourquoi, voilà ma déclaration:
type type_tab IS TABLE of number;

j'ai essayé même en utilisant: type type_tab IS varray(30) of number; mais ça ne marche pas non plus!

est c est la bonne décalaration? si oui d'où vient alors le pb?

merci d'avance
smartsorft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2008, 20h02   #2
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 534
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 534
Points : 6 471
Points : 6 471
Déclarez le type dans les spécifications du package et utilisez ce type pour déclarer votre variable externe:

Code :
1
2
3
4
CREATE OR REPLACE PACKAGE pk_test
IS
  TYPE t1 IS TABLE of pls_integer INDEX BY BINARY_INTEGER ;
  ...
puis votre variable externe:
Code :
1
2
3
4
5
Declare
  ma_var   pk_test.t1 ;
Begin
  ma_var := ...
  ...
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2008, 10h05   #3
Invité régulier
 
Inscription : décembre 2007
Messages : 28
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 28
Points : 6
Points : 6
merci pr la réponse mais ça ne marche toujours pas, j'ai toujours la même erreur ("type de données non valide").
voilà ma déclaration:

sur la spécification du package:
TYPE TYPE_TAB is table of pls_integer index by binary_integer;
FUNCTION segment_sem(date_deb date) RETURN TYPE_TAB;

et sur le corps du package:

FUNCTION segment_sem(date_deb date) RETURN TYPE_TAB IS
IND NUMBER;
les_mois_du_sem TYPE_TAB;
mois number; -- j'ai essayé même en mettant pls_integer
BEGIN
mois:=EXTRACT(month from date_deb);
FOR ind IN 1..6 LOOP
les_mois_du_sem(IND):=mois;
mois:=mois+1;
END LOOP;

RETURN les_mois_du_sem;
end;
smartsorft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2008, 10h10   #4
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 534
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 534
Points : 6 471
Points : 6 471
Cette erreur survient sur quelle ligne de code ?
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2008, 10h29   #5
Invité régulier
 
Inscription : décembre 2007
Messages : 28
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 28
Points : 6
Points : 6
en fait, il ne m indique pas la ligne, lors de la compilation tout va bien et il n y a aucune erreur mais lors de l appel de la fonction où ça me sort cette erreur.
et quand je double clique sur l'erreur, voilà qu il me sort:

Cause: the datatype entered in the CREATE or ALTER TABLE statement is not valid
Action: Correct the syntax

voilà l appel de ma fonction:
select tp.quest_sem.segment_sem(to_date('12/10/2007','DD/MM/YYYY')) segment_ from dual

mon package c'est quest_sem
smartsorft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2008, 13h16   #6
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 217
Points : 4 217
Code :
1
2
SELECT *
FROM TABLE (tp.quest_sem.segment_sem(to_date('12/10/2007','DD/MM/YYYY')))
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2008, 19h12   #7
Invité régulier
 
Inscription : décembre 2007
Messages : 28
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 28
Points : 6
Points : 6
ça ne marche toujours pas
smartsorft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2008, 22h09   #8
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
Citation:
Envoyé par smartsorft Voir le message
ça ne marche toujours pas
Pour utiliser dans SQL, la fonction ne peut pas utiliser un type PL/SQL et doit utiliser le type NUMBER ...
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2008, 22h28   #9
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 534
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 534
Points : 6 471
Points : 6 471
En fait on peut utiliser le mot clé : TABLE, mais celui-ci ne peut fonctionner qu'avec un type enregistré en base (collection de type NESTED TABLE), et non dans un package (CREATE TYPE)
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2008, 01h04   #10
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
Voici un petit exemple qui marche:
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
 
CREATE OR REPLACE package p
AS
  type num_tab IS TABLE of number;
  tab num_tab := num_tab();
  FUNCTION f RETURN num_tab pipelined;
end p;
 
package p Compiled.
CREATE OR REPLACE package body p
AS
  FUNCTION f RETURN num_tab
  pipelined
  IS
  begin
    tab.extend(10);
    FOR i IN 1 .. 10 loop
      pipe row (i);
    end loop;
  end f;
end p;
 
package body p Compiled.
SELECT * FROM TABLE (p.f())
 
COLUMN_VALUE           
---------------------- 
1                      
2                      
3                      
4                      
5                      
6                      
7                      
8                      
9                      
10                     
 
10 rows selected
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 10h42   #11
Invité régulier
 
Inscription : décembre 2007
Messages : 28
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 28
Points : 6
Points : 6
wiiiii ça marche
merci infiniment pour votre aide
smartsorft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2008, 10h05   #12
Membre du Club
 
Damien JALLON
Inscription : juin 2002
Messages : 136
Détails du profil
Informations personnelles :
Nom : Damien JALLON
Âge : 41

Informations forums :
Inscription : juin 2002
Messages : 136
Points : 52
Points : 52
Il y a apparemment une autre technique qui ne nécessite pas une fonction (pas testé car pas les droits de créer un type en base) :

Citation:
SELECT *
FROM THE (
SELECT cast( variable_type_perso AS type_perso )
FROM dual
) a
damjal 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 13h33.


 
 
 
 
Partenaires

Hébergement Web