FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Llamar store function en Oracle y obtener el valor devuelto
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Llamar store function en Oracle y obtener el valor devuelto
Posted: 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

Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: Llamar store function en Oracle y obtener el valor devuelto
Posted: Sat Sep 16, 2017 01:20 PM
Me respondo solo y comparto por si alguien tiene la necesidad en el futuro:
Code (fw): Select all Collapse
#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

Continue the discussion