Powerbuilder pour les completement Geeks !

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 20-11-2012 17:03:02

LeCiao  
Membre Geek
Date d'inscription: 05-09-2007
Messages: 87
Pépites: 18
Banque: 362,050,507,885,535

Récupérer une variable output sous PB/MySQL

Je suis sous PB12.5 et MySQL 5.5

Je n'arrive pas à récupérer la valeur d'une variable OUTPUT passée à une procédure. Voici le code écrit :

Code: MySQL

create procedure pa_test_return(OUT retour int)
begin 
  set retour = 13;
end;

Code: pb

Long ll_retour

DECLARE pa_test_return PROCEDURE FOR pa_test_return :ll_retour OUTPUT USING SQLCA;
                     
EXECUTE pa_test_return;

IF SQLCA.SQLCode = -1 THEN
  Messagebox("Sybase", "RETURN: " +SQLCA.SQLErrText)
ELSE
  FETCH pa_test_return INTO :ll_retour;
END IF

CLOSE pa_test_return;
          
em_retour_mysql.text = string(ll_retour)


J'obtiens le message d'erreur suivant :

http://s11.postimage.org/51fr7bs3n/photo.jpg

En faisant la même chose sous Sybase 12.5.1 ça fonctionne.

Quelqu'un saurait il me dire pourquoi ?

Dernière modification par LeCiao (22-11-2012 13:35:52)

Hors ligne

 

#2 21-11-2012 14:50:46

LeCiao  
Membre Geek
Date d'inscription: 05-09-2007
Messages: 87
Pépites: 18
Banque: 362,050,507,885,535

Re: Récupérer une variable output sous PB/MySQL

J'ai refait un test différent dans le code PB aujourd'hui mais ça ne marche pas mieux. Personne ne saurait me dire pourquoi ?

Code: PB

String ls_sql = "call pa_test_return (@retour = ?)"
long ll_output = 8
long ll_ret, ll_cpt

DECLARE pa_test_return DYNAMIC PROCEDURE FOR SQLSA ; 

PREPARE SQLSA FROM :ls_sql using sqlca; 
DESCRIBE SQLSA INTO SQLDA ;

ll_ret = SQLDA.SetDynamicParm(1, ll_output) 

EXECUTE DYNAMIC pa_test_return USING DESCRIPTOR SQLDA ; 
If Sqlca.Sqlcode = -1 then 
    Messagebox("Error ", String(Sqlca.Sqlcode) + sqlca.sqlerrtext) 
else 
  Do While sqlca.SQLCode <> 100
    FETCH pa_test_return USING DESCRIPTOR SQLDA ; 
  Loop
  If Sqlca.Sqlcode <> 0 then 
     Messagebox("Error ", String(Sqlca.Sqlcode) + sqlca.sqlerrtext) 
  else 
    for ll_cpt = 1 to sqlda.NumOutputs 
      CHOOSE CASE SQLDA.OutParmType[ll_cpt] 
        CASE TypeString! 
          em_retour_mysql.text = GetDynamicString(SQLDA, ll_cpt)
        CASE TypeInteger! 
          em_retour_mysql.text = String(GetDynamicNumber(SQLDA, ll_cpt))
      END CHOOSE 
    next 
  end if
end if

CLOSE pa_test_return ;


Au moment de de faire l'EXECUTE, j'ai le message suivant :

Code: SQLCA.SQLErrText

SQLSTATE = S1000
[MySQL][ODBC 5.1 Driver][mysqld-5.5.14-enterprise-commercial-advanced]OUT or INOUT argument 1 for routine pwm_ldi.pa_test_return is not a variable or NEW pseudo-variable in BEFORE trigger

Hors ligne

 

#3 21-11-2012 15:17:52

rincevent  
Modérateur
Award: bf
Lieu: Belgique
Date d'inscription: 06-02-2007
Messages: 722
Pépites: 100,002,023
Banque: 0

Re: Récupérer une variable output sous PB/MySQL

J'ai vraiment pas bcp d'expérience avec les appels de proc. stockées depuis PB donc le seul truc bêbête que je peux signaler c'est que d'un côté c'est int (proc) et de l'autre c'est long (PB)

j'imagine que ton problème ne viens pas de là et que les types correspondent ?


http://img114.imageshack.us/img114/8519/userbar175801nb.gif
Pourquoi ne puis-je vivre comme n'importe quel être humain ? Pourquoi mon destin est-il de ne pouvoir cesser de me battre ?

Hors ligne

 

#4 21-11-2012 15:33:40

LeCiao  
Membre Geek
Date d'inscription: 05-09-2007
Messages: 87
Pépites: 18
Banque: 362,050,507,885,535

