java - salida - ¿Cómo en JDBC puede llamar a un procedimiento almacenado cuando solo se configuran algunos parámetros?
parametros en un procedimiento almacenado (4)
//abobjects.com Debajo funciona para mí def getIDGEN (sTableName):
proc = db.prepareCall ("{? = llamar DB.dbo.usp_IDGEN_string_v6 (??)}");
proc.registerOutParameter(3, types.INTEGER)
proc.setString(2, sTableName)
proc.setInt(3, 0)
proc.execute()
li_RI_ID = proc.getInt(3)
print str(li_RI_ID) + " obtained from usp_IDGEN_string_v6"
return li_RI_ID
mi sproc es
create proc usp_IDGEN_string_v6 (@tablename varchar(32) , @ID numeric )
as
declare @seq numeric
declare @nextID numeric
select @nextID=IDGEN_ID from DB_IDGEN where IDGEN_TableName = @tablename
select @seq=@nextID + 1 from DB_IDGEN where IDGEN_Table
Name = @tablename
update DB_IDGEN set IDGEN_ID = @seq where IDGEN_TableName = @tablename
select @ID = @seq
return @ID
¿Cuál es la mejor manera de realizar una llamada a un procedimiento almacenado utilizando JDBC si solo desea establecer algunos de los parámetros?
Si solo estuviera usando SQL, podría establecer los parámetros por nombre en el SQL para llamar al sproc. Por ejemplo, si tengo un procedimiento almacenado con nueve parámetros y deseo establecer los parámetros 1, 2 y 9, dejando el resto a sus valores predeterminados, puedo ejecutar este SQL:
exec my_stored_procedure
@parameter_1 = "ONE",
@parameter_2 = "TWO",
@parameter_9 = "NINE"
Al usar JDBC (específicamente jConnect 6.0), parece que al usar un CallableStatement, debe establecer los parámetros por su índice entero, no por su nombre. Si intento crear un CallableStatement para el procedimiento almacenado anterior, con 9 parámetros, y solo establezco los parámetros 1, 2 y 9, así:
myStoredProcedureCall =
sybConn.prepareCall("{call my_stored_procedure (?, ?, ?, ?, ?, ? , ?, ?, ?)}");
myStoredProcedureCall.setString(1, "ONE");
myStoredProcedureCall.setString(2, "TWO");
myStoredProcedureCall.setString(9, "NINE");
ResultSet paramResults = myStoredProcedureCall.executeQuery();
Luego obtengo esta SQLException arrojada:
*** SQLException caught ***
SQLState: JZ0SA
Message: JZ0SA: Prepared Statement: Input parameter not set, index: 2.
Vendor: 0
Para obtener información general sobre lo que estoy tratando de hacer, necesito crear un proceso que reciba información sobre productos de una secuencia de IBM MQ, y luego cree un producto en una tercera aplicación. La aplicación de terceros usa Sybase para almacenar sus datos, y para crear un producto necesito llamar a un procedimiento almacenado que tiene aproximadamente 130 parámetros. Para el tipo de producto que necesito crear, solo se deben configurar alrededor de 15 de estos parámetros, el resto se dejará en los valores predeterminados.
Las opciones que he considerado son:
- Creando un procedimiento almacenado personalizado que establece solo los valores que necesito, luego llama al producto sproc de terceros.
- Establecer valores predeterminados para todos los parámetros en Java.
Seguramente debe haber una manera más fácil de hacer esto?
Esta característica no es compatible con JDBC. Deberá crear una cadena SQL y ejecutar eso:
String sql = "exec my_stored_procedure/n@parameter_1 = ?,/n@parameter_2 = ?,/n@parameter_9 = ?";
PreparedStatement stmt = ...
stmt.setString( 1, "ONE" );
stmt.setString( 2, "TWO" );
stmt.setString( 3, "NINE" );
stmt.execute();
Recuerde: JDBC no intenta comprender el SQL que está enviando a la base de datos a excepción de algunos caracteres especiales como {}
y ?
. Una vez escribí una "base de datos" JDBC que aceptaría fragmentos de JavaScript como "SQL": simplemente implementé DataSource
, Connection
y ResultSet
y pude consultar el modelo de memoria de mi aplicación utilizando la interfaz JDBC pero con JavaScript como lenguaje de consulta.
Puede probar la codificación difícil nula o en blanco en el String
"{call my_stored_procedure (?, ?, null, null, null, null , null, null, ?)}"
myStoredProcedureCall.setString(9, "NINE");
in above code index no 9 but it will be 3 because your parameter sequence start from 1 ;
Alhrough you can another sql exception.
I think you should use
myStoredProcedureCall =
sybConn.prepareCall("{call my_stored_procedure (?, ?, null, null, null, null , null, null, ?)}");
myStoredProcedureCall.setString(1, "ONE");
myStoredProcedureCall.setString(2, "TWO");
myStoredProcedureCall.setString(3, "NINE");
ResultSet paramResults = myStoredProcedureCall.executeQuery();