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

PHP & Base de données Discussion :

Oracle, Clob, procédures stockées, OCI_bind_by_name... [Oracle]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 23
    Points : 19
    Points
    19
    Par défaut Oracle, Clob, procédures stockées, OCI_bind_by_name...
    Salut !

    Mon problème :

    Je veux passer une très grande chaine de charactère (php donc ilimitée) en paramètre d'une procédure stockée oracle (paramètre de type CLOB)

    voici l'appel de la fonction qui lance la procédure stockée oracle ($Strmotstexts représente la très grande chaine...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $bdd->ProcStocDoc($Iddoc,$Idvers,$Idtype,$Libref,$Fichier->SaveFileNameExtLess,$Datedebval,$Datefinval,$Strmotscles,$Strauteurs,$Strmotstexts,$Strliens);
    voici la fonction qui lance la procédure stockée oracle :

    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
    public function ProcStocDoc(&$Iddoc,&$Idvers,&$Idtype,&$Libref,&$Libdoc,&$Datedebval,
                                  &$Datefinval,&$Strmotscles,&$Strauteurs,&$Strmotstext,&$Strliens)
      {
          $requete = "BEGIN cre_document(:doc_no, :vers_no, :doc_type, :doc_ref, :doc_lib, :doc_datedebval,
                     :doc_datefinval, :doc_tabmotscles, :doc_tabauteurs, :doc_tabmotstext, :doc_tabliens); END;";
     
          $this->prepareRequete($requete);
     
          oci_bind_by_name($this->ressource1, ":doc_no", $Iddoc, 8);
          oci_bind_by_name($this->ressource1, ":vers_no", $Idvers, 10);
          oci_bind_by_name($this->ressource1, ":doc_type", $Idtype, 6);
          oci_bind_by_name($this->ressource1, ":doc_ref", $Libref, 20);
          oci_bind_by_name($this->ressource1, ":doc_lib", $Libdoc, 255);
          oci_bind_by_name($this->ressource1, ":doc_datedebval", $Datedebval, 10);
          oci_bind_by_name($this->ressource1, ":doc_datefinval", $Datefinval, 10);
          oci_bind_by_name($this->ressource1, ":doc_tabmotscles", $Strmotscles, 4000);
          oci_bind_by_name($this->ressource1, ":doc_tabauteurs", $Strauteurs, 4000);
          // Attention la liste des mots contenue dans le texte du document requiere un CLOB (4Go)...
          $clob = oci_new_descriptor($this->ressource, OCI_D_LOB);
          oci_bind_by_name($this->ressource1, ":doc_tabmotstext", $clob, -1, OCI_B_CLOB);     
          $clob->write($Strmotstext);
          oci_bind_by_name($this->ressource1, ":doc_tabliens", $Strliens, 4000);
          $this->executeRequete();
          $clob->free();  
      }

    Et enfin la procédure stockée elle même :
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    create or replace procedure CRE_DOCUMENT(
    doc_no IN OUT varchar2,
    vers_no IN OUT varchar2,
    doc_type IN varchar2,
    doc_ref IN varchar2,
    doc_lib IN varchar2,
    doc_datedebval IN varchar2,
    doc_datefinval IN varchar2,
    doc_tabmotscles IN varchar2,
    doc_tabauteurs IN varchar2,
    doc_tabmotstext IN CLOB,
    doc_tabliens IN varchar2) is
     
     
     chaine_motcle varchar2(4000);
     motcle varchar2(10);
     longueur number(10);
     pos number(10);
     
     
    begin
     
        /* CREATION DU DOCUMENT */
        select gdono into doc_no from gdidocument where gdolib = doc_lib;
        IF doc_no is not null THEN
              select SEQGDIDOC.nextval into doc_no from dual;
              IF doc_ref is not null THEN
                 IF doc_datefinval is not null THEN
                    insert into gdidocument values (doc_no,doc_type,doc_ref,doc_lib,doc_datedebval,doc_datefinval);
                 ELSE
                    insert into gdidocument values (doc_no,doc_type,doc_ref,doc_lib,doc_datedebval,null);
                 END IF;
              ELSE
                 IF doc_datefinval is not null THEN
                    insert into gdidocument values (doc_no,doc_type,null,doc_lib,doc_datedebval,doc_datefinval);
                 ELSE
                    insert into gdidocument values (doc_no,doc_type,null,doc_lib,doc_datedebval,null);
                 END IF; 
              END IF;
     
              /* ASSOCIATION DES MOTS CLES AVEC LE DOCUMENT CREE */
              IF (doc_tabmotscles is not null) THEN
                  chaine_motcle := doc_tabmotscles;
                  longueur := length(chaine_motcle);
                  WHILE longueur !=0 LOOP
                        pos := instr(chaine_motcle, ',');
                        IF pos != 0 THEN
                           motcle := substr(chaine_motcle,1,pos-1);
                           chaine_motcle := substr(chaine_motcle,pos+1,longueur);
                           longueur := length(chaine_motcle);                   
                        ELSE
                           motcle := substr(chaine_motcle,1,longueur);
                        END IF;
                        insert into gdidisposer values(doc_no,motcle);
                  END LOOP;         
              END IF; 
     
              /* CREATION DE LA PREMIERE VERSION ASSOCIE AU DOCUEMNT */
              cre_version(vers_no,doc_no,doc_tabauteurs,doc_tabmotstext,doc_tabliens);         
     
        END IF;
     
     
        COMMIT WORK;
     
     
     
    end CRE_DOCUMENT;
    A l'execution j'ai l'erreur suivante qui s'affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: OCI-Lob::write() [function.write]: OCILobGetLength: OCI_INVALID_HANDLE in C:\www\monsite\include\oracle.class.php on line 169
    Et bien sûr une erreur oci_execute() qui en découle...

    Je pense que le problème vient de la fonction ci_new_descriptor qui ne créer pas le clob...


    HELP ME Please !! Je suis désespérer...


    PS: Apache/2.0.54 (Win32) PHP/5.0.5 Oracle9i

    Essai sous Firefox
    Editeur PSPad
      0  0

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    Message reposté et résolu dans le forum Oracle, voir la discussion : http://www.developpez.net/forums/sho...d.php?t=108555
      0  0

Discussion fermée
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 30/08/2007, 13h15
  2. Oracle - Firebird, procédures stockées
    Par zorino dans le forum Oracle
    Réponses: 2
    Dernier message: 25/10/2006, 19h58
  3. Executer procédure stockée base oracle ADOStoredProc
    Par Akei dans le forum Bases de données
    Réponses: 2
    Dernier message: 21/06/2004, 09h46
  4. procédure stockée Oracle dans delphi 6
    Par UPNE387 dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/05/2004, 10h47
  5. Réponses: 12
    Dernier message: 27/08/2003, 12h04

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