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 :

[10r1] Collection Type : erreur 'Reference to uninitialized composite'


Sujet :

SQL Oracle

  1. #1
    Membre régulier Avatar de DoRiane
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 127
    Points : 110
    Points
    110
    Par défaut [10r1] Collection Type : erreur 'Reference to uninitialized composite'
    Bonjour,
    j'ai un objet type et une collection de ce type
    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
     
    CREATE OR REPLACE
    TYPE RemisLifa IS OBJECT (
    	sType INTEGER,
    	idG INTEGER,
    	versG INTEGER,
    	iBaseA VARCHAR2(10),
    	iAchat NUMBER,
    	iUtilA CHAR(1),
    	iBaseV VARCHAR2(10),
    	iVente NUMBER
    );
     
    CREATE OR REPLACE
    TYPE RemisLifaTab IS TABLE OF RemisLifa;
    jusque la tout va bien, j'arrive a les utiliser dans mon code plsql et tout compil e bien. mais quand je veux executer le tout j'ai une erreur ORA-06530: Reference to uninitialized composite à la ligne en rouge

    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
    PROCEDURE INIT_TAB_REMIS_ID(sGrille_Id IN NUMBER, sGrille_Version IN NUMBER,sFabr IN VARCHAR2,MyRemisLifaTab OUT RemisLifaTab,MyRemisNisgTab OUT RemisNisgTab,MyRemisNigaTab OUT RemisNigaTab,bTrouvfabr OUT BOOLEAN) IS
    sBaseA LIFA.LIFA_BASEA%TYPE;
    sAchat LIFA.LIFA_ACHAT%TYPE;
    sUtilA LIFA.LIFA_UTILA%TYPE;
    sBaseV LIFA.LIFA_BASEV%TYPE;
    sVente LIFA.LIFA_VENTE%TYPE;
    BEGIN
    	MyRemisLifaTab := RemisLifaTab();
    	MyRemisNisgTab := RemisNisgTab();
    	MyRemisNigaTab := RemisNigaTab();
    	MyRemisLifaTab.extend;
    	MyRemisNisgTab.extend;
    	MyRemisNigaTab.extend;
    	
       	BEGIN
    		SELECT LIFA_BASEA,LIFA_ACHAT,LIFA_UTILA,LIFA_BASEV,LIFA_VENTE 
    		INTO sBaseA,sAchat,sUtilA,sBaseV,sVente
    		FROM LIFA
    		WHERE LIFA_GRIL_ID = sGrille_Id AND LIFA_GRIV_VERSION = sGrille_Version
    		AND LIFA_FABR_LIDIC = sFabr;
    
    		MyRemisLifaTab(MyRemisLifaTab.COUNT).idG   := sGrille_Id;
       		MyRemisLifaTab(MyRemisLifaTab.COUNT).versG := sGrille_Version;
       		MyRemisLifaTab(MyRemisLifaTab.COUNT).sType := 0;
    		MyRemisLifaTab(MyRemisLifaTab.COUNT).iBaseA := sBaseA;
    		MyRemisLifaTab(MyRemisLifaTab.COUNT).iAchat := sAchat;
    		MyRemisLifaTab(MyRemisLifaTab.COUNT).iUtilA := sUtilA;
    		MyRemisLifaTab(MyRemisLifaTab.COUNT).iBaseV := sBaseV;
    		MyRemisLifaTab(MyRemisLifaTab.COUNT).iVente := sVente;
    		bTrouvfabr := TRUE;
    je précise que
    sGrille_Id est non null
    sGrille_Version est non null
    sBaseV est non null
    les autres variables le sont.

    Si qq1 à une idée,...
    Bonne journée

  2. #2
    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
    Bonjour,

    Vous devez également initialiser les objets contenus dans la collection:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
    MyRemisLifaTab := RemisLifaTab();
    Loop
       MyRemisLifaTab.extend;
       MyRemisLifaTab(MyRemisLifaTab.COUNT) := NEW RemisLifa(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) ;
    End loop ;
    ...
    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

  3. #3
    Membre régulier Avatar de DoRiane
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 127
    Points : 110
    Points
    110
    Par défaut
    Merci,
    je pensais pas qu'il fallait aussi initialiser le type objet.
    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
     
    PROCEDURE INIT_TAB_REMIS_ID(sGrille_Id IN NUMBER, sGrille_Version IN NUMBER,sFabr IN VARCHAR2,MyRemisLifaTab OUT RemisLifaTab,MyRemisNisgTab OUT RemisNisgTab,MyRemisNigaTab OUT RemisNigaTab,bTrouvfabr OUT BOOLEAN) IS
    sBaseA LIFA.LIFA_BASEA%TYPE;
    sAchat LIFA.LIFA_ACHAT%TYPE;
    sUtilA LIFA.LIFA_UTILA%TYPE;
    sBaseV LIFA.LIFA_BASEV%TYPE;
    sVente LIFA.LIFA_VENTE%TYPE;
    BEGIN
    	MyRemisLifaTab := RemisLifaTab();
    	MyRemisNisgTab := RemisNisgTab();
    	MyRemisNigaTab := RemisNigaTab();
    	MyRemisLifaTab.extend;
    	MyRemisNisgTab.extend;
    	MyRemisNigaTab.extend;
     
       	BEGIN
    		SELECT LIFA_BASEA,LIFA_ACHAT,LIFA_UTILA,LIFA_BASEV,LIFA_VENTE 
    		INTO sBaseA,sAchat,sUtilA,sBaseV,sVente
    		FROM LIFA
    		WHERE LIFA_GRIL_ID = sGrille_Id AND LIFA_GRIV_VERSION = sGrille_Version
    		AND LIFA_FABR_LIDIC = sFabr;
    		MyRemisLifaTab(MyRemisLifaTab.COUNT) := NEW RemisLifa(0,sGrille_Id,sGrille_Version,sBaseA,sAchat,sUtilA,sBaseV,sVente) ;
    		bTrouvfabr := TRUE;
    	EXCEPTION WHEN NO_DATA_FOUND THEN
    	 	bTrouvfabr := FALSE;
    	END;
    	IF bTrouvfabr THEN
    		EXECUTE IMMEDIATE ' SELECT 0,'||sGrille_Id||','||sGrille_Version||',NIGA_GAMM_CODE,NIGA_BASEA,NIGA_ACHAT,NIGA_UTILA,NIGA_BASEV,NIGA_VENTE '||
    	 	  ' FROM NIGA'||
    		  ' WHERE NIGA_FABR_LIDIC = '''||sFabr||''''|| 
    		  ' AND NIGA_GRIL_ID = '||sGrille_Id|| 
    		  ' AND NIGA_GRIV_VERSION = '||sGrille_Version BULK COLLECT INTO MyRemisNigaTab;
    je pense que je dois avoir maintenant le même pb avec 'EXECUTE IMMEDIATE'. Existe-t-il une facon simple de le faire en gardant cette synthaxe ou dois-je obligatoirement faire une boucle?
    Bonne journée

  4. #4
    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
    S'il y a concordance entre le types de chaque composant de l'objet avec le type des colonnes ramenées par le Select, cela devrait fonctionner.

    Au début, faites un test sur un petit objet de 2 colonnes par example.
    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

  5. #5
    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
    Sinon, la bonne vieille boucle

    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
     
    CREATE OR REPLACE TYPE typ_dept AS OBJECT(
    DEPT NUMBER(2),
    dname VARCHAR2(30),
    loc VARCHAR2(30))
    /
    CREATE OR REPLACE TYPE typ_tab_dept IS TABLE OF typ_dept
    /
    DECLARE
      tableau typ_tab_dept := typ_tab_dept() ;
      CURSOR cc IS SELECT deptno, dname, loc FROM DEPT ;
    BEGIN
      FOR c IN cc LOOP
        EXIT WHEN cc%NOTFOUND ;
        tableau.extend ;
        tableau(tableau.COUNT) := NEW typ_dept(c.deptno, c.dname, c.loc) ;
      END LOOP ;
    END ;
    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

  6. #6
    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
    Ou alors, la table pl/sql:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    DECLARE
      TYPE typ_dept IS RECORD(
        DEPT NUMBER(2),
        dname VARCHAR2(30),
        loc VARCHAR2(30)) ;
      TYPE typ_tab_dept IS TABLE OF typ_dept INDEX BY BINARY_INTEGER ;
      tableau typ_tab_dept ;
      CURSOR cc IS SELECT deptno, dname, loc FROM DEPT ;
    BEGIN
      OPEN cc ;
      FETCH cc BULK COLLECT INTO tableau ;
      CLOSE cc ;
    END ;
    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

  7. #7
    Membre régulier Avatar de DoRiane
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 127
    Points : 110
    Points
    110
    Par défaut
    Voici ce que j'ai essayé, je ne crois pas que je puisse faire plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE OR REPLACE
    TYPE RemisNiga2 IS OBJECT (
    	sType INTEGER
    );
    /
     
    CREATE OR REPLACE
    TYPE RemisNigaTab2 IS TABLE OF RemisNiga;
    /
    et pourtant lorsque je lance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    EXECUTE IMMEDIATE ' SELECT 0'||
    	 	  ' FROM NIGA'||
    		  ' WHERE NIGA_FABR_LIDIC = '''||sFabr||''''|| 
    		  ' AND NIGA_GRIL_ID = '||sGrille_Id|| 
    		  ' AND NIGA_GRIV_VERSION = '||sGrille_Version BULK COLLECT INTO MyRemisNigaTab2;
    j'obtiens l'erreur suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ORA-00932: inconsistent datatypes: expected UDT got NUMBER
    de plus, je ne connais pas le type UDT

    Concernant le type plsql, c'est ce que j'avais avant mais je voulais créé un type oracle car je m'en sers dans plusieurs packages. En plus j'ai pensais que l'exécution serait plus rapide si j'avais un type oracle. Dites moi si je me trompe?
    Bonne journée

  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
    Si vous creez ce type dans un package, vous pourrez le référencer dans n'importe quel code pl/sql. Il deviendra global au même titre qu'un type créé dans la base.
    Quand à la question de rapidité, je ne vois aucun élément permettant de déclarer qu'une nested table est plus rapide qu'une index by table.
    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

  9. #9
    Membre régulier Avatar de DoRiane
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 127
    Points : 110
    Points
    110
    Par défaut
    Si vous creez ce type dans un package, vous pourrez le référencer dans n'importe quel code pl/sql. Il deviendra global au même titre qu'un type créé dans la base.
    Eh bien voila mon pb résolu
    un énorme merci pour votre aide et votre patience

    Je suis revenu à mon code du début en déclarant mes types dans le package plutot que dans chaque procédure.

    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
     
    CREATE OR REPLACE PACKAGE MonPkge IS
     
    TYPE RemisLifa IS RECORD (
    	 		   sType INTEGER,
    			   idG INTEGER,
    			   versG INTEGER,
    			   iBaseA VARCHAR2(10),
    			   iAchat NUMBER,
    			   iUtilA CHAR(1),
    			   iBaseV VARCHAR2(10),
    			   iVente NUMBER
    			   );
    TYPE RemisLifaTab IS TABLE OF RemisLifa INDEX BY BINARY_INTEGER;
    ...
    et ensuite quand je veux les utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyRemisLifaTab MonPkge.RemisLifaTab;
    Bonne journée

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

Discussions similaires

  1. Erreur de type undefined reference to `_imp_*'
    Par Agoudard dans le forum C++
    Réponses: 3
    Dernier message: 20/09/2012, 10h54
  2. Réponses: 6
    Dernier message: 12/05/2008, 14h56
  3. Réponses: 2
    Dernier message: 27/03/2008, 16h57
  4. Réponses: 4
    Dernier message: 30/05/2006, 19h39
  5. Treeview : Erreur "Reference to variable or parameter..
    Par Tirlibibi dans le forum XMLRAD
    Réponses: 4
    Dernier message: 06/05/2003, 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