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

SQL Oracle Discussion :

pb de tableau en pl sql


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 28
    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

  2. #2
    Expert confirmé
    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
    Par défaut
    Déclarez le type dans les spécifications du package et utilisez ce type pour déclarer votre variable externe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Declare
      ma_var   pk_test.t1 ;
    Begin
      ma_var := ...
      ...

  3. #3
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 28
    Par défaut
    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;

  4. #4
    Expert confirmé
    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
    Par défaut
    Cette erreur survient sur quelle ligne de code ?

  5. #5
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 28
    Par défaut
    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

  6. #6
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT *
    FROM TABLE (tp.quest_sem.segment_sem(to_date('12/10/2007','DD/MM/YYYY')))

  7. #7
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 28
    Par défaut
    ça ne marche toujours pas

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Par défaut
    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 ...

  9. #9
    Expert confirmé
    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
    Par défaut
    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)

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Par défaut
    Voici un petit exemple qui marche:
    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
     
    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

  11. #11
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 28
    Par défaut
    wiiiii ça marche
    merci infiniment pour votre aide

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 137
    Par défaut
    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) :

    SELECT *
    FROM THE (
    SELECT cast( variable_type_perso AS type_perso )
    FROM dual
    ) a

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

Discussions similaires

  1. Utilisation de tableau en Transact-SQL
    Par Adi81 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 21/02/2011, 12h36
  2. Récupération de données tableau en PL/SQL
    Par sbonidan dans le forum PL/SQL
    Réponses: 1
    Dernier message: 23/01/2007, 13h23
  3. tableau descriptif de SQL server selon des critères techniq
    Par h.sofia dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/02/2006, 16h25
  4. [MySQL] Remplir un tableau par requêtes sql
    Par Melekitto dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 11/02/2006, 17h30
  5. Un tableau et du SQL
    Par mael94420 dans le forum ASP
    Réponses: 1
    Dernier message: 06/01/2006, 19h43

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