Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/09/2007, 09h45   #1
Invité de passage
 
Inscription : février 2007
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 3
Points : 1
Points : 1
Par défaut Curseur avec requete dynamique (php + procédures stockées oracle PL/SQL)

Curseur avec requete dynamique (php + procédures stockées oracle PL/SQL)

Mon but : appeler, via PHP, une procédure stockée oracle qui renvoie un flot de données (OCINewCursor, OCIParse, OCIBindByName, OCIExecute, boucle avec un OCIFetchInto) et une composition dynamique de la requête à exécuter


La procédure suivante fonctionne (du visiblement très brillant SheikYerbouti) :

DECLARE
TYPE T_EMP_ID is TABLE of EMP.empno%TYPE;
TYPE T_EMP_NAME is TABLE of EMP.ename%TYPE;
TYPE EmpCurTyp is REF CURSOR;
Emp_cv EmpCurTyp ;
T_Id T_EMP_ID ;
T_Nom T_EMP_NAME ;
LC$Requete VARCHAR2(256);
BEGIN
LC$Requete:= ‘SELECT emp_no, ename from EMP’ ;

OPEN Emp_cv for LC$Requete ;

FETCH Emp_cv BULK COLLECT INTO T_id, T_Nom ;

CLOSE Emp_cv ;

END;

Pourquoi ce qui suit ne fonctionne pas ?

CREATE OR REPLACE package ADMIN_MARCHE_PUB
as
TYPE liste_doc_joint_RecTyp IS RECORD (
no_doc DOC_JOINT.no_doc%type,
chem_doc DOC_JOINT.chem_doc%type,
nom_doc DOC_JOINT.nom_doc%type,
chem_rac_doc DOC_JOINT.chem_rac_doc%type
);
TYPE liste_doc_joint_CurTyp IS REF CURSOR RETURN liste_doc_joint_RecTyp ;

procedure select_doc_joint_type
(
numero_objet_in IN number,
nom_objet_in IN varchar,
mon_curseur IN OUT liste_doc_joint_CurTyp )
;
end ADMIN_MARCHE_PUB;

CREATE OR REPLACE package body ADMIN_MARCHE_PUB
as
procedure select_doc_joint_type
(
numero_objet_in IN number,
nom_objet_in IN varchar,
mon_curseur IN OUT liste_doc_joint_CurTyp )

is
l_req VARCHAR2(1500);

begin
l_req := 'select DOC_JOINT.no_doc, DOC_JOINT.chem_doc, DOC_JOINT.nom_doc, DOC_JOINT.chem_rac_doc
from DOC_JOINT where ' || nom_objet_in || ' = ' || numero_objet_in;

OPEN mon_curseur for l_req;

end select_doc_joint_type;
end ADMIN_MARCHE_PUB;


PL/SQL: Statement ignored
PLS-00455: cursor 'MON_CURSEUR' cannot be used in dynamic SQL OPEN statement


Merci d'avance
daniel.lemuet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2007, 00h13   #2
Membre habitué
 
Inscription : février 2006
Messages : 139
Détails du profil
Informations personnelles :
Âge : 37
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : février 2006
Messages : 139
Points : 126
Points : 126
Bonjour,

Je ne suis pas sur que le REF_CURSOR puisse être dynamique.
La requête du REF_CURSOR est pré compilée avant l'exécution.
Pour verifier, on met la requete en dur.

Cdt
kervoaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/10/2007, 08h38   #3
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Le Error Messages dit
Citation:
PLS-00455: cursor "string" cannot be used in dynamic SQL OPEN statement
Cause: dynamicly OPEN a REF CURSOR that has RETURN type. However, only REF CURSOR without RETURN type can be OPEN"ed by an embebded dynamic OPEN statement.
Action: define a REF CURSOR without return type, and use it in the statement.
Voir l'exemple dans le tutoriel section 1.2.22.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h57.


 
 
 
 
Partenaires

Hébergement Web