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