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 :

fonction retour pipelined


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 14
    Points : 6
    Points
    6
    Par défaut fonction retour pipelined
    Bonjour j'ai un petit probleme lors de l'execution d'une fonction pipelined. J'ai utilisé le tutorial présent sur le site, mais il y a quelque chose que je n'arrive pas a debugguer. Voici 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    CREATE OR REPLACE TYPE moisVisites AS OBJECT (numMois NUMBER);
     
    CREATE OR REPLACE TYPE periodes AS TABLE OF moisVisites;
     
    CREATE OR REPLACE FUNCTION periodeVisitees (curseur IN SYS_REFCURSOR) RETURN periodes PIPELINED IS
    	moisDepart NUMBER;
    	moisRetour NUMBER; 
    	moisV := moisVisites(NULL);
    	Rvisa visa%rowtype;
     
    	BEGIN
    		LOOP
    			FETCH curseur INTO Rvisa;
    			EXIT WHEN curseur%NOTFOUND;
    			moisDepart :=to_char(to_date(RVisa.dateEntree,'DD/MM/YYYY'),'MM');
    			moisRetour :=to_char(to_date(RVisa.dateSortie,'DD/MM/YYYY'),'MM');
     
    			IF (moisDepart > moisRetour) THEN
    				FOR x in moisDepart..12 LOOP
    					moisV.numMois := x;
    					PIPE ROW(moisV);
    				END LOOP;
    				FOR x in 1..moisRetour LOOP
    					moisV.numMois := x;
    					PIPE ROW(moisV);
    				END LOOP;
    			ELSE
    				FOR x in moisDepart..moisRetour LOOP
    					moisV.numMois := x;
    					PIPE ROW(moisV);
    				END LOOP;
    			END IF;
    		END LOOP;
    		RETURN ;
    	END;
    /
    A coté de cela j'ai un table VISA dans la quelle je peux recuperer dateEntree et dateSortie . Mon but est de retourner une table avec tous les mois qui ont été visités pour ensuite faire une statistiques.
    La fonction est bien créee, mais lorsque je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM TABLE(periodeVisitees(CURSOR(select * from Visa)));
    j'obtiens l'erreur :
    type de données incohérents , obtenu : - ; attendu - ;
    Je n'arrive pas a voir d'ou vient l'erreur, quelqu'un aurait t-il une idée pour m'aider a avancer ??
    En vous remerciant.

    J'utilise ORACLE 10g

  2. #2
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Peut-être y-a-il un problème dans vos données:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    moisDepart NUMBER;
    moisRetour NUMBER;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    moisDepart :=to_char(to_date(RVisa.dateEntree,'DD/MM/YYYY'),'MM');
    moisRetour :=to_char(to_date(RVisa.dateSortie,'DD/MM/YYYY'),'MM');
    impliquent une conversion implicite de VARCHAR2 en NUMBER.

    Etes-vous sûre de vos données ?
    Quel est le n° exact du message d'erreur ?

  3. #3
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    sur quelle ligne, l'erreur ?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Desole de la reponse tardive !

    Je ne pense pas que l'erreur vienne de mes conversions de VARCHAR2 en DATE car j'ai deja utilisees celle ci autreent et elles avaient fonctionné.

    Voici l'erreur que me donne sqlplus :


    SQL> select * from TABLE(periodeVisitees(CURSOR(select * from visa)));
    select * from TABLE(periodeVisitees(CURSOR(select * from visa)))
    *
    ERREUR à la ligne 1 :
    ORA-00932: types de données incohérents ; attendu : - ; obtenu : -
    ORA-06512: à "OGZ.PERIODEVISITEES", ligne 9

  5. #5
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    La ligne 9 pourrait bien être un des 2 lignes où moisDepart et moisRetour sont initialisés. Vérifiez avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT text FROM user_source WHERE name ='PERIODESVISITEES' AND line=9;

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Apparemment la ligne 9 est celle ci :

    FETCH curseur INTO Rvisa;

  7. #7
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Essayez de remplacer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Rvisa visa%rowtype;
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Rvisa curseur%rowtype;

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Alors en remplacant visa%rowtype par curseur%rowtype, la fonction ne compile plus !!

  9. #9
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Et si vous supprimez le type OBJECT et utilisez directement:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE OR REPLACE TYPE periodes AS TABLE OF NUMBER;
    Est-ce que ça marche ?

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Ca donne exactement la même réponse

    toujours type de données incohérents attendu : - ; obtenu - ;

  11. #11
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    J'ai modifié votre exemple en supprimant le type OBJECT et en utilisant un package (je crois que c'est nécessaire):

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    DROP TABLE visa;
    ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY';
     
    CREATE TABLE visa(
            dateEntree VARCHAR2(20),
            dateSortie VARCHAR2(20)
    );
     
    INSERT INTO visa VALUES('27/02/2005', '27/03/2006');
    COMMIT;
     
    CREATE OR REPLACE PACKAGE p
    AS
     TYPE periodes IS TABLE OF NUMBER;
     FUNCTION periodeVisitees (curseur IN SYS_REFCURSOR) RETURN periodes PIPELINED;
    END;
    /
    show errors
     
    CREATE OR REPLACE PACKAGE BODY p
    IS
     FUNCTION periodeVisitees (curseur IN SYS_REFCURSOR) RETURN periodes PIPELINED IS
       moisDepart NUMBER;
       moisRetour NUMBER;
       Rvisa visa%rowtype;
     
       BEGIN
          LOOP
             FETCH curseur INTO Rvisa;
             EXIT WHEN curseur%NOTFOUND;
             moisDepart :=to_char(to_date(RVisa.dateEntree,'DD/MM/YYYY'),'MM');
             moisRetour :=to_char(to_date(RVisa.dateSortie,'DD/MM/YYYY'),'MM');
     
             IF (moisDepart > moisRetour) THEN
                FOR x in moisDepart..12 LOOP
                   PIPE ROW(x);
                END LOOP;
                FOR x in 1..moisRetour LOOP
                   PIPE ROW(x);
                END LOOP;
             ELSE
                FOR x in moisDepart..moisRetour LOOP
                   PIPE ROW(x);
                END LOOP;
             END IF;
          END LOOP;
          RETURN ;
       END; 
    END;
    /   
    show errors
    SELECT * FROM TABLE(p.periodeVisitees(CURSOR(select * from Visa))); 
     
    SQL> @tpl
     
    Table dropped.
     
     
    Session altered.
     
     
    Table created.
     
     
    1 row created.
     
     
    Commit complete.
     
     
    Package created.
     
    No errors.
     
    Package body created.
     
    No errors.
     
    COLUMN_VALUE
    ------------
               2
               3

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Alors je vais encore te déranger un peu je usis désolé !

    Ton code marche très bien je l'ai testé et après quelques tests, je crois avoir
    repéré d'ou vient le problème .

    Ma table visa ( je ne l'ai pas précisé ), est crée de la manière suivante :



    CREATE OR REPLACE TYPE visa_type AS OBJECT
    (
    codeVisa NUMBER,
    datedemande DATE,
    dateEntree DATE,
    dateSortie DATE,
    livreDans NUMBER,
    typeSejour VARCHAR2(10),
    motifSejour VARCHAR2(80),
    ref_Client REF client_type,
    ref_pays REF pays_type,
    ref_organisme REF organisme_type
    )
    /
    et donc ma table est :

    CREATE TABLE visa OF visa_type
    ( CONSTRAINT pk_visa PRIMARY KEY (codeVisa) );
    Et apparement quand j'utilise ma fonction sur une table visa créée avec les champs directement, ca marche, mais si je l'appelle avec la table visa avec le champ visa_type, ca ne marche pas !!

    Je dois faire quelque chose de spécial pour ca ?? :

  13. #13
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Je ne sais pas trop : D'après la doc.

    Writing a Pipelined Table Function

    You declare a pipelined table function by specifying the PIPELINED keyword. Pipelined functions can be defined at the schema level with CREATE FUNCTION or in a package. The PIPELINED keyword indicates that the function returns rows iteratively. The return type of the pipelined table function must be a supported collection type, such as a nested table or a varray. This collection type can be declared at the schema level or inside a package. Inside the function, you return individual elements of the collection type. The elements of the collection type must be supported SQL datatypes, such as NUMBER and VARCHAR2. PL/SQL datatypes, such as PLS_INTEGER and BOOLEAN, are not supported as collection elements in a pipelined function.
    On peut comprendre que le type d'un élément de la collection retourné par la function pipelined ne peut être qu'un type SQL et non PL/SQL: ce qui semble exclure les types objets.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    okay
    Bon je vous remercie de m'avoir aidé !!
    Je vais essayer de trouver un autre moyen !

Discussions similaires

  1. Exécuter fonction retourant REFCURSOR depuis éditeur
    Par mercure07 dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 27/02/2009, 10h03
  2. [VB.NET] Gestion d'un lecteur WMP fonctions retour
    Par basam95 dans le forum VB.NET
    Réponses: 5
    Dernier message: 28/11/2008, 19h10
  3. Fonction "retour" dans une page
    Par literati dans le forum Débuter
    Réponses: 2
    Dernier message: 06/12/2007, 14h02
  4. Fonction retour de variable par webservice
    Par Tigrou_Giyome dans le forum Services Web
    Réponses: 1
    Dernier message: 26/01/2007, 15h35
  5. Fonction: Retour d'un SET dynamique
    Par @n@kin.be dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 16/06/2006, 15h40

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