STORED PROCEDURE con varios parámetros

346 views
Skip to first unread message

Ivan Vargas

unread,
Jan 17, 2013, 1:37:41 PM1/17/13
to mund...@googlegroups.com
Sres.
Un cordial saludos para todos los miembros de este post,
aquí expongo mi situación:

Tengo un programa hecho en BBj (Rev.10.02) que utiliza e invoca
un Procedimiento Almacenado externo (propio de Oracle), 
con cuatros parámetros (dos de entradas y dos de salidas),
sin embargo, busqué en la documentación de Basis y apliqué
las sintaxis que corresponde, lamentablemente reporta
el siguiente error: !ERROR=77  (42000 ORA-00900: invalid SQL statement

Adjunto un trozo del código en como lo utilizo:
    VAL_ENT1=9999, VAL_ENT2=1, VAL_SAL1=0, VAL_SAL2$=""    
    SQL$="?=CALL Schemas.StroredProcedure(?,?,?,?)"
    SQLPREP (CH_SQL1)SQL$
    SQLEXEC (CH_SQL1)VAL_RET,VAL_ENT1,VAL_ENT2,VAL_SAL1,VAL_SAL2$

Donde:
VAL_RET Corresponde a Valor de retorno
VAL_ENT1 y VAL_ENT2 Corresponde a Valores que estoy enviando al SP
VAL_SAL1 y VAL_SAL2 Corresponde a Valores que retorna del SP

Hay alguien de este post pueda ayudarme y/o asesorarme en este tema??
se agradece gentilmente su ayuda.

Saludos.
IVG


jose aguilar

unread,
Jan 17, 2013, 1:55:58 PM1/17/13
to MundoBBx
Estimado:

Antes de cualquier observación...
Probaste ejecutar el SP externo desde una herramienta de acceso a datos por JDBC externa (que no sea BBJ)?
Por ejemplo, DBaver u otro similar?

Esto para descartar que no tengas problemas de configuración con el motor, en lugar de solo ser un problema de sintaxis con BBj.

Saludos cordiales,

Administrador MundoBBx


--
 
 

Ivan Vargas

unread,
Jan 17, 2013, 4:21:11 PM1/17/13
to mund...@googlegroups.com
Mi estimado...

gracias por tu rapidez, si efectivamente a través de un API de conexión a BBDD funciona. Hice una prueba con un registro responde bien.

No sé que más antecedentes puedo aportar.

Saludos.
IVG




--
 
 

Eduardo Campos

unread,
Jan 17, 2013, 8:11:41 PM1/17/13
to mund...@googlegroups.com
saludos cordiales Ivan, tengo algunos programas en BBj que actualizan campos en tablas de Oracle 10g y el comando que yo utilizo el siguiente.

sqlprep(999)"call llama_selec_datos_oper('"+operacion$+"','"+monto$+"','"+interes$+"')"; sqlexec(999)

espero te sea de utilidad

--
ESD Tecnología
Costa Rica
(506) 8854-5872
sky esd1968
esdtec...@gmail.com
www.esd.nixiweb.com

Ivan Vargas

unread,
Jan 17, 2013, 8:32:03 PM1/17/13
to mund...@googlegroups.com

Eduardo  se agradece gentilmente su ayuda
Por lo que veo del ejemplo que has compartido son todos entradas de datos, hacia Sp. Tambien he hecho varias aplicaciones que actualizan datos.
Mi mayor problema son los parametros que retorna desde el mismo procedimiento almacenado, es decir para un mismo SP reciban dos parametros de entradas y dos parametros de salidas.

De todas formas se agrade su ayuda.
Saludos
IVG


> --
>  
>  

jose aguilar

unread,
Jan 18, 2013, 6:26:26 AM1/18/13
to MundoBBx
Estimado Ivan,

La recomendación de Eduardo puede ser útil, para descartar problemas de forma en la llamada al SP. En lugar de separar la instrucción SQL, del paso de parámetros, sería conveniente probar una manera directa y combinada de la instrucción SQL. El mensaje de error, indica que tu instrucción SQL es inválida.

Si miras tu instrucción, ahí le estas indicando que enviarás 4 parámetros al SP:
 SQL$="?=CALL Schemas.StroredProcedure(?,?,?,?)"


Pero luego, en la instrucción de paso de parámetros, envías 5 parámetros:
SQLEXEC (CH_SQL1)VAL_RET,VAL_ENT1,VAL_ENT2,VAL_SAL1,VAL_SAL2$

Pero como haces el proceso separado, y el mensaje de BBj no esclarece mucho (solo se limita a cuestionar tu instrucción SQL), entonces cuesta un poco más visualizar el problema.

Basado en tu ejemplo, podrías probar lo siguiente (dividí la variable SQL$ solo para fines de legibilidad):
VAL_ENT1=9999, VAL_ENT2=1, VAL_SAL1=0, VAL_SAL2$=""
rem
SQL$=$$
SQL$=SQL$+
SQL$="CALL Schemas.StroredProcedure('"
SQL$=SQL$+STR(VAL_RET)+"','"+STR(VAL_ENT1)+','"+STR(VAL_ENT2)+','"
SQL$=SQL$+STR(VAL_SAL1)+','"+VAL_SAL2$+"')"
rem
SQLPREP (CH_SQL1)SQL$


Pero si quieres mantener tu instrucción tal cual la presentaste, podrías intentar (nota que inserté un signo interrogativo adicional al CALL):
    VAL_ENT1=9999, VAL_ENT2=1, VAL_SAL1=0, VAL_SAL2$=""    
    SQL$="?=CALL Schemas.StroredProcedure(?,?,?,?,?)"
    SQLPREP (CH_SQL1)SQL$
    SQLEXEC (CH_SQL1)VAL_RET,VAL_ENT1,VAL_ENT2,VAL_SAL1,VAL_SAL2$

Cuéntanos cómo te va con esto.

Saludos cordiales,

Administrador MundoBBx


--
 
 

Ivan Vargas

unread,
Jan 18, 2013, 8:14:10 AM1/18/13
to mund...@googlegroups.com
Hola mi estimado,

para responder a tu pregunta te adjunto el link de la documentación
en donde obtuve la sintaxis para realizar las pruebas con el SP.

Saludos.
IVG





--
 
 

jose aguilar

unread,
Jan 18, 2013, 9:37:53 AM1/18/13
to mund...@googlegroups.com
Estimado,

No cuestiono la forma, solo indico que para depurar siempre hay más de
una manera.

Aplicaste los cambios sugeridos en mi post anterior para ver si
funciona (te faltaba un parametro)

Saludos cordiales,

Administrador MundoBBx

El 18/01/13, Ivan Vargas <vn....@gmail.com> escribió:
> --
>
>
>

jose aguilar

unread,
Jan 21, 2013, 4:29:47 PM1/21/13
to MundoBBx
Estimado:

Revisando información externa sobre el código de error de Oracle que reportas en tu mensaje, resultaría interesante si puedes indicar cómo invocas el SP desde la herramienta externa (es decir, indicar exactamente como se hace el CALL hacia Oracle).

El código de error indicado puede estar asociado al tipo de campo que se envía como parámetro hacia el SP, incluso si cada parámetro es enviado encerrado en comillas simples o dobles. Eso puede hacer la diferencia entre una sentencia válida o no válida para el motor Oracle.

Saludos cordiales,

Administrador MundoBBx
Reply all
Reply to author
Forward
0 new messages