Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & Oracle
PHP & Oracle Forum d'entraide sur Oracle avec PHP. Avant de poster -> FAQ Oracle et Cours Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Discussion fermée Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/03/2006, 18h09   #1
Invité régulier
 
Inscription : janvier 2006
Messages : 23
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 23
Points : 6
Points : 6
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 :
$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 :
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 :
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 :
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
nguthans est déconnecté   Envoyer un message privé 00
Vieux 03/03/2006, 10h20   #2
Invité régulier
 
Inscription : janvier 2006
Messages : 23
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 23
Points : 6
Points : 6
Message reposté et résolu dans le forum Oracle, voir la discussion : http://www.developpez.net/forums/sho...d.php?t=108555
nguthans est déconnecté   Envoyer un message privé 00
Discussion fermée Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h12.


 
 
 
 
Partenaires

Hébergement Web