Re: Récupérer une variable output sous PB/MySQL

J'ai trouvé pourquoi j'avais cette erreur c'est que j'essayais d'alimenter ma variable en entrée alors qu'elle est en out dans le code de la proc.

Du coup, ça marche mieux mais je ne récupère toujours pas la valeur de ma variable.

Code: pb

String ls_sql = "call pa_test_return (@retour)"
long ll_cpt

DECLARE pa_test_return DYNAMIC PROCEDURE FOR SQLSA ; 

PREPARE SQLSA FROM :ls_sql using sqlca; 
DESCRIBE SQLSA INTO SQLDA ;

EXECUTE DYNAMIC pa_test_return USING DESCRIPTOR SQLDA ; 
If Sqlca.Sqlcode = -1 then 
    Messagebox("Error ", String(Sqlca.Sqlcode) + sqlca.sqlerrtext) 
else 
  FETCH pa_test_return USING DESCRIPTOR SQLDA ; 
  If Sqlca.Sqlcode <> 0 then 
     Messagebox("Error ", String(Sqlca.Sqlcode) + sqlca.sqlerrtext) 
  else 
    for ll_cpt = 1 to sqlda.NumOutputs 
      CHOOSE CASE SQLDA.OutParmType[ll_cpt] 
        CASE TypeString! 
          em_retour_mysql.text = GetDynamicString(SQLDA, ll_cpt)
        CASE TypeLong! 
          em_retour_mysql.text = String(GetDynamicNumber(SQLDA, ll_cpt))
        Case Else
          em_retour_mysql.text = "Type variable retour inconnu"
      END CHOOSE 
    next 
  end if
end if

CLOSE pa_test_return ;


Effectivement en testant le TypeLong! au lieu du TypeInt!, je rentre bien dans mon code par contre

Code:

GetDynamicNumber(SQLDA, ll_cpt)

ne retourne rien ??

Dernière modification par LeCiao (22-11-2012 11:09:00)

Hors ligne

 

#5 22-11-2012 09:46:31

LeCiao  
Membre Geek
Date d'inscription: 05-09-2007
Messages: 87
Pépites: 18
Banque: 362,050,507,885,535

Re: Récupérer une variable output sous PB/MySQL

Bon ça avance mais ne fonctionne toujours pas.

Dans la procédure stockée il faut qu'il y ait un select, sinon le FETCH dans PB ne fonctionne pas
De plus et c'est encore plus important, il faut que la variable à récupérer soit de type INOUT (et pas OUT) sinon je n'ai jamais de valeur dedans.

Code: Mysql

delimiter ;;
drop PROCEDURE if exists pa_test_return;;

create procedure pa_test_return(INOUT retour int)
begin 
  select retour;
  set retour = 18;
end;;


Là où j'ai encore un soucis, c'est que je suis obligé d'éxécuter 2 FOIS mon script pour obtenir le bon résultat, ce qui est inacceptable.

Code: pb

String ls_sql = "call pa_test_return (@retour)"
long ll_cpt

DECLARE pa_test_return DYNAMIC PROCEDURE FOR SQLSA ; 
  
PREPARE SQLSA FROM :ls_sql using SQLCA; 
DESCRIBE SQLSA INTO SQLDA ;

EXECUTE DYNAMIC pa_test_return USING DESCRIPTOR SQLDA ; 
If Sqlca.Sqlcode = -1 then 
   Messagebox("Error ", String(Sqlca.Sqlcode) + sqlca.sqlerrtext) 
else
  Do while Sqlca.Sqlcode <> 100
    FETCH pa_test_return USING DESCRIPTOR SQLDA ; 
  Loop
  If Sqlca.Sqlcode = -1 then 
    Messagebox("Error ", String(Sqlca.Sqlcode) + sqlca.sqlerrtext) 
  else 
    for ll_cpt = 1 to SQLDA.NumOutputs 
      CHOOSE CASE SQLDA.OutParmType[ll_cpt] 
        CASE TypeString! 
          em_retour_mysql.text = GetDynamicString(SQLDA, ll_cpt)
        CASE TypeLong! 
          em_retour_mysql.text = String(GetDynamicNumber(SQLDA, ll_cpt))
        Case Else
          em_retour_mysql.text = "Type variable retour inconnu"
      END CHOOSE 
    next 
  end if
end if

CLOSE pa_test_return ;


Quelqu'un aurait une idée ??

Dernière modification par LeCiao (22-11-2012 11:08:46)

Hors ligne

 

#6 22-11-2012 10:48:23

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

Re: Récupérer une variable output sous PB/MySQL

