Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
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 :
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
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...
Hors ligne
Au niveau de procédure stockée, j'ai fait comme suit:
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:
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
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)
Hors ligne
avec
j'ai recuperé
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) ;
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
Hors ligne
Bonjour, petite question, pourquoi faire une procédure plutôt qu'un SQL embarqué directement dans PB ?
UPDATE matable SET MSG_BODY = :al_msg_body WHERE MESSAGE_REF = :ai_msg_ref ;
A quel moment appeles-tu cette proc ?
Hors ligne
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.
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
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/
Hors ligne
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
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...
Hors ligne
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 :
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
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)
Hors ligne
Salut à tous
Dans Local External Function, j'ai mis :
subroutine insert_message(STRING C1, string C2, LONG C3) RPCFUNC alias for "Package.insert_message"
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.
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