Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
Environnement:
- Window XP,
- PB12.5
- Base de données Oracle par ODBC.
Je tente d'exécuter une procédure stockées oracle par RPCFUNC.
A la compilation aucun message ne s'affiche.
A l'exécution j'obtiens: SQLSTATE = 37000
[ORACLE][ODBC]Syntax or access vilation
Même en créant un datawindow basé sur la procédure stockée c'est ce message qui s'affiche.
Code de l'appel:
integer a_v_pk_avance = 32 integer li_outer w_ma.sle_pk_avance.text = "bidoninitial" DECLARE proc_test PROCEDURE FOR lecture_avance ( v_pk_avance =>:a_v_pk_avance ) USING SQLCA; EXECUTE proc_test; if SQLCA.SqlCode < 0 then messagebox("test 1",string(SQLCA.SqlCode)+" "+string(SQLCA.sqlerrtext)) w_ma.sle_pk_avance.text = string(li_outer) RETURN -1 end if FETCH proc_test INTO :li_outer; if SQLCA.SqlCode >= 0 then messagebox("test 2",a_v_pk_avance) w_ma.sle_pk_avance.text = string(li_outer) RETURN -1 end if
Dernière modification par biraye (10-07-2014 07:19:13)
Hors ligne
Bonjour,
Pourrais-tu nous communiquer la signature de la procédure stockée coté Oracle (Types Oracle de paramètres, INPUT, OUTPUT, etc...)
Note:
Hors ligne
En mettant :
if pos(SQLCA.DBParm, "PBNewSPInvocation='Yes'") <= 0 then SQLCA.DBParm+=",PBNewSPInvocation='Yes'"
le message change: "Can not find parameters of SP LECTURE_AVANCE".
Dernière modification par biraye (10-07-2014 07:17:37)
Hors ligne
foon a écrit:
Bonjour,
Pourrais-tu nous communiquer la signature de la procédure stockée coté Oracle (Types Oracle de paramètres, INPUT, OUTPUT, etc...)
Note:
Merci d'avoir répondu.
create or replace procedure lecture_avance(v_pk_avance integer,li_out out integer ) is li_integer integer; begin li_out := 4; select t.montant into li_integer from tavance t where t.pk_avance = v_pk_avance; li_out := li_integer; end lecture_avance;
C'est juste une procédure de test.
Dernière modification par biraye (10-07-2014 07:20:06)
Hors ligne
Rappel : "howto" du code=pb
La modification des zones [code] de ce poste est laissé comme exercice à l'auteur
Hors ligne
Merci à tous, j'ai corrigé les balises.
Hors ligne
Avec cette notation, sans passser par le RPCFUNC (appel direct donc):
integer a_v_pk_avance = 32 integer li_outer w_ma.sle_pk_avance.text = "bidoninitial" DECLARE proc_test PROCEDURE FOR lecture_avance (:a_v_pk_avance) USING SQLCA; EXECUTE proc_test; if SQLCA.SqlCode < 0 then messagebox("test 1",string(SQLCA.SqlCode)+" "+string(SQLCA.sqlerrtext)) RETURN -1 end if FETCH proc_test INTO :li_outer; if SQLCA.SqlCode >= 0 then messagebox("test 2",a_v_pk_avance) w_ma.sle_pk_avance.text = string(li_outer) RETURN -1 end if
Note: je ne suis pas sûr que le type "integer" de PB corresponde bien au type "integer" Oracle.
De plus, en Oracle, on utilise plus souvent les binary-integer, voire les PLS-integer.
Hors ligne
foon a écrit:
Avec cette notation, sans passser par le RPCFUNC (appel direct donc):
Code: pb
integer a_v_pk_avance = 32 integer li_outer w_ma.sle_pk_avance.text = "bidoninitial" DECLARE proc_test PROCEDURE FOR lecture_avance (:a_v_pk_avance) USING SQLCA; EXECUTE proc_test; if SQLCA.SqlCode < 0 then messagebox("test 1",string(SQLCA.SqlCode)+" "+string(SQLCA.sqlerrtext)) RETURN -1 end if FETCH proc_test INTO :li_outer; if SQLCA.SqlCode >= 0 then messagebox("test 2",a_v_pk_avance) w_ma.sle_pk_avance.text = string(li_outer) RETURN -1 end if
Note: je ne suis pas sûr que le type "integer" de PB corresponde bien au type "integer" Oracle.
De plus, en Oracle, on utilise plus souvent les binary-integer, voire les PLS-integer.
Je met le code integralement:
integer a_v_pk_avance = 32 integer li_outer w_ma.sle_pk_avance.text = "bidoninitial" if pos(SQLCA.DBParm, "PBNewSPInvocation='Yes'") <= 0 then SQLCA.DBParm+=",PBNewSPInvocation='Yes'" DECLARE proc_test PROCEDURE FOR lecture_avance (:a_v_pk_avance) USING SQLCA; EXECUTE proc_test; if SQLCA.SqlCode < 0 then messagebox("test 1",string(SQLCA.SqlCode)+" "+string(SQLCA.sqlerrtext)) RETURN -1 end if FETCH proc_test INTO :li_outer; if SQLCA.SqlCode >= 0 then messagebox("test 2",a_v_pk_avance) w_ma.sle_pk_avance.text = string(li_outer) RETURN -1 end if
Et le message obtenu devient: "Can not find parameters of SP LECTURE_AVANCE".
Le message ne change pas même si j'utilise pls_interger ou binary_integer au niveau de la procédure stockée.
Dernière modification par biraye (10-07-2014 09:45:19)
Hors ligne
Tu as bien mis les GRANTS sur la procédure stockée? Celle-ci n'est pas dans un package?
Tu as accès au bon schéma de la base de données?
Tu es sur quelle version d'Oracle?
Hors ligne
Tu as bien mis les GRANTS sur la procédure stockée? C'est l'utilisateur qui a créé la procédure qui se connecte à partir de PB. Je pense qu'il n'a pas besoin de grant.
Celle-ci n'est pas dans un package?
La procédure n'est pas dans un package.
Tu as accès au bon schéma de la base de données?
Oui car les datawindow portant sur des "Quick Select" ou "SQl Select" fonctionnent.
Tu es sur quelle version d'Oracle?
Version d'oracle: Release 10.1.0.2.0
Hors ligne
En opérant un petit changement :
DECLARE proc_test PROCEDURE FOR RC=caisse.lecture_avance (:a_v_pk_avance)
le message change:
The procedure has no return value
Hors ligne