2011-02-16 116 views
5

Me gusta mucho SQL SQuirreL como una herramienta de consulta SQL, pero nunca he podido obtener que invoque procedimientos almacenados en nuestra base de datos AS/400 DB2. Siempre aparece el error "La cantidad de valores de parámetros configurados o registrados no coincide con la cantidad de parámetros". He verificado el número de params y no tuve suerte. Esta es la sintaxis que he intentado para un procedimiento que toma una entrada y una salida:¿Cómo puedo llamar a un procedimiento almacenado de DB2 con parámetros OUT de SQuirreL SQL?

llamada SOMESPROC (12345,?);

Respuesta

0

yo creo que si hay uno en entonces la llamada debe ser:

CALL SomeSProc(12345) 

para obtener un resultado tal vez tratar:

SELECT * FROM SomeSProc(12345) 
+1

El problema no está consiguiendo los resultados. Creo que la última vez que probé un sproc que no tenía ningún parámetro OUT, los resultados volvieron como una consulta directa. El problema es lidiar con los parámetros de OUT. –

+0

no es un parámetro OUT el resultado del SP? – Leslie

+0

No, no son lo mismo. Un sproc puede producir resultados de tres maneras: a través de un conjunto de resultados, un parámetro OUT, y una tercera forma de llamar un valor de retorno (no estoy seguro del nombre correcto). Por lo tanto, puede tener algo como esto:? = GetListOfCheckedOutBooks (IN userID, OUT vencido). Esto podría devolver algún tipo de indicador para el primero?, Un booleano en el parámetro OUT indicando si el usuario tiene al menos un libro vencido, y un conjunto de resultados de todos los libros que actualmente han prestado. –

3

En ardilla se puede usar algo como esto. Querrá asegurarse de que el tipo de la variable declarada coincida con el tipo de su parámetro out en el procedimiento almacenado.

BEGIN 
    DECLARE outParam INT; 
    STORED_PROC_NAME(outParam); 
END 

Si también necesita proporcionar información para el procedimiento, puede hacerlo.

BEGIN 
    DECLARE outParam INT; 
    STORED_PROC_NAME('input', outParam); 
END 

También es necesario cambiar el separador de instrucciones a otra cosa que ;. De lo contrario, romperá la declaración e intentará enviar cada pieza individualmente.

+1

¡No funciona para mí! –

+1

¡No funciona para mí! Squirrel SQL: 3.5.0 Err mensaje: Error: DB2 SQL Error: SQLCODE = -104, SQLSTATE = 42601, SQLERRMC = número; DECLARE outParam; FIN DE DECLARACIÓN, DRIVER = 3.53.95 Sqlstate: 42601 ErrorCode: -104 Ocurrió un error en: DECLARAR outParam NUMBER –

+0

De acuerdo. Con el declarar fuera de BEGIN, se queja de que NUMBER no se espera. Si lo muevo dentro de BEGIN, se queja de que BEGIN no se espera. Cambié el separador de la declaración a # y tampoco tuve suerte. Supongo que su respuesta funciona para alguna base de datos que no sea DB2/400 –

-2

cambio separador de instrucciones ardilla> Sesión> propiedades de sesión> SQL: '#'

BEGIN 
    DECLARE inOutParam varchar(200); 
    set inOutParam = 'a value'; 
    STORED_PROC_NAME(outParam); 
END; 
# 
+0

esto no usa inOutParam al llamar al procedimiento almacenado. – Tilo

2

En la versión pro de DbVisualizer, con el "Proceso de marcadores de parámetros en SQL" en la opción de menú comandante SQL habilitado , permitirá el "?" PARAM

call SOMESPROC(12345, ?); 
0

Aquí está un ejemplo probado que trabaja en Squirrel 3.7 con un procedimiento db2 almacenado. El truco es pasarse con un procedimiento almacenado de transición MY_PROC_TEST para llamar al procedimiento almacenado real PROC_TEST.

cambio separador de instrucciones ardilla> Sesión> propiedades de sesión> SQL: @

DROP PROCEDURE MY_PROC_TEST()@ 
CREATE PROCEDURE MY_PROC_TEST() 
RESULT SETS 1 -- out resultset (call product) 
LANGUAGE SQL 
BEGIN 
    DECLARE flag SMALLINT; -- out parameter 
    CALL MY_PROC('2015', flag); 
END @ 
CALL MY_PROC_TEST()@ 
END @ 

A continuación, puede llamar al procedimiento cinado como esto:

MY_PROC_TEST LLAMADA() @

4

Parece que SQuirrel actualmente no es capaz de hacerlo en AS/400 DB2.

Uso de la fuente abierta "Banco de trabajo de SQL/J" (http://www.sql-workbench.net/) que era capaz de llamar a un procedimiento:

wbcall SOMESPROC(12345, ?); 

Tiene su propio comando para llamar a un procedimiento "wbcall". Utilizar ? para salir de los parámetros.

Nota: Al instalar SQL Workbench/J, asegúrese de descargar el controlador de DB2 correcto desde IBM y también agregue el archivo de licencia mientras agrega el controlador dentro de SQL Workbench/J.

+0

Gracias, eso parece funcionar bien. No puedo marcarlo como aceptado porque técnicamente no responde a la pregunta original, pero es una respuesta útil, así que lo he votado. –

+0

@KC Baltz: ¿Por qué no es la respuesta correcta para la pregunta original? La respuesta básicamente es: no puedes. Después de eso, solo muestro una solución alternativa como una bonificación :-) – farbgeist

0

Esto funcionará en Squirrel si cambia el delimitador (como se especifica arriba). Sin embargo, para ver cuál es la variable, debe hacer lo siguiente ...

En mi ejemplo, estableceré el delimitador en un tildy (~). Incluir después del último "final", antes de "seleccionar". Código comienza aquí ...

begin 
declare inoutParm numeric(2,0); 
call spMyStoredProcedure(
      1234567          
      , inoutParm           
     ); 
declare global temporary table session.myTempTbl 
     (MyResult char(1024))           
with replace ; 
insert into session.myTempTbl 
    (myResult) 
    values(inoutParm) ; 
end 
~ 
select myResult from session.myTempTbl 

Mic Keeley AS400 (DB2) SQL Developer

+0

Intenté hacer que esto funcionara y me está dando un error, "Error: [SQL0101] Instrucción SQL demasiado larga o compleja. SQLState: 54001 ErrorCode: -101 ". –

Cuestiones relacionadas