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 :

[9i]erreur de type alors que le type est le meme...


Sujet :

Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 220
    Points : 70
    Points
    70
    Par défaut [9i]erreur de type alors que le type est le meme...
    bonjour,

    j'ai un package avec une fonction dedans, et lorsque j'execute le package, j'ai une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ORA-00902 invalid datatype
     
    Cause: The datatype entered in the CREATE or ALTER TABLE statement is not valid.
     
    Action: Correct the syntax.
    voici mon package :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE OR REPLACE PACKAGE CREER_COMPTE_EN_LIGNE
    IS
    TYPE TAB_CEL IS RECORD (
    refbp varchar2(9),
    mail char(100),
    mailok smallint,
    newsok smallint,
    code_retour smallint
    );
    FUNCTION F_CONTROLE_CEL(in_refbp varchar2) Return TAB_CEL ;
    END CREER_COMPTE_EN_LIGNE;
    /
    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
    CREATE OR REPLACE PACKAGE BODY CREER_COMPTE_EN_LIGNE
    AS
    function f_controle_cel(
    	in_refbp IN varchar2)
    	return TAB_CEL IS
    	PRAGMA AUTONOMOUS_TRANSACTION ; 
    	vc_refbp varchar2(9);
    	vc_today date;
    	vc_date_creation date;
    	vc_flagcel char;
    	vc_mail char(100);
    	vc_mailok smallint;
    	vc_newsok smallint;
    	vc_date_max date;
    	vc_total TAB_CEL;
    	BEGIN
    		SELECT CLI_FLAGCEL INTO vc_flagcel FROM CLIENT WHERE CLI_REFBP = in_refbp;
    		SELECT TRUNC(CLI_DATE_CREATION) INTO vc_date_creation FROM CLIENT WHERE CLI_REFBP = in_refbp;
    		SELECT CLI_MAIL,CLI_MAILOK,CLI_NEWSOK INTO vc_mail,vc_mailok,vc_newsok FROM CLIENT WHERE CLI_REFBP = in_refbp;
    		--DBMS_OUTPUT.PUT (vc_date_creation); 
    		vc_date_max := vc_date_creation + 15;
    		vc_today := TRUNC(sysdate);
    		IF (vc_flagcel = 'v')
    		THEN
    		vc_total.code_retour := 0;
    		commit;
    		return vc_total;
    		ELSE
    			IF (vc_flagcel = 'd')
    			THEN
    				IF (vc_date_max >= vc_today)
    				THEN
    					--DBMS_OUTPUT.PUT ('a temps');
    					 vc_total.refbp := in_refbp;
    					 vc_total.mail := vc_mail;
    					 vc_total.mailok := vc_mailok;
    					 vc_total.newsok := vc_newsok;
    					 vc_total.code_retour := 2;
    					 --DBMS_OUTPUT.PUT (vc_total.refbp);
    					 commit;
    					 return vc_total;
    				ELSE
    					 --DBMS_OUTPUT.PUT ('trop tard');
    					 vc_total.code_retour := 1;
    					 commit;
    					 return vc_total;
    				END IF;
    			END IF;
    		END IF;
    	END;
    END CREER_COMPTE_EN_LIGNE;
    /
    et lorsque j'execute ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select CREER_COMPTE_EN_LIGNE.f_controle_cel('11111') from dual
    sa ne fonctionne pas et renvoi le message d'erreur précédement cité...

    je ne comprend pas pourquoi les type ne son pas identique alors que ce sont tous des varchar2!!!

    quelqu'un pourrait me dire ou est le probleme?

    merci

    hOAx punK

  2. #2
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    essaye en ne precisant pas eulement VARCHAR2 mais VARCHAR2(9) (le type que tu utilises)

  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
    Essayez ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Declare
     
      my_rec CREER_COMPTE_EN_LIGNE.TAB_CEL ;
     
    Begin
     
      my_rec := CREER_COMPTE_EN_LIGNE.f_controle_cel('11111') 
     
      dbms_output.put_line( my_rec.refbp ) ;
     
    End ;

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 220
    Points : 70
    Points
    70
    Par défaut
    si je met varchar2(9) dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE OR REPLACE PACKAGE BODY CREER_COMPTE_EN_LIGNE
    AS
    function f_controle_cel(
    	in_refbp IN varchar(9))
    	return TAB_CEL IS
    il y a une erreur qui dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PLS-00103: Symbole "(" rencontré à la place d'un des symboles suivants :
     
       := . ) , @ % default character
    Symbole ":=" a été substitué à "(" pour continuer.
    alors qu'elle n'apparait pas si je laisse varchar2

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 220
    Points : 70
    Points
    70
    Par défaut
    SheikYerbouti

    je place ou ce bout de code???

  6. #6
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Tu ne peux pas faire de select sur une fonction qui renvoie un type déclaré dans un package.

    Il faut que tu passes par la création d'un type basé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create type montype as object (a number, b number);
    /

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 220
    Points : 70
    Points
    70
    Par défaut
    Citation Envoyé par plaineR
    Tu ne peux pas faire de select sur une fonction qui renvoie un type déclaré dans un package.

    Il faut que tu passes par la création d'un type basé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create type montype as object (a number, b number);
    /
    je suis desolé mais je ne comprend pas

  8. #8
    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
    Citation Envoyé par hoaxpunk
    SheikYerbouti

    je place ou ce bout de code???
    Comme dit plus haut par PlaineR, vous ne pouvez pas utuliser un type RECORD directement sous SQL.
    L'exemple que je vous donne permet d'obtenir le résultat dans un bloc PL/SQL

  9. #9
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Tu cherches à afficher dans une requête select une colonne résultant d'une fonction qui renvoie un type déclaré dans un package (TAB_CEL). Or cela n'est pas possible.

    Ce qu'il faut faire dans ce cas c'est créer un type basé de la manière indiquée. En reprenant ton exemple cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TYPE TAB_CEL AS OBJECT ( 
    refbp varchar2(9), 
    mail char(100), 
    mailok smallint, 
    newsok smallint, 
    code_retour smallint 
    ); 
    /
    Puis pour ton package :
    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
    CREATE OR REPLACE PACKAGE CREER_COMPTE_EN_LIGNE 
    IS 
    FUNCTION F_CONTROLE_CEL(in_refbp varchar2) Return TAB_CEL ; 
    END CREER_COMPTE_EN_LIGNE; 
    / 
    CREATE OR REPLACE PACKAGE BODY CREER_COMPTE_EN_LIGNE 
    AS 
    function f_controle_cel( 
       in_refbp IN varchar2) 
       return TAB_CEL IS 
       PRAGMA AUTONOMOUS_TRANSACTION ; 
       vc_refbp varchar2(9); 
       vc_today date; 
       vc_date_creation date; 
       vc_flagcel char; 
       vc_mail char(100); 
       vc_mailok smallint; 
       vc_newsok smallint; 
       vc_date_max date; 
       vc_total TAB_CEL; 
       BEGIN 
          SELECT CLI_FLAGCEL INTO vc_flagcel FROM CLIENT WHERE CLI_REFBP = in_refbp; 
          SELECT TRUNC(CLI_DATE_CREATION) INTO vc_date_creation FROM CLIENT WHERE CLI_REFBP = in_refbp; 
          SELECT CLI_MAIL,CLI_MAILOK,CLI_NEWSOK INTO vc_mail,vc_mailok,vc_newsok FROM CLIENT WHERE CLI_REFBP = in_refbp; 
          --DBMS_OUTPUT.PUT (vc_date_creation); 
          vc_date_max := vc_date_creation + 15; 
          vc_today := TRUNC(sysdate); 
          IF (vc_flagcel = 'v') 
          THEN 
          vc_total.code_retour := 0; 
          commit; 
          return vc_total; 
          ELSE 
             IF (vc_flagcel = 'd') 
             THEN 
                IF (vc_date_max >= vc_today) 
                THEN 
                   --DBMS_OUTPUT.PUT ('a temps'); 
                    vc_total.refbp := in_refbp; 
                    vc_total.mail := vc_mail; 
                    vc_total.mailok := vc_mailok; 
                    vc_total.newsok := vc_newsok; 
                    vc_total.code_retour := 2; 
                    --DBMS_OUTPUT.PUT (vc_total.refbp); 
                    commit; 
                    return vc_total; 
                ELSE 
                    --DBMS_OUTPUT.PUT ('trop tard'); 
                    vc_total.code_retour := 1; 
                    commit; 
                    return vc_total; 
                END IF; 
             END IF; 
          END IF; 
       END; 
    END CREER_COMPTE_EN_LIGNE; 
    /
    Et là tu pourras exécuter ta requête.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 220
    Points : 70
    Points
    70
    Par défaut
    j'ai bien créer mon objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TYPE TAB_CEL AS OBJECT ( 
    refbp varchar2(9), 
    mail char(100), 
    mailok smallint, 
    newsok smallint, 
    code_retour smallint 
    );
    il aparait bien dans les type d'oracle.

    j'ai ensuite modifier mon code :

    spec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE OR REPLACE PACKAGE PK_CREER_COMPTE_EN_LIGNE 
    IS 
    FUNCTION F_CONTROLE_CEL(in_refbp varchar2) Return TAB_CEL ; 
    END PK_CREER_COMPTE_EN_LIGNE; 
    /
    body:
    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
    CREATE OR REPLACE PACKAGE BODY PK_CREER_COMPTE_EN_LIGNE 
    AS 
    function f_controle_cel( 
       in_refbp IN varchar2) 
       return TAB_CEL IS 
       PRAGMA AUTONOMOUS_TRANSACTION ; 
       vc_refbp varchar2(9); 
       vc_today date; 
       vc_date_creation date; 
       vc_flagcel char; 
       vc_mail char(100); 
       vc_mailok smallint; 
       vc_newsok smallint; 
       vc_date_max date; 
       vc_total TAB_CEL; 
       BEGIN 
          SELECT CLI_FLAGCEL INTO vc_flagcel FROM CLIENT WHERE CLI_REFBP = in_refbp; 
          SELECT TRUNC(CLI_DATE_CREATION) INTO vc_date_creation FROM CLIENT WHERE CLI_REFBP = in_refbp; 
          SELECT CLI_MAIL,CLI_MAILOK,CLI_NEWSOK INTO vc_mail,vc_mailok,vc_newsok FROM CLIENT WHERE CLI_REFBP = in_refbp; 
          --DBMS_OUTPUT.PUT (vc_date_creation); 
          vc_date_max := vc_date_creation + 15; 
          vc_today := TRUNC(sysdate); 
          IF (vc_flagcel = 'v') 
          THEN 
          vc_total.code_retour := 0; 
          commit; 
          return vc_total; 
          ELSE 
             IF (vc_flagcel = 'd') 
             THEN 
                IF (vc_date_max >= vc_today) 
                THEN 
                   --DBMS_OUTPUT.PUT ('a temps'); 
                    vc_total.refbp := in_refbp; 
                    vc_total.mail := vc_mail; 
                    vc_total.mailok := vc_mailok; 
                    vc_total.newsok := vc_newsok; 
                    vc_total.code_retour := 2; 
                    --DBMS_OUTPUT.PUT (vc_total.refbp); 
                    commit; 
                    return vc_total; 
                ELSE 
                    --DBMS_OUTPUT.PUT ('trop tard'); 
                    vc_total.code_retour := 1; 
                    commit; 
                    return vc_total; 
                END IF; 
             END IF; 
          END IF; 
       END; 
    END PK_CREER_COMPTE_EN_LIGNE; 
    /
    et j'ai cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ORA-06530 Reference to uninitialized composite
     
    Cause: An object, LOB, or other composite was referenced as a left hand side without having been initialized.
     
    Action: Initialize the composite with an appropriate constructor or whole-object assignment.
    lorsque j'execute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select PK_CREER_COMPTE_EN_LIGNE.f_controle_cel('11111') from dual

  11. #11
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Exact, j'ai oublié de corriger cette ligne dans ton package :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vc_total TAB_CEL := TAB_CEL (null, null, null, null, null);

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 220
    Points : 70
    Points
    70
    Par défaut
    merci beaucoup, sa fonctionne mieux beaucoup mieux

  13. #13
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut
    J'ai bien suivi le post, et découvert qu'un select pouvait retourner un record.

    Cependant les résultats sont sous forme (xx;dddd;fnkdfo) il y a t il une solution de "split" un peu comme une fonction qui retourne un tableau de record et est utilisable comme une table
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from table(f_ret_tableau_client_en_contentieux)
    Donc avec un record cela donnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select SPLIT(PK_CREER_COMPTE_EN_LIGNE.f_controle_cel('11111'),';') from dual;
    Résutat  :
    CHAMPS1    CHAMPS2 ...
    Val1       Val2 ....
    Merci d'avance

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/01/2013, 11h47
  2. Réponses: 8
    Dernier message: 07/07/2010, 09h58
  3. [MySQL] Erreur sql alors que la requête est correcte sur mysql
    Par toshiro92 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 08/04/2009, 23h58
  4. MySQL ne renvoie pas d'erreur alors que la chaine est fausse
    Par repié dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 07/11/2007, 12h18
  5. Réponses: 28
    Dernier message: 23/08/2007, 11h19

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