Répétez apres moi :J'aime PBAdonf. J'aime PBAdonf. J'aime PBAdonf.

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-05-2008 10:28:49

mattdamon  
Le Tuniso-Parisien
Lieu: Livry-Gargan 93190
Date d'inscription: 29-12-2007
Messages: 569
Pépites: 89
Banque: 77,512,666,613,392,940

Appel à une procedure stockée

Salut à tous, 


J'ai fait appel à une procédure stockée à partir d'un script d'une window (w_mywindow), mais le problème c'est qu'il m'affiche toujours :

Code: pb

Unknown function p_myprocedure 

.

Est ce qu'il possible de faire comme ca , ou bien je doit faire l'appel à partir de userobject.

Merci d'avance 

Hors ligne

 

#2 09-05-2008 10:35:08

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 à une procedure stockée

Bonjour,

Montre-nous le code de déclaration de ta procédure stockée.
Et celui d'appel.

Tu donnes trop peu d'informations pour que nous puissions t'aider...


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

Hors ligne

 

#3 09-05-2008 11:16:54

mattdamon  
Le Tuniso-Parisien
Lieu: Livry-Gargan 93190
Date d'inscription: 29-12-2007
Messages: 569
Pépites: 89
Banque: 77,512,666,613,392,940

Re: Appel à une procedure stockée

Au niveau de procédure stockée, j'ai fait comme suit:

Code: sql

PROCEDURE p_hh(  ai_msg_ref integer,  al_msg_body long)
IS
BEGIN
UPDATE matable
SET MSG_BODY = al_msg_body
WHERE MESSAGE_REF = ai_msg_ref ;
COMMIT;
END;


la procédure consiste à updater une ligne de ma table oracle.

Au niveau de PowerBuilder, j'ai fait l'appel à cette procédure stockée comme suit:

Code: pb

CONNECT USING SQLCA;
mypackage.p_hh(li_msg_ref,ll_msg_body)

Dernière modification par mattdamon (09-05-2008 12:23:23)

Hors ligne

 

#4 09-05-2008 11:25:22

Nephtis  
Bienfaiteur du site
Award: bf
Lieu: Longjumeau
Date d'inscription: 29-06-2007
Messages: 665
Pépites: 17,189,873,958
Banque: 9,223,372,036,854,776,000

Re: Appel à une procedure stockée

Salut,

je suppose que mypackage représente un objet non visuel mais est ce que tu as bien défini la fonction externe p_hh dans cet objet?

Petit rappel : sur l'objet en question selectionner le menu Declare > Local external functions et cliquer sur le bouton Procedures...

Dernière modification par Nephtis (09-05-2008 11:26:32)


Qui sème des problèmes, récolte des réponses.
PB 6.5 || ASE 12.5.4 || XP SP3

Hors ligne

 

#5 09-05-2008 11:34:32

JCZ  
Builder Power
Award: bf
Lieu: 75019 paris
Date d'inscription: 21-05-2007
Messages: 1724
Pépites: 496,453,703,213
Banque: 9,223,372,036,854,776,000

Re: Appel à une procedure stockée

avec
j'ai recuperé

Code:

Examples for DECLARE Procedure SQL statement
Example 2  This statement declares the ORACLE procedure Emp_proc for the database specified in the default transaction object. It references the Emp_name_var and Emp_sal_var variables, which must be set to appropriate values before you execute the EXECUTE Emp_proc command:

DECLARE Emp_proc procedure for GetName

(:Emp_name_var, :Emp_sal_var) ;

Code:

Oracle DECLARE and EXECUTE
PowerBuilder requires a declarative statement to identify the database stored procedure that is being used and a logical name that can be referenced in subsequent SQL statements. The general syntax for declaring a procedure is:

DECLARE logical_procedure_name PROCEDURE  FOR
Oracle_procedure_name(:InParam1,:InParam2, ...)
{USING transaction_object}; 

where logical_procedure_name can be any valid PowerScript data identifier and Oracle_procedure_name is the name of the stored procedure in the database.
The parameter references can take the form of any valid parameter string that Oracle accepts. PowerBuilder does not inspect the parameter list format except for purposes of variable substitution. The USING clause is required only if you are using a transaction object other than the default transaction object.

You can use Oracle Named or Positional notation to specify the procedure arguments. Positional is simpler to specify, but you must use Named if any output parameters are defined to the left of any input parameters.

Examples

Example 1
If a stored procedure is defined as:

CREATE PROCEDURE spm1

(dept varchar2, mgr_name OUT varchar2) 
  IS lutype varchar2(10);
  BEGIN 
  SELECT manager INTO mgr_name FROM mgr_table
  WHERE dept_name = dept;
  END;