Je ne connais pas bien MySQL, mais pourquoi ne déclares-tu pas une fonction au lieu d'une procédure stockée?
Ce n'est pas possible dans ce SGBD?

NB:  code=pb en minuscule, sinon ça ne marche pas


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

Hors ligne

 

#7 22-11-2012 11:02:28

LeCiao  
Membre Geek
Date d'inscription: 05-09-2007
Messages: 87
Pépites: 18
Banque: 362,050,507,885,535

Re: Récupérer une variable output sous PB/MySQL

Parce que ça rentre sur un projet de migration Sybase vers MySQL et que les procédures sont déja ecrites en sybase

Hors ligne

 

#8 22-11-2012 11:07:59

LeCiao  
Membre Geek
Date d'inscription: 05-09-2007
Messages: 87
Pépites: 18
Banque: 362,050,507,885,535

Re: Récupérer une variable output sous PB/MySQL

LeCiao a écrit:

Bon ça avance mais ne fonctionne toujours pas.

Dans la procédure stockée il faut qu'il y ait un select, sinon le FETCH dans PB ne fonctionne pas
De plus et c'est encore plus important, il faut que la variable à récupérer soit de type INOUT (et pas OUT) sinon je n'ai jamais de valeur dedans.

Code: Mysql

delimiter ;;
drop PROCEDURE if exists pa_test_return;;

create procedure pa_test_return(INOUT retour int)
begin 
  select retour;
  set retour = 18;
end;;


Là où j'ai encore un soucis, c'est que je suis obligé d'éxécuter 2 FOIS mon script pour obtenir le bon résultat, ce qui est inacceptable.

Code: pb

String ls_sql = "call pa_test_return (@retour)"
long ll_cpt

DECLARE pa_test_return DYNAMIC PROCEDURE FOR SQLSA ; 
  
PREPARE SQLSA FROM :ls_sql using SQLCA; 
DESCRIBE SQLSA INTO SQLDA ;

EXECUTE DYNAMIC pa_test_return USING DESCRIPTOR SQLDA ; 
If Sqlca.Sqlcode = -1 then 
   Messagebox("Error ", String(Sqlca.Sqlcode) + sqlca.sqlerrtext) 
else
  Do while Sqlca.Sqlcode <> 100
    FETCH pa_test_return USING DESCRIPTOR SQLDA ; 
  Loop
  If Sqlca.Sqlcode = -1 then 
    Messagebox("Error ", String(Sqlca.Sqlcode) + sqlca.sqlerrtext) 
  else 
    for ll_cpt = 1 to SQLDA.NumOutputs 
      CHOOSE CASE SQLDA.OutParmType[ll_cpt] 
        CASE TypeString! 
          em_retour_mysql.text = GetDynamicString(SQLDA, ll_cpt)
        CASE TypeLong! 
          em_retour_mysql.text = String(GetDynamicNumber(SQLDA, ll_cpt))
        Case Else
          em_retour_mysql.text = "Type variable retour inconnu"
      END CHOOSE 
    next 
  end if
end if

CLOSE pa_test_return ;


Quelqu'un aurait une idée ??

Bon en fait ça marche pas le code que j'ai donné !! Ce que je récupère c'est la valeur du select de la proc et pas le code retour en remplaçant mon code select retour; par select "toto"; je n'ai plus de résultat !

Donc rien ne marche !

Dernière modification par LeCiao (22-11-2012 11:09:21)

Hors ligne

 

#9 22-11-2012 13:30:28

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

Re: Récupérer une variable output sous PB/MySQL

Et comme ça? (syntaxe inspirée des appels procédures Oracle)

Code: mysql

create procedure pa_test_return(OUT retour int)
begin 
  set retour = 13;
end;


Code: pb

Long ll_retour

DECLARE pa_test_return PROCEDURE FOR pa_test_return USING SQLCA;
                     
EXECUTE pa_test_return;

IF SQLCA.SQLCode = -1 THEN
  Messagebox("Sybase", "RETURN: " +SQLCA.SQLErrText)
ELSE
  FETCH pa_test_return INTO :ll_retour;
END IF

CLOSE pa_test_return;
          
em_retour_mysql.text = string(ll_retour)

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

Hors ligne

 

#10 22-11-2012 13:51:07

LeCiao  
Membre Geek
Date d'inscription: 05-09-2007
Messages: 87
Pépites: 18
Banque: 362,050,507,885,535

Re: Récupérer une variable output sous PB/MySQL

J'obtiens l'erreur suivante avec ton code :

Code:

SQLSTATE = S1000
[MySQL][ODBC 5.1 Driver][mysqld-5.5.14-enterprise-commercial-advanced]Incorrect number of arguments for PROCEDURE pwm_ldi.pa_test_return; expected 1, got 0

Et si je modifie le declare que tu m'as donné :

Code: pb

DECLARE pa_test_return PROCEDURE FOR pa_test_return :ll_retour OUTPUT USING SQLCA;


alors j'ai l'erreur donné dans mon premier post

Dernière modification par LeCiao (22-11-2012 13:54:08)

Hors ligne

 

#11 22-11-2012 16:50:13

LeCiao  
Membre Geek
Date d'inscription: 05-09-2007
Messages: 87
Pépites: 18
Banque: 362,050,507,885,535

Re: Récupérer une variable output sous PB/MySQL

Est ce que vous savez s'il y a un moyen de récupérer des paramètres de proc en output dans le SQLDA ou SQLSA ?
Car je ne trouve pas et visiblement ce que la doc appelle paramètres output c'est le result set...

Hors ligne

 

#12 22-11-2012 17:52:23

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

Re: Récupérer une variable output sous PB/MySQL

Dans ce cas, essaie avec un RPCFUNC


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

Hors ligne

 

#13 23-11-2012 07:19:12

LeCiao  
Membre Geek
Date d'inscription: 05-09-2007
Messages: 87
Pépites: 18
Banque: 362,050,507,885,535

Re: Récupérer une variable output sous PB/MySQL

En RPCFunc je peux juste utiliser une procédure qui me remonte des variables en output, mais pas afficher un select de cette procédure non ?!

Dernière modification par LeCiao (23-11-2012 07:32:09)

Hors ligne

 

#14 23-11-2012 08:09:33

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

Re: Récupérer une variable output sous PB/MySQL

Ca marche avec des SELECT retournant un seul enregistrement, mais pas si tu veux retourner un Result Set de plusieurs lignes.
Pour cette seconde option, il vaut mieux passer par une datastore.


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

Hors ligne

 

#15 23-11-2012 08:48:23

LeCiao  
Membre Geek
Date d'inscription: 05-09-2007
Messages: 87
Pépites: 18
Banque: 362,050,507,885,535

Re: Récupérer une variable output sous PB/MySQL

Oui mais du coup je ne peux pas récupérer de paramètres en output en plus du resultset.

Dernière modification par LeCiao (23-11-2012 08:54:07)

Hors ligne

 

#16 23-11-2012 08:54:20

LeCiao  
Membre Geek
Date d'inscription: 05-09-2007
Messages: 87
Pépites: 18
Banque: 362,050,507,885,535

Re: Récupérer une variable output sous PB/MySQL

Sinon, j'ai essayé en RPC mais le paramètre output ne contient pas la valeur...

J'ai bien écrit un objet de type transaction dans lequel j'ai mis ma procédure MySQL (connecté en ODBC) dans les "local external functions" :

Code: pb

subroutine pa_test_return(ref long retour) RPCFUNC 


J'ai modifié mon objet application, pour qu'il pointe sur cet objet transaction dans le SQLCA (au lieu de Transaction par défaut)

Et j'ai écrit le script suivant pour mon appel de fonction :

Code: pb

//test avec la fonction RPCFunc déclarée dans le uo_trans_mysql branché sur le SQLCA
long ll_retour = 10
SQLCA.pa_test_return(ll_retour)
em_retour_mysql.text = String(ll_retour)


Qui appelle le code MySQL suivant :

Code:

create procedure pa_test_return(OUT retour int)
begin 
  select "Toto";
  set retour = 5;
end;

Dernière modification par LeCiao (23-11-2012 08:55:40)

Hors ligne

 

#17 23-11-2012 09:01:02

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: Récupérer une variable output sous PB/MySQL

Au pire, pourquoi ne pas mettre ta variable de retour dans le resultset ?


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#18 23-11-2012 09:57:16

LeCiao  
Membre Geek
Date d'inscription: 05-09-2007
Messages: 87
Pépites: 18
Banque: 362,050,507,885,535

Re: Récupérer une variable output sous PB/MySQL

Parce que le code existe deja et c'est une migration Sybase vers MySQL

Hors ligne

 

#19 23-11-2012 12:32:05

LeCiao  
Membre Geek
Date d'inscription: 05-09-2007
Messages: 87
Pépites: 18
Banque: 362,050,507,885,535

Re: Récupérer une variable output sous PB/MySQL

Mais c'est fou ça quand même qu'on puisse utiliser des paramètres en output et que je n'arrive pas à avoir la valeur de retour.
Je dois avoir un problème de config ou de paramètre de connexion aux bases ?!

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22