Llamar store function en Oracle y obtener el valor devuelto

Llamar store function en Oracle y obtener el valor devuelto

Postby cmsoft » Fri Sep 15, 2017 11:30 am

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
User avatar
cmsoft
 
Posts: 1181
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Llamar store function en Oracle y obtener el valor devuelto

Postby cmsoft » Sat Sep 16, 2017 1:20 pm

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
User avatar
cmsoft
 
Posts: 1181
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 12 guests