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 :

[Oracle 8i] Envoyer un CLOB à une procédure stockée


Sujet :

SQL Oracle

  1. #1
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 342
    Points : 130 373
    Points
    130 373
    Billets dans le blog
    1
    Par défaut [Oracle 8i] Envoyer un CLOB à une procédure stockée
    Bonjour

    Je cherche à appeler une procédure stockée depuis .NET. Tout se passe bien tant que cette procédure stockée ne prend pas de clob en paramètres.

    J'ai essayé avec une procédure bidon comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE PROCEDURE procedure_bidon (
      i_id in table_bidon.id%type,
      i_description in out table_bidon.description%type
    )
    is BEGIN
      INSERT INTO table_bidon(id, description)
      VALUES(i_id, EMPTY_CLOB())  
      RETURNING description INTO I_description;
    END;
    La déclaration IN OUT du clob est ainsi pour la procédure que je cherche à appeler, c'est pour ça que je l'appelle ainsi.

    Maintenant, comment appeler cette procédure ?

    J'ai essayé quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    begin; procedure_bidon(5, empty_clob()); end;
    Il le refuse, probablement à cause du clob en IN/OUT. Comment pourrais-je en PL/SQL, appeler cette procédure avec le clob de mon choix (une chaîne de caractères) ?

    Merci beaucoup de vos réponses.

  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 Re: Procédure stockée avec paramètre CLOB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    begin; procedure_bidon(5, empty_clob()); end;
    la variable étant IN OUT, elle doit être déclarée initialement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    declare
    my_clob  CLOB;
    begin
    procedure_bidon(5, my_clob);
    end;

  3. #3
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 342
    Points : 130 373
    Points
    130 373
    Billets dans le blog
    1
    Par défaut Re: Procédure stockée avec paramètre CLOB
    J'avais bien fait quelque chose dans ce genre, mais comment fais-t-on pour initialiser le CLOB en question.

    J'aimerais faire quelque chose de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    declare
    my_clob  CLOB;
    begin
    my_clob := 'voilà la valeur que je voudrais mettre si possible';
    procedure_bidon(5, my_clob);
    end;
    Mais évidemment ça ne fonctionne pas

  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
    qu'entendez-vous par "ça ne fonctionne pas" ?

  5. #5
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 342
    Points : 130 373
    Points
    130 373
    Billets dans le blog
    1
    Par défaut
    Hé bien il refuse l'assignation de la chaîne : j'obtiens l'erreur "ORA-06550: expression du mauvais type"

    J'utilise Oracle 8 et j'ai testé ceci sous PL/SQL developer.

  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
    Tiens donc !

    voici ce que j'obtiens :

    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
      1  declare
      2  my_lob CLOB;
      3  begin
      4  my_lob := 'coucou';
      5    dbms_output.put_line ( substr(my_lob,1,100));
      6* end;
    SQL> /
     
    PL/SQL procedure successfully completed.
     
    SQL> set serveroutput on
    SQL> /
    coucou
     
    PL/SQL procedure successfully completed.
     
    SQL>

  7. #7
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 342
    Points : 130 373
    Points
    130 373
    Billets dans le blog
    1
    Par défaut
    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
    SQL> declare
      2  my_lob clob;
      3  begin
      4  my_lob := 'coucou';
      5  dbms_output.put_line(substr(my_lob, 1, 100));
      6  end;
      7  /
    my_lob := 'coucou';
              *
    ERREUR à la ligne 4 :
    ORA-06550: Ligne 4, colonne 11 :
    PLS-00382: expression du mauvais type
    ORA-06550: Ligne 4, colonne 1 :
    PL/SQL: Statement ignored
    ORA-06550: Ligne 5, colonne 21 :
    PLS-00306: numéro ou types d'arguments erronés dans appel à 'SUBSTR'
    ORA-06550: Ligne 5, colonne 1 :
    PL/SQL: Statement ignored
    Je crois que ton sql plus est plus tolérant que le mien... tu as quel oracle ?


  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
    9.2.0.3.0

  9. #9
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 342
    Points : 130 373
    Points
    130 373
    Billets dans le blog
    1
    Par défaut
    Bon ben moi j'ai la 8.1.7.0.0... quelqu'un aurait-il une solution ? Autre bien entendu que d'upgrader Oracle, cela m'étonnerait que affecter un clob fasse partie des nouvelles fonctions d'Oracle 9

  10. #10
    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 n'avez pas besoin de plus de 2000 caractères vous pouvez utiliser un pis-aller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    declare
      my_lob varchar2(2000) := 'coucou' ;
    begin
     my_proc( id..., my_lob IN OUT varchar2 );
    ...
    End;
    et l'insert dans le CLOB avec la variable Varchar2 fonctionnera.

    ou alors, il faut passer par les fonctions DBMS_LOB()

  11. #11
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 342
    Points : 130 373
    Points
    130 373
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SheikYerbouti
    ou alors, il faut passer par les fonctions DBMS_LOB()
    Justement, étant plutôt débutant, j'aimerais bien savoir utiliser dbms_lob() ou avoir une url l'expliquant (ça me gène la limitation à 2000 caractères, mon patron ne va pas comprendre )

    Je rappelle mon problème, qui n'est pas en fait lié à une procédure stockée.

    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
    SQL> declare
      2  var varchar2(100);
      3  begin
      4  var := 'bonjour';
      5  end;
      6  /
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> declare
      2  var clob;
      3  begin
      4  var := 'bonjour';
      5  end;
      6  /
    var := 'bonjour';
           *
    ERREUR à la ligne 4 :
    ORA-06550: Ligne 4, colonne 8 :
    PLS-00382: expression du mauvais type
    ORA-06550: Ligne 4, colonne 1 :
    On voit que l'affectation d'une chaîne à un varchar2 est accepté, mais pas pour un CLOB. Dans Oracle 9, il n'y a pas d'erreur, alors comment faire dans Oracle 8 pour affecter un CLOB?

  12. #12
    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
    Le mieux que l'on puisse faire en initialisation directe sous Oracle 8 est l'exemple suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    declare
    bigtext     VARCHAR(32767);  
    begin
      bigtext := LPAD('a', 32767, 'a');
      update fiches_emission
      set commentaire = bigtext;
    end;
    ce qui vous autorise 32K.

  13. #13
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 342
    Points : 130 373
    Points
    130 373
    Billets dans le blog
    1
    Par défaut
    Bon après avoir longtemps tatonné, j'ai compris le problème. J'ai longtemps essayé de remplir mes lobs avec dbms_lob.write() mais simplement je n'avais pas bien ingurgité le fait que la procédure stockée renvoyait un lob à remplir, et au lieu de prendre en paramètre un lob prérempli. On fait difficilement plus ergonomique, mais bon maintenant ça marche enfin après 20h de travail rien que là-dessus.



    Merci à toi, SheikYerbouti, d'avoir tenté de m'aider. Ton indication sur l'existence de dbms_lob m'a orienté

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 01/10/2007, 18h40
  2. Réponses: 3
    Dernier message: 10/04/2007, 13h53
  3. Réponses: 1
    Dernier message: 16/03/2007, 11h46
  4. Réponses: 2
    Dernier message: 05/12/2005, 16h39
  5. Envoyer un mail depuis une procédure stockée
    Par bd0606 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 03/10/2005, 11h51

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