To declare that procedure for processing within PowerBuilder, you code:

DECLARE dept_proc PROCEDURE FOR 
  spm1(:dept);

Note that this declaration is a non-executable statement, just like a cursor declaration. Where cursors have an OPEN statement, procedures have an EXECUTE statement.

When the EXECUTE statement executes, the procedure is invoked. The EXECUTE refers to the logical procedure name.

EXECUTE dept_proc;

Example 2

The following example that declares a function in a service object that reads a pipe shows the use of named notation:

public function integer f_GetId (string as_PipeName)

double ldbl_Id

DECLARE f_GetId PROCEDURE FOR 
  f_GetId (pipe_name => :as_PipeName) USING SQLCA;

EXECUTE f_GetId;

FETCH f_GetId INTO :ldbl_Id;

CLOSE f_GetId;

RETURN ldbl_Id;

Example 3

Given this procedure:

CREATE OR REPLACE PROCEDURE spu_edt_object(

o_id_object OUT NUMBER,
o_message OUT VARCHAR2,
a_id_object NUMBER,
a_param VARCHAR2 := NULL,
a_value VARCHAR2 := NULL
) as
begin
o_id_object := 12345;
o_message := 'Hello World';
end;

The DECLARE statement must use named notation because output parameters are defined to the left of input parameters:

dec{0} o_id_object, id_obiect = 54321

string o_message, param = 'Test'

DECLARE proc_update PROCEDURE FOR spu_edt_object (
a_id_object => :id_object,
a_param => :param
)
USING SQLCA;

EXECUTE proc_update;
if SQLCA.SqlCode 0 then
SQLCA.f_out_error()
RETURN -1
end if

FETCH proc_update INTO :o_id_object, o_message;
if SQLCA.SqlCode 0 then
SQLCA.f_out_error()
CLOSE proc_update;
RETURN -1
end if

Tu devrais pouvoir t'en sortir avec cela


Face à l'agression, la puissance de l'intelligence

Hors ligne

 

#6 09-05-2008 11:50:30

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

Re: Appel à une procedure stockée

Bonjour, petite question, pourquoi faire une procédure plutôt qu'un SQL embarqué directement dans PB ?

Code: pb

UPDATE matable
SET MSG_BODY = :al_msg_body
WHERE MESSAGE_REF = :ai_msg_ref ;



A quel moment appeles-tu cette proc ?


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

Hors ligne

 

#7 09-05-2008 12:34:49

mattdamon  
Le Tuniso-Parisien
Lieu: Livry-Gargan 93190
Date d'inscription: 29-12-2007
Messages: 569
Pépites: 89
Banque: 77,512,666,613,392,940

Re: Appel à une procedure stockée

erasorz  a écrit:

Bonjour, petite question, pourquoi faire une procédure plutôt qu'un SQL embarqué directement dans PB ?

Dans ma table, je voulais insérer 10000 caractères  dans le champs MSG_BODY.
Le problème que j'ai rencontré avant, le champs MSG_BODY de type Long, il n'accepte que 4000, les restes ne l'insere pas.
Pour cela que j'ai pensé au procédure stockée.
En fait j'ai exécuter le code ci-dessous sur PL/SQL developper il donne le résultat souhaité, mais quand je fait appel à partir de PB ca marche pas.

Code: pb

PPROCEDURE p_hh(  ai_msg_ref integer,  al_msg_body long)
IS
BEGIN
UPDATE matable
SET MSG_BODY = al_msg_body
WHERE MESSAGE_REF = ai_msg_ref ;
COMMIT;
END;

Dernière modification par mattdamon (09-05-2008 12:36:33)

Hors ligne

 

#8 09-05-2008 12:45:27

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

Re: Appel à une procedure stockée

juste une petite remarque :
en PB long est un type numérique,
en Oracle c'est un type obsolète de plus "Il n'est pas possible de passer une valeur LONG à une fonction SQL, et en PL/SQL une variable LONG sera automatiquement convertie en VARCHAR2 (à moins que la taille du VARCHAR2 ne le permette pas, auquel cas la variable sera convertie en LONG)."  cf http://helyos.developpez.com/lob/


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

Hors ligne

 

#9 13-05-2008 16:52:44

Chrnico  
N2I Power
Award: bf
Lieu: Vanves
Date d'inscription: 05-06-2007
Messages: 1206
Pépites: 12,884,901,943
Banque: 9,223,372,036,854,776,000
Site web

Re: Appel à une procedure stockée

mattdamon a écrit:

Au niveau de procédure stockée, j'ai fait comme suit:

Code: pl/sql

PROCEDURE p_hh(  ai_msg_ref integer,  al_msg_body long)
IS
BEGIN
UPDATE matable
SET MSG_BODY = al_msg_body
WHERE MESSAGE_REF = ai_msg_ref ;
COMMIT;
END;


la procédure consiste à updater une ligne de ma table oracle.

Au niveau de PowerBuilder, j'ai fait l'appel à cette procédure stockée comme suit:

Code: pb

CONNECT USING SQLCA;
mypackage.p_hh(li_msg_ref,ll_msg_body)

Il faut que tu déclares ta procédure en local external function de ton objet transaction (sqlca) car tu ne peux pas appeler un package oracle directement depuis PB. Pour cela il faut qu'un objet transaction hérité de la classe transaction soit associée à SQLCA dans les propriétés supplémentaires de l'objet application.

L'appel ce fait ensuite comme pour une méthode de l'objet transaction

Code: pb

CONNECT USING SQLCA;
SQLCA.p_hh(li_msg_ref,ll_msg_body)


Pour manipuler un document en base regardes l'aide sur selectblob et updateblob....
Autre solution si tu tiens absolument aux procédures : passer le paramètre BindSPInput à 1 pour passer des blob à ta proc Oracle, mais attention aux effets de bord sur le reste de l'application...


Tu dois donc tu peux (Kant)

Tu peux donc tu dois (N2i)
www.n2i.fr

Hors ligne

 

#10 20-05-2008 06:36:43

cantin_jl  
Membre completement Geek
Lieu: 49120 Chemillé
Date d'inscription: 10-01-2007
Messages: 132
Pépites: 552
Banque: 0
Site web

Re: Appel à une procedure stockée

Bonjour,

Nous utilisons beaucoup les procédures stockées (exécution plus rapide sur serveur qu'en local).
Voici comment nous procédons :

1°) Déclaration d'un objet hérité transaction (uo_trpc)
      En local external functions ,ous déclarons nos procédures :

Code: PB

FUNCTION string Remplit_totalite(string poste, string utilisateur,String R_Ref_Num,String R_Ref_Sfx, integer R_Ref_Rev, String R_Fam, String R_Prog, String R_Cd, String R_Cd_cli, String R_Di, String R_Di_Dpt, String R_Di_Ste, String R_Dat_Ech_Deb, String R_Dat_Ech_Fin, String R_Eta, String R_Hyp, String R_Exp, String R_Typ_bes ) RPCFUNC ALIAS FOR "GPAO_BESOIN.Remplit_totalite"


GPAO_BESOIN est un package qui contient la fonction Remplit_totalite

2°) Utilisation de la procédure

Code: PB

      ls_retour = SQLCA.remplit_totalite(gs_poste, &
                                      gs_poste,&
                                      ls_ent_num, & 
                                      ls_ent_sfx, &
                                      long(ls_ent_rev), &
                                      gstr_criteres.fam, &
                                      gstr_criteres.prg, &
                                      gstr_criteres.cde, &
                                      gstr_criteres.cli, &
                                      gstr_criteres.di, &
                                      gstr_criteres.dpt, &
                                      gstr_criteres.ste, &
                                      gstr_criteres.dat_deb, &
                                      gstr_criteres.dat_fin, &
                                      gstr_criteres.qte_tra, &
                                      gstr_criteres.hyp_eta, &
                                      gstr_criteres.eta_exp, &
                                      'B')
            end if
        
            if SQLCA.SqlCode <> 0 then
              ls_message = SqlCa.SqlErrText
              rollback;            
            end if  


J'espère que cela t'aidera,

Bon courage

Dernière modification par cantin_jl (20-05-2008 06:41:12)


Les inventions qui ne sont pas connues ont toujours plus de censeurs que d'approbateurs

Hors ligne

 

#11 24-02-2009 17:19:23

mattdamon  
Le Tuniso-Parisien
Lieu: Livry-Gargan 93190
Date d'inscription: 29-12-2007
Messages: 569
Pépites: 89
Banque: 77,512,666,613,392,940

Re: Appel à une procedure stockée

Salut à tous

Dans Local External Function, j'ai mis :

Code: pb

subroutine insert_message(STRING C1, string C2, LONG C3)  RPCFUNC alias for "Package.insert_message"


Code: pb

CONNECT USING SQLCA;
insert_message("S1", "S2", 01234567890123456789012345678901234567890123456789)


Malheureusement ça me retourne transaction not connected


Mais quand j'ajoute le SQLCA, comme il a dit  cantin_jl, un message d'erreur qui s'affiche : unknown insert_message.

Code: pb

CONNECT USING SQLCA;
SQLCA.insert_message("S1", "S2", 01234567890123456789012345678901234567890123456789)

Que ce qu'il manque dans mon code ?

@+

Dernière modification par mattdamon (24-02-2009 18:15:47)

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22