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

PL/SQL Oracle Discussion :

Insertion CLOB dans un tableau (9i)


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 27
    Points : 11
    Points
    11
    Par défaut Insertion CLOB dans un tableau (9i)
    Bonjour,
    j'ai l'erreur suivante lorsque je chercue à insérer un clob dans un tableau :
    ORA-22922: nonexistent LOB value
    Aucune erreur de compilation, mais problème à l'exécution.

    Merci de votre aide

    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
     
    CREATE TYPE AF_obj_row_DATAS AS OBJECT 
    (
    	AF_CDL_LIB		VARCHAR2(255),
    	AF_PAYS_LIB		VARCHAR2(255),
    	AF_COURTIERS_NOM	CLOB
    }
     
    CREATE TYPE AF_obj_table_DATAS AS TABLE OF AF_obj_row_DATAS;
     
    CREATE FUNCTION AF_GET_DATAS_REPORT ()
         RETURN AF_obj_table_DATAS AS
    	v_tab AF_obj_table_DATAS := AF_obj_table_DATAS();
    	strCDL VARCHAR2(255);
    	strPays VARCHAR2(255);
    	strCourtierListe CLOB;
     
    BEGIN
           strCDL := 'toto';
           strPays := 'titi';
           strCourtierListe := 'blablabla';
     
            v_tab.extend;
            v_tab(v_tab.last) := AF_obj_row_DATAS
            (        
    	    strCDL,
    	    strPays,
    	    strCourtierListe
            );
      RETURN v_tab;
    END;

  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
    Je ne suis pas certain que vous puissiez insérer un CLOB tel quel.
    je pense qu'il faut d'abord insérer un CLOB null avec empty_CLOB() et ensuite faire un update de ce CLOB ou alors l'écrire avec DBMS_LOB.WRITE().
    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 à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    Merci pour la réponse.
    J'ai déjà lu des choses similaires sur le net mais je n'arrive pas à comprendre comment on utilise ces fonctions DBMS_LOB,
    et surtout tous les exemples que j'ai croisé sont basé sur de tables (SELECT, INSERT, ...) et non sur un tableau d'enregistrement comme dans mon code.

    Si tu pouvais détailler un peu plus ça serait sympa.
    Merci d'avance

  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
    Bizarre, votre code fonctionne sans erreur avec ma base 9i

    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
    Connecté à :
    Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.5.0 - Production
     
      1  CREATE TYPE AF_obj_row_DATAS AS OBJECT
      2  (
      3   AF_CDL_LIB  VARCHAR2(255),
      4   AF_PAYS_LIB  VARCHAR2(255),
      5   AF_COURTIERS_NOM CLOB
      6* )
    SQL> /
     
    Type créé.
     
    SQL> CREATE TYPE AF_obj_table_DATAS AS TABLE OF AF_obj_row_DATAS;
      2  /
     
    Type créé.
     
      1  CREATE or replace FUNCTION AF_GET_DATAS_REPORT
      2       RETURN AF_obj_table_DATAS AS
      3   v_tab AF_obj_table_DATAS := AF_obj_table_DATAS();
      4   strCDL VARCHAR2(255);
      5   strPays VARCHAR2(255);
      6   strCourtierListe CLOB;
      7  BEGIN
      8         strCDL := 'toto';
      9         strPays := 'titi';
     10         strCourtierListe := 'blablabla';
     11          v_tab.EXTEND;
     12          v_tab(v_tab.LAST) := AF_obj_row_DATAS
     13          (
     14       strCDL,
     15       strPays,
     16       strCourtierListe
     17          );
     18    RETURN v_tab;
     19* END;
    SQL> /
     
    Fonction créée.
     
    SQL> 
     
    SQL> DECLARE
      2   v AF_obj_table_DATAS ;
      3  BEGIN
      4  v := AF_GET_DATAS_REPORT ;
      5  END;
      6  /
     
    Procédure PL/SQL terminée avec succès.
     
    SQL>
    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
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par SheikYerbouti Voir le message
    Bizarre, votre code fonctionne sans erreur avec ma base 9i
    Je suis bien content pour vous
    Je suis également sur la version 9.2.0.5.0 et ça ne fonctionne pourtant pas.


  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
    Effacez tout et faites un copier/coller de mon propre code. Il n'y a aucune raison. (d'ailleurs, il y avait une erreur de syntaxe dans votre code d'origine)
    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 à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    Le code que j'ai fourni n'étant qu'un exemple et non ma vrai procédure, j'ai effectivement recopié votre code lorsque vous m'avez dit que ça marchait chez vous, histoire d'être bien sur que le problème ne se trouvait pas ailleur.

    Et le problème est bien sur l'insertion du clob : si je met Null à la place de strCourtierListe, ça passe.

  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
    qu'entendez-vous par "insertion" du CLOB ?
    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 à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par SheikYerbouti Voir le message
    qu'entendez-vous par "insertion" du CLOB ?
    Ben, lors de la création de l'enregistrement la valeur du clob est "inséré" dans la table.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    Pouvez-vous essayer d'appeler la procédure comme je le fais :

    select * from Table(af_get_datas_report)

    Merci d'avance

  11. #11
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par jollt Voir le message
    Pouvez-vous essayer d'appeler la procédure comme je le fais :

    select * from Table(af_get_datas_report)

    Merci d'avance
    Avez-vous declarée que c'est une fonction pipelined ?

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Avez-vous declarée que c'est une fonction pipelined ?

    Non. Je n'ai rien fait de plus que ce qui est écrit dans mon code.
    Qu'est-ce que c'est?

  13. #13
    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 jollt Voir le message
    Ben, lors de la création de l'enregistrement la valeur du clob est "inséré" dans la table.
    Quel enregistrement, quelle table ?
    Lorsque j'exécute la fonction le CLOB est bien créé avec son texte dans l'objet précédemment créé.
    S'agit-il de code ultérieur que vous 'auriez pas donné ?
    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

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par SheikYerbouti Voir le message
    S'agit-il de code ultérieur que vous 'auriez pas donné ?
    Non, il s'agissait juste d'un raccourci pour dire que le plantage avait lieu sur l'instruction v_tab(v_tab.LAST) := AF_obj_row_DATAS(strCDL, strPays, strCourtierListe);

    Quoiqu'il en soit, je suis aller jeter un oeil aux procédures pipelined, j'ai modifié mon code en conséquence, il il s'avère que ça marche trés bien!!!

    Merci pour le tuyau. Ca ne m'explique pas pourquoi ça marchait chez vous et pas chez moi avec l'ancienne méthode, mais l'important est d'avoir trouvé une solution.

    Voici le code Pipelined si ça peut intéresser quelqu'un :
    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
    CREATE TYPE AF_obj_row_DATAS AS OBJECT 
    (
    	AF_CDL_LIB VARCHAR2(255),
    	AF_COURTIERS_NOM CLOB,
    	AF_PAYS_LIB VARCHAR2(255)
    );
    /
     
     
    CREATE TYPE AF_obj_table_DATAS AS TABLE OF AF_obj_row_DATAS;
    /
     
    CREATE FUNCTION AF_GET_DATAS_REPORT (in_Cli_Id IN NUMBER DEFAULT 13)
    RETURN AF_obj_table_DATAS PIPELINED AS
    	strCDL VARCHAR2(255);
    	strPays VARCHAR2(255);
    	strCourtierListe CLOB;
     
    	BEGIN
    		strCDL := 'toto';
    		strPays := 'titi';
    		strCourtierListe := 'blablabla';
     
    		PIPE ROW (
    			AF_obj_row_DATAS( 
    						strCDL,
    						strCourtierListe,
    						strPays
    					)
    			);
    		return;
    	END;

  15. #15
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par jollt Voir le message
    ...Ca ne m'explique pas pourquoi ça marchait chez vous et pas chez moi avec l'ancienne méthode, mais l'important est d'avoir trouvé une solution.
    ...
    Il est également important de comprendre pourquoi. Si vous voulez écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Selectfrom table(proc)
    vous devez déclarer proc comme étant une procédure pipelined. Sinon vous pouvez l’utiliser comme dans l’exemple du SheikYerbouti

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Il est également important de comprendre pourquoi. Si vous voulez écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Selectfrom table(proc)
    vous devez déclarer proc comme étant une procédure pipelined
    En dehors de ce problème de CLOB, la syntaxe "Select… from table(proc)" marche trés bien même si la fonction n'est pas déclarée comme Pipelined

    La seule différence que j'ai vu entre les 2 fonctions est l'affectation des valeurs.

  17. #17
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par jollt Voir le message
    En dehors de ce problème de CLOB, la syntaxe "Select… from table(proc)" marche trés bien même si la fonction n'est pas déclarée comme Pipelined
    Vous avez raison dans votre cas.

    [Edit]
    Ca passe en Oracle 9.2.0.7.0 et en Oracle 10 (xe)
    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
     
    SQL> CREATE OR REPLACE TYPE AF_obj_row_DATAS AS OBJECT
      2  (
      3    AF_CDL_LIB    VARCHAR2(255),
      4    AF_PAYS_LIB    VARCHAR2(255),
      5    AF_COURTIERS_NOM  Clob
      6  )
      7  /
     
    Type crÚÚ.
     
    SQL> CREATE OR REPLACE TYPE AF_obj_table_DATAS AS TABLE OF AF_obj_row_DATAS
      2  /
     
    Type crÚÚ.
     
    SQL> CREATE OR REPLACE FUNCTION AF_GET_DATAS_REPORT
      2       RETURN AF_obj_table_DATAS AS
      3    v_tab AF_obj_table_DATAS := AF_obj_table_DATAS();
      4    strCDL VARCHAR2(255);
      5    strPays VARCHAR2(255);
      6    strCourtierListe clob := empty_CLOB();
      7
      8  BEGIN
      9         strCDL := 'toto';
     10         strPays := 'titi';
     11         strCourtierListe := 'blablabla';
     12
     13          v_tab.extend;
     14          v_tab(v_tab.last) := AF_obj_row_DATAS
     15          (
     16        strCDL,
     17        strPays,
     18        strCourtierListe
     19          );
     20    RETURN v_tab;
     21  END;
     22  /
     
    Fonction crÚÚe.
     
    SQL> select * from Table(af_get_datas_report)
      2  /
     
    AF_CDL_LIB
    -------------------------------------------------------------------------------
     
    AF_PAYS_LIB
    -------------------------------------------------------------------------------
     
    AF_COURTIERS_NOM
    -------------------------------------------------------------------------------
     
    toto
    titi
    blablabla
    [/Edit]

Discussions similaires

  1. [XL-2007] Insertion ligne dans un tableau par rapport à un fichier d'origine
    Par XceSs dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/01/2011, 14h05
  2. Insertion automatique dans un tableau
    Par bibifoke dans le forum C#
    Réponses: 14
    Dernier message: 27/12/2010, 15h00
  3. INSERT INTO dans un tableau
    Par mihaispr dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/11/2009, 13h00
  4. Insertion bouton dans un tableau
    Par sisi37 dans le forum Composants
    Réponses: 3
    Dernier message: 27/10/2008, 15h06
  5. Insertion vbTab dans un tableau
    Par ataya dans le forum VBA Word
    Réponses: 4
    Dernier message: 12/02/2008, 13h38

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