Llamar store function en Oracle y obtener el valor devuelto
Posted:
Fri Sep 15, 2017 11:30 am
by cmsoft
Estimados
Como se haría para obtener los valores de la ejecucion de una funcion almacenada en la base de datos Oracle?
La funcion tiene un parametro de tipo salida tambien que debo pasarle.
Gracias
Re: Llamar store function en Oracle y obtener el valor devuelto
Posted:
Sat Sep 16, 2017 1:20 pm
by cmsoft
Me respondo solo y comparto por si alguien tiene la necesidad en el futuro:
- Code: Select all Expand view
#include "FiveWin.ch"
#include "Ado.ch" // En ADO.ch estan definidas todas las constantes que no sirven para los seteos
FUNCTION GenerarConsulta(cParam1,nParam2, cParam3, cSalida)
LOCAL cConnStr, oCn, oCmd, nRespuesta, oErr
//Reemplazar mipass, miuser, minameserver correspondientemente
cConnStr := "Provider=OraOLEDB.Oracle.1;Password=mipass;Persist Security Info=True;User ID=miuser;Data Source=minameserver"
//Abro la conexion
oCn := TOLEAuto():New('ADODB.Connection')
oCn:ConnectionString := cConnStr
oCn:Open()
IF oCn = NIL
MsgStop( "Error al conectarse al Servidor Oracle!!","Error al conectar")
RETURN nil
ENDIF
// Genero un nuevo objeto command que es el que interactua con la funcion
oCmd := TOLEAuto():New( 'ADODB.Command' )
WITH OBJECT oCmd
:ActiveConnection := oCn // La conexion que cree
:CommandText := "funcion_de_la_base" // Nombre de la Funcion en la base
:CommandType := adCmdStoredProc // Tipo de comando
:Prepared := .T.
// Crear los parametros de entrada y salida con su tipo en el objeto oCmd
// Este es el de salida de la funcion, en este caso devuelve un entero, sino cambiar el tipo
oParam := :CreateParameter( 'retorno' , adInteger , adParamReturnValue )
:Parameters:Append( oParam )
oParam := :CreateParameter( 'param1', adBSTR, adParamInput ) // Parametro 1 de entrada tipo Str
:Parameters:Append( oParam )
oParam := :CreateParameter( 'param2' , adInteger, adParamInput ) // Parametro 2 de entrada tipo Entero
:Parameters:Append( oParam )
oParam := :CreateParameter( 'param3' , adBSTR, adParamInput ) // Parametro 3 de entrada tipo str
:Parameters:Append( oParam )
// Si la funcion ademas de devolver un valor tambien me deja un parametro de salida
oParam := :CreateParameter( 'pMsgError' , adBSTR, adParamOutput )
:Parameters:Append( oParam )
END
// Ahora lleno los parametros con los valores que quiero pasarle a la funcion Oracle
oCmd:Parameters(1):Value := cParam1
oCmd:Parameters(2):Value := nParam2
oCmd:Parameters(3):Value := cParam3
TRY
oCmd:Execute() // Ejecuto la funcion
CATCH oErr
// Si falla devuelvo el error
MsgInfo(oErr:description)
RETURN NIL
END
//Tomo el valor que me devuelve la funcion Oracle
nRespuesta := oCmd:Parameters(0):Value
//Tomo el valor del parametro de salida
//cSalida habra que pasarlo por referencia para que lo actualice
cSalida := oCmd:Parameters(4):Value
RETURN nRespuesta