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...)
voici la fonction qui lance la procédure stockée oracle :
Code : Sélectionner tout - Visualiser dans une fenêtre à part $bdd->ProcStocDoc($Iddoc,$Idvers,$Idtype,$Libref,$Fichier->SaveFileNameExtLess,$Datedebval,$Datefinval,$Strmotscles,$Strauteurs,$Strmotstexts,$Strliens);
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 :
A l'execution j'ai l'erreur suivante qui s'affiche :
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;
Et bien sûr une erreur oci_execute() qui en découle...
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
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
Partager