Ejecutar SP de Oracle

1,132 views
Skip to first unread message

ttw

unread,
Jul 18, 2012, 1:07:41 PM7/18/12
to publice...@googlegroups.com
Buenos Dias ante todo tengo un problema, con los SP de Oracle,
tengo una conexion
 ls_conn  =  'DRIVER=Microsoft ODBC for Oracle; UID='+g_dbuser+'; PWD='+g_dbpssw+'; SERVER='+g_dbconn
g_cnx = SQLSTRINGCONNECT(ls_conn)

no tengo problemas con la conexion
tengo una variable donde coloco la instruccion a ejecutar en Oracle para que llame al SP, que lo llamo procedure 1

lc_instruccionSQL = "EXEC procedure1('1','29')"

este procedure tiene una estructura:
Procedure1 (P_CodCia in CON_CAC_CAJACHICA.CIA_NCODIGO%TYPE
                                      ,P_CodPeriodoMes in CON_CAC_CAJACHICA.CPM_NCODIGO%TYPE
                                         , Cur_CajaChica Out T_Cursor)

para ejecutarlo:
sqlresult = SQLEXEC(g_cnx,lc_instruccionSQL)
pero no llego a capturar el cursor que me esta retornando y justo tengo ese problema como capturo el cursor, y llego a ejecutar el SP de una manera efectiva

extremo

unread,
Jul 18, 2012, 1:26:42 PM7/18/12
to publice...@googlegroups.com
Hola
No capturas tu cursor porque al comando sqlexec le falta un parametro, te envio un ejemplo para que pruebes
sqlresult = SQLEXEC(g_cnx,lc_instruccionSQL ,"MiCursor")

Para saber si tu SP fue exitoso coloca lo siguiente despues del comando

if sqlresult = -1
   aerr(arr)
    messagebox("ocurrio el siguiente error:" + arr(2))
endif

Bendiciones

ttw

unread,
Jul 18, 2012, 1:35:31 PM7/18/12
to publice...@googlegroups.com
Hola y gracias por responder,
tambien utilize esta opcion de poner cursor y de igual forma me arroja el error
porque para la opcion de capturar poner el curso lo uso sin llamar al SP de esta forma
sqlresult = SQLEXEC(g_cnx,"select * from tabla Where condicion" ,"MiCursor")
pero lo que quiero es dejar se usar esa forma y llamar a un SP pero no logro ejecutar el SP

Walter R. Ojeda Valiente

unread,
Jul 18, 2012, 1:46:50 PM7/18/12
to publice...@googlegroups.com
Tu Procedure1 requieres de tres parámetros y le envías solamente dos.

Saludos.

Walter.





Date: Wed, 18 Jul 2012 10:35:31 -0700
From: rorme...@gmail.com
To: publice...@googlegroups.com
Subject: [vfp] Re: Ejecutar SP de Oracle
--
 
 
 

ttw

unread,
Jul 18, 2012, 3:23:23 PM7/18/12
to publice...@googlegroups.com
Es justo lo que no se como enviarle el parametro que tengo que enviar.


El miércoles, 18 de julio de 2012 12:46:50 UTC-5, Walter R. Ojeda Valiente escribió:
Tu Procedure1 requieres de tres parámetros y le envías solamente dos.

Saludos.

Walter.





Date: Wed, 18 Jul 2012 10:35:31 -0700
From: rorme...@gmail.com

Walter R. Ojeda Valiente

unread,
Jul 18, 2012, 3:26:28 PM7/18/12
to publice...@googlegroups.com
Tu otro problema es que le llamas a tu variable SQLRESULT y ese es el mismo nombre que toma el cursor que te crea el Visual FoxPro.

Cámbiale el nombre y vuelve a probar. Por ejemplo:

lnResultado = SQLEXEC(...)

Saludos.

Walter.




Date: Wed, 18 Jul 2012 12:23:23 -0700
From: rorme...@gmail.com
To: publice...@googlegroups.com
Subject: Re: [vfp] Re: Ejecutar SP de Oracle
--
 
 
 

extremo

unread,
Jul 18, 2012, 3:36:16 PM7/18/12
to publice...@googlegroups.com
yo no uso Oracle pero supongo que debe ser muy similar a SQLServer

Aqui te envio un ejemplo de como enviar parametros a un procedimiento almacenado

sqlexec(MiConn ,"exec procedimiento ?var1,?Var2" ,"MiCursor")

Espero te sirva de orientacion.

Bendiciones



El miércoles, 18 de julio de 2012 15:26:28 UTC-4, Walter R. Ojeda Valiente escribió:
Tu otro problema es que le llamas a tu variable SQLRESULT y ese es el mismo nombre que toma el cursor que te crea el Visual FoxPro.

Cámbiale el nombre y vuelve a probar. Por ejemplo:

lnResultado = SQLEXEC(...)

Saludos.

Walter.




Date: Wed, 18 Jul 2012 12:23:23 -0700
From: rorme...@gmail.com

Victor Espina

unread,
Jul 18, 2012, 3:39:59 PM7/18/12
to publice...@googlegroups.com
Segun lo que yo veo, el 3er parametro del SP es de tipo T_CURSOR, es decir, que te devuelve o bien un ID de un cursor con los datos resultantes, o bien un conjunto de filas; VFP no es compatible con ninguno de los dos casos.

Una situacion similar sucede en SQL Server con el tipo TABLE.  Es posible definir un stored procedure que contenga un parametro de tipo TABLE, mediante el cual es posible pasarle DataSets completos al SP... pero desde VFP esto no es soportado, por lo que al invocar un SP con ese tipo de parametros se genera un error.

Saludos

Victor Espina

Victor Espina

unread,
Jul 18, 2012, 3:41:28 PM7/18/12
to publice...@googlegroups.com
Antes que se rasguen las vestiduras: cuando digo que "VFP no es compatible con ninguno de los dos casos" no me refiero a que VFP no pueda recibir un conjunto de datos desde Oracle, MySQL, SQL Server, etc, porque obviamente SI puede.

Lo que digo es que VFP no es compatible con PARAMETROS tipo cursor, table o similares.

Saludos

Victor Espina

ttw

unread,
Jul 18, 2012, 4:11:34 PM7/18/12
to publice...@googlegroups.com
Entonces en este caso Como podria realizar la funcion con el SP para que me devuelva los Datos que necesito. ya sea desde cualquier DB,
Gracias

Fox Learner

unread,
Jul 18, 2012, 4:48:12 PM7/18/12
to publice...@googlegroups.com
Encontré sobre el lenguaje de Oracle PL/SQL que utiliza para los procedimientos almacenados.. supongo que eso son los SP (Store Procedures).


Dice que el Oracle te puede engañar jeje

Saludos!

Victor Espina

unread,
Jul 18, 2012, 5:01:09 PM7/18/12
to publice...@googlegroups.com
No puedes; al menos no desde VFP. Entre las posibles soluciones esta crear otro SP que reciba los primeros dos parametros, invoque el SP real y luego devuelva los datos obtenidos en el 3er parametro mediante un SELECT.  Otra solucion podria ser crear una clase en .NET que invoque el SP y devuelva los datos en forma de un DataSet, y luego invocas esa clase desde VFP.

Saludos

Victor Espina

Fox Learner

unread,
Jul 18, 2012, 11:44:55 PM7/18/12
to publice...@googlegroups.com
Si va a usar C# para pasar parametros a Visual Foxpro, el amigo Turbi Soft lo logro de esta forma:


O puedes apoyarte en el nuevo grupo VFP a C#


Saludos!

Victor Espina

unread,
Jul 19, 2012, 1:42:23 PM7/19/12
to publice...@googlegroups.com
Tambien en CodeWiki hay un articulo sobre como crear una DLL en .NET y usarla en VFP:


Aunque, como dije, yo me iria por la via del SP "intermedio".

Saludos

Victor Espina

Samuel San Miguel Hernández

unread,
Jul 19, 2012, 3:07:43 PM7/19/12
to publice...@googlegroups.com
Para ejecutar SP incluidos en Paquetes:

*==================
* Forma cadena TSQL *
*==================
TEXT TO lc_instruccionSQL TEXTMERGE NOSHOW
          {Call procedure1(?'1',?'29',?@pzc_Tabla)}
ENDTEXT

*==================
* En la cabecera de tu STORE declara un tipo cursor (ANTES DEL CREATE ):
*==================
Type T_Cursor Is REF CURSOR;

*==================
* En tu cuerpo colocas esto dentro del BEGIN:
*==================
OPEN T_Cursor FOR  SELECT  *  FROM   TABLAUSUARIO
                                  WHERE    CODIGO = 'SSMH'


****Eso es todo, cualquier duda, mándame tu contenido de tu SP.

Saludos.

Samuel San Miguel Hernández

unread,
Jul 19, 2012, 3:14:12 PM7/19/12
to publice...@googlegroups.com
***********CORRECCION*************
*****************************************
Publicar respuesta
Más acciones de mensajes
1 minuto (14:07)
Para ejecutar SP:


*==================
* Forma cadena TSQL *
*==================
TEXT TO lc_instruccionSQL TEXTMERGE NOSHOW
          {Call procedure1(?'1',?'29')}
ENDTEXT

*==================
* En la cabecera de tu STORE declara un tipo cursor (ANTES DEL CREATE ):
*==================
Type T_Cursor Is REF CURSOR;

*==================
* En tu cuerpo colocas esto dentro del BEGIN:
*==================
OPEN T_Cursor FOR  SELECT  *  FROM   TABLAUSUARIO
                                  WHERE    CODIGO = 'SSMH'

*==================
* Para ejecutarlo
*==================
SQLEXEC(g_cnx,lc_instruccionSQL,'CurDevuelto')


****Eso es todo, cualquier duda, mándame tu contenido de tu SP.

Saludos.

Reply all
Reply to author
Forward
0 new messages