Buenos Dias.
Les expoemos este caso, para pedir apoyo y/o obtener alguna alternativa para este consumo.
Nuestras aplicaciones están desarrolladas en powerbuilder version 2017 R2
Con una conexión a base de datos Oracle
Actualmente nos encontramos en una migración de base de datos a PostgreSQL 12.4 (EntrepriseDB Advanced Server 12.4.5)
En Oracle cuando el paquete contiene una función esta se invoca con el siguiente código el cual funciona correctamente.
DECLARE ELIMINAPAGOS PROCEDURE FOR coviliquida.PKG_MANTENIMIENTO_PAGOS.eliminar_pago(:v_idrecaudo, :v_idrecaudotanque, :sle_memo.text )
USING DBoracle;
EXECUTE ELIMINAPAGOS;
IF DBoracle.SQlcode < 0 then
Messagebox ("Error en la base de datos", Dboracle.SQLErrTExt, Exclamation!)
ELSE
FETCH ELIMINAPAGOS INTO :v_resultado;
CLOSE ELIMINAPAGOS;
IF not v_resultado = 'OK!' THEN
v_error = 1
END IF
END IF
En la migración a Postgresql se realizaron modificaciones en el código para el consumo de la función, modificación que funcionó correctamente.
DECLARE ELIMINAPAGOS CURSOR FOR select coviliquida.PKG_MANTENIMIENTO_PAGOS.eliminar_pago(:v_idrecaudo, :v_idrecaudotanque, :sle_memo.text ) from dual
USING DBoracle;
open ELIMINAPAGOS;
IF DBoracle.SQlcode < 0 then
Messagebox ("Error en la base de datos", Dboracle.SQLErrTExt, Exclamation!)
end if
Do while DBoracle.SQlcode = 0
FETCH ELIMINAPAGOS INTO :v_resultado;
CLOSE ELIMINAPAGOS;
loop
IF not v_resultado = 'OK!' THEN
v_error = 1
END IF
La incidencia se presenta cuando un paquete contiene un procedimiento y se va hacer el consumo de este:
En Oracle cuando se consume un paquete y se hace un llamado a un procedimiento se utiliza este codigo y funciona correctamente
DECLARE USUARIOS_TRE PROCEDURE FOR pkg_ingreso_v10.trae_usuario(:usuario)
USING sqlca;
IF sqlca.SQlcode < 0 then
Messagebox ("Error en la base de datos ", sqlca.SQLErrTExt, Exclamation!)
END IF
EXECUTE usuarios_tre;
IF sqlca.SQlcode < 0 then
Messagebox ("Error en la base de datos ", sqlca.SQLErrTExt, Exclamation!)
END IF
FETCH usuarios_tre INTO :actualiza_usuario, :ultima_contrasena, :sucursal_usuario, :documento;
close usuarios_tre;
Al hacer el mismo llamado pero con la conexión a la base de datos Postgresql se presenta en siguiente error
SQLSTATE = 42883
ERROR procedure pkg_ingreso_v10trae_usuario(character varyning does not exist;
Error while preparing parameters.
Se presume que en postgresql se requiere que en el consumo se envíen las varias de retorno,
lo cual lo solventamos enviando null, aparentemente hace el consumo del paquete pero no retorna el valor de las variables.
DECLARE USUARIOS_TRE PROCEDURE FOR pkg_ingreso_v10.trae_usuario(:usuario,null,null,null,null)
USING sqlca;
IF sqlca.SQlcode < 0 then
Messagebox ("Error en la base de datos ", sqlca.SQLErrTExt, Exclamation!)
END IF
EXECUTE usuarios_tre;
IF sqlca.SQlcode < 0 then
Messagebox ("Error en la base de datos ", sqlca.SQLErrTExt, Exclamation!)
END IF
FETCH usuarios_tre INTO :actualiza_usuario, :ultima_contrasena, :sucursal_usuario, :documento;
close usuarios_tre;
En otra prueba se envía en el parámetro :usuario el valor requerido en este caso ‘CLAUSS’ y de esta forma el paquete retorna los valores.
DECLARE USUARIOS_TRE PROCEDURE FOR pkg_ingreso_v10.trae_usuario(‘CLAUSS’,null,null,null,null)
USING sqlca;
IF sqlca.SQlcode < 0 then
Messagebox ("Error en la base de datos ", sqlca.SQLErrTExt, Exclamation!)
END IF
EXECUTE usuarios_tre;
IF sqlca.SQlcode < 0 then
Messagebox ("Error en la base de datos ", sqlca.SQLErrTExt, Exclamation!)
END IF
FETCH usuarios_tre INTO :actualiza_usuario, :ultima_contrasena, :sucursal_usuario, :documento;
close usuarios_tre;
Solicitamos ayuda en como es el correcto consumo de paquetes con procedimientos, el envío de variables y el retorno de las mismas.