Après windows pour les nuls, voici PB pour les bons (ou presque).

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 09-07-2014 11:52:20

biraye  
Membre Geek
Date d'inscription: 25-01-2013
Messages: 24
Pépites: 114
Banque: 0

Appel de Procédure stockées oracle par PB

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:

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 (
  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

 

#2 09-07-2014 12:58:15

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2486
Pépites: 85
Banque: 9,223,372,036,854,776,000

Re: Appel de Procédure stockées oracle par PB

Bonjour,

Pourrais-tu nous communiquer la signature de la procédure stockée coté Oracle (Types Oracle de paramètres, INPUT, OUTPUT, etc...)

Note:


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#3 09-07-2014 13:14:43

biraye  
Membre Geek
Date d'inscription: 25-01-2013
Messages: 24
Pépites: 114
Banque: 0

Re: Appel de Procédure stockées oracle par PB

En mettant :

Code: pb

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

 

#4 09-07-2014 13:27:58

biraye  
Membre Geek
Date d'inscription: 25-01-2013
Messages: 24
Pépites: 114
Banque: 0

Re: Appel de Procédure stockées oracle par PB

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.

Code: pb

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

 

#5 10-07-2014 06:22:50

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: Appel de Procédure stockées oracle par PB

Rappel : "howto" du code=pb

https://lut.im/kUyW8YdU/jzK4iOOT

La modification des zones [code] de ce poste est laissé comme exercice à l'auteur


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#6 10-07-2014 07:25:40

biraye  
Membre Geek
Date d'inscription: 25-01-2013
Messages: 24
Pépites: 114
Banque: 0

Re: Appel de Procédure stockées oracle par PB

Merci à tous, j'ai corrigé les balises.

Hors ligne

 

#7 10-07-2014 07:38:12

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2486
Pépites: 85
Banque: 9,223,372,036,854,776,000

Re: Appel de Procédure stockées oracle par PB

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.


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#8 10-07-2014 09:33:34

biraye  
Membre Geek
Date d'inscription: 25-01-2013
Messages: 24
Pépites: 114
Banque: 0

Re: Appel de Procédure stockées oracle par PB

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:

Code: pb

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

 

#9 10-07-2014 11:23:01

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2486
Pépites: 85
Banque: 9,223,372,036,854,776,000

Re: Appel de Procédure stockées oracle par PB

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?


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#10 10-07-2014 11:47:07

biraye  
Membre Geek
Date d'inscription: 25-01-2013
Messages: 24
Pépites: 114
Banque: 0

Re: Appel de Procédure stockées oracle par PB

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

 

#11 15-07-2014 10:24:59

biraye  
Membre Geek
Date d'inscription: 25-01-2013
Messages: 24
Pépites: 114
Banque: 0

Re: Appel de Procédure stockées oracle par PB

En opérant un petit changement :

Code: Pb

DECLARE proc_test PROCEDURE FOR RC=caisse.lecture_avance (:a_v_pk_avance) 

le message change:
The procedure has no return value

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22