stored - ¿Qué puede causar el error JDBC de SQL Server ''El valor no está establecido para el número de parámetro 0'' para un acceso de parámetro de salida?
retornar valor stored procedure sql server (5)
Descompilar la clase com.microsoft.sqlserver.jdbc.SQLServerCallableStatement sugiere que el ''número de parámetro 0'' es el valor de retorno del procedimiento almacenado.
Eso es correcto. Si la definición de su procedimiento almacenado tiene 11 parámetros de entrada / salida, realmente necesita definir 12 en su código de llamada. El parámetro 0 es el código de retorno.
Por ejemplo, con un SP con una entrada y un parámetro de salida, en SSMS ejecuta esto:
DECLARE @ReturnValue INT
DECLARE @P1 INT, @P2 INT
EXEC @ReturnValue= YourSP(@P1,@P2 OUTPUT)
En realidad, tiene tres parámetros para tratar aquí, no dos.
Tengo un código Java que accede a SQL Server 2005 que se ve así:
CallableStatement cstmt = ...;
... // Set input parameters
cstmt.registerOutParameter(11, Types.INTEGER);
cstmt.execute();
int out = cstmt.getInt(11);
Y la siguiente excepción se lanza desde la última línea:
com.microsoft.sqlserver.jdbc.SQLServerException: The value is not set
for the parameter number 0.
at com.microsoft.sqlserver.jdbc.SQLServerException.
makeFromDriverError(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.
skipOutParameters(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.
getOutParameter(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.
getterGetParam(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.
getInt(Unknown Source)
at org.jboss.resource.adapter.jdbc.WrappedCallableStatement.
getInt(WrappedCallableStatement.java:192)
El procedimiento almacenado que se llama se ve así:
CREATE PROCEDURE dbo.stored_proc ( -- 10 input parameters
, @out_param INT OUTPUT) AS
-- Variable declarations
SET @out_param = 0
-- Do processing...
SET @out_param = 1
Dado que el parámetro de salida se establece en cero al ingresar al procedimiento almacenado, ¿bajo qué circunstancias no se pudo establecer el valor? ¿O estoy malinterpretando el mensaje de error?
Este error es reproducible con:
- Controlador JDBC de SQL Server 1.2
- Paquete de servicio SQL Server 2005 (64 bits) 2
- Paquete de servicio SQL Server 2005 (64 bits) 3
Actualización: parece estar ocurriendo como resultado de -- Do processing...
parte del procedimiento almacenado. Al eliminar esto, se elimina el error. Hay demasiado código para reproducir aquí, lo que me gustaría es algunos indicadores de posibles causas para reducir los probables candidatos.
Actualización: Inyección de errores (por ejemplo, dividir por cero) en el proceso -- Do processing...
parte del procedimiento almacenado no provoca el lanzamiento de esta excepción (en cambio, como se esperaba, la llamada execute()
falla con un mensaje de error apropiado) .
Actualización: Descompilar la clase com.microsoft.sqlserver.jdbc.SQLServerCallableStatement sugiere que el ''número de parámetro 0'' es el valor de retorno del procedimiento almacenado.
Actualización: no he podido reproducir esto llamando al procedimiento almacenado directamente a través de Management Studio.
Actualización: la causa última de este error parece ser un punto muerto en el procedimiento almacenado . Normalmente, sin embargo, los interbloqueos hacen que la llamada a execute()
falle con un código de error SQLException
envuelve SQL Server 1205 ...
¿Estás registrando los parámetros de salida? De acuerdo con los documentos "Todos los parámetros OUT deben registrarse antes de que se ejecute un procedimiento almacenado".
En caso de que alguien siga teniendo este problema en SQL Server 2008.
Tuve el mismo problema en una declaración de actualización al tratar de establecer una marca de tiempo para un campo DateTime. El campo ofensivo estaba en una cláusula where en un índice diferente del reportado.
Hay un par de cosas que te vienen a la mente:
- No tiene un RETORNO x (donde x es una INT que representa el resultado del procesamiento, 0 = éxito, cualquier otra cosa representa una advertencia o un error).
- Su código de cliente no asigna un parámetro para el valor de retorno además de su parámetro de salida.
Espero que esto ayude,
Cuenta
en sus parámetros, ¿los está declarando o los está configurando con un valor predeterminado? intente configurarlos con un valor predeterminado de nulo o algo así y ver si todavía obtiene el error.
Al servidor sql no le gusta si tiene un parámetro no establecido en un valor predeterminado y no le pasa un valor cuando ejecuta el procedimiento almacenado.