Power Builder - Llamado a Store Procedure

 
Vista:

Llamado a Store Procedure

Publicado por Celso (48 intervenciones) el 28/03/2003 19:33:29
Hola.

Tengo un Store Procedure que tienen definida una variable de salida(output). Cuando ejecuto el store procedure desde power builder por medio de las instrucciones declare y execute, no logro recuperar el valor de la varible de salida.

El store procedure se ejecuta bien ya que dese el sybase advantage si logro ver el valor que devuelve la varible de salida, pero el problema es que desde power builder no logro recuperar dicho valor.

¿Como logro invocar el sp y extraer el valor de una variable de salidad?.

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Llamado a Store Procedure

Publicado por Flori (10 intervenciones) el 03/04/2003 01:38:22
nosotros tenemos el mismo problema.. lo hemos solucionado ejecutando el sp desde un datawindow..y despues recuperando el valor de la variable
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

respuesta PASO 1

Publicado por Milson Cardona (613 intervenciones) el 03/04/2003 15:26:22
Un saludo especial desde COLOMBIA

bueno, la solución al problema no es compleja.... vamos por partes

NOTA: antes deben saber que esto lo hice en PB8.0, aunque creo que desde la versión 6.0 deberá funcionar.

- deben crear un USER OBJECT tipo transaccion, llamenlo uo_transaction.

- declarar una variable global de este mismo tipo, si se desea pueden hacer el cambio de su variable transaccional a este nuevo objeto, no tiene implicación en la aplicación.....
es decir si antes tenian una variable transaccional llamada gt_conexion, declarada
transaction conexion, ahora tendrán uo_transaction conexion

-en el OPEN de la aplicación deben crear la instancia del objeto en la variable que se acabó de definir
conexion = CREATE uo_transaction

- luego abren el USER OBJECT uo_transaction y le declaran una local external function....
NOTA: si trabajan en PB 8.0, en la ventana de la Local External Function le dan click derecho - paste especial - SQL - remote store procedure... les aparecerá un listado de todos los procedimientos almacenados que tengan creados en la base de datos y a los que tenga acceso(PERMISOS) el USUARIO CON EL QUE ESTEN CONECTADO EN EL MOMENTO... eligen el que deseen y aceptar.. automáticamente les pegará la declaración....

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:respuesta PASO 2 y final

Publicado por Milson Cardona (613 intervenciones) el 03/04/2003 15:32:25
CONTINUAMOS.......

la declaración quedará para un SP:
subroutine NOMBRE_SP(tipo_dato ARG1,tipo_dato ARG2,....) RPCFUNC ALIAS FOR "USUARIO.NOMBRE_SP"

la declaración quedará para una FUNCION:
function double FUN_PROVCARTERA(tipo_dato ARG1,tipo_dato ARG2,....) RPCFUNC ALIAS FOR "CONTABILIDAD.FUN_PROVCARTERA"

- Ahora pueden llamar la LOCAL EXTERNAL FUNCTION desde cualquier parte de PB usando la variable transaccional que creamos

para SP
conexion.NOMBRE_SP(PARAM_1,PARAM_2...);
IF conexion.sqlcode = -1 THEN
ERROR
END IF

para FUNCION
variable = conexion.NOMBRE_FUNCION(PARAM_1,PARAM_2...);
IF conexion.sqlcode = -1 THEN
ERROR
END IF

Espero que les sirva para resolver el problema... me comentan como les vá para corregir mis notas

PD:
incluso en el obejto tipo transaccion pueden hacer la conexión llenando los espacios requeridos, y evitar poner dicho código en el open de la aplicación.
en el paso 2 me equivoqué, la declaración quedará uo_transaction gt_conexion, o mejor dicho uo_transaction nombre_vble_transaccion
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

otra solucion

Publicado por Milson Cardona (613 intervenciones) el 03/04/2003 17:54:01
Un saludo especial desde COLOMBIA

NOTA 1: estas sentencias son válidas para DB ORACLE 7 o superiores
si se trabaja con motores diferentes a ORACLE, se debe
consultar la sintaxis del DECLARE para dicho motor

NOTA 2 : esta es otra solución, que aunque mucho más corta y sencilla, personalmente me parece que es menos óptima porque se tendrá que registrar la funcion o el SP cada vez que se vaya a ejecutar... por tal motivo la deje para lo último

//declaramos el SP, esto se hace en cualquier evento de cualquier objeto
//donde vamos a ejecutar el SP o la FUNCION
Declare nombre_alias Procedure For nom_proc_o_func(:vble1,:vble2,....) Using vble_transaccional;

//ejecutamos el SP o función inmediatamente despues de declararlo
Execute nombre_alias;

//verificamos si se produjo algún error
IF vble_transaccional.sqlcode=-1 THEN
messagebox("","Error")
ROLLBACK USING vble_transaccional;
ELSE
COMMIT USING vble_transaccional;
END IF

NOTA: el commit y el rollback pueden ser desechados si no se consideran necesarios, bien sea porque no hay cambio de datos, o porque ya se hacen dentro del STORE PROCEDURE o la FUNCIÓN

espero que cualquiera que sea la forma que utilicen, resuelvan el problema
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:otra solucion

Publicado por Maria (7 intervenciones) el 28/08/2006 23:04:01
NO se soluciona haciendo un fetch into despues de hacer el execute??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar