java - salida - Escribir un bloque PL/SQL anónimo con variables de vinculación usando JDBC
procedure oracle ejemplos (2)
Tengo un bloque PL / SQL anónimo con variables de vinculación que quiero ejecutar a través de JDBC.
Ejemplo de bloque PL / SQL:
variable v_value number
declare
v_return varchar2(30);
begin
:v_value:=300;
select ename into v_return from emp where empno=:v_value;
end;
El código de Java correspondiente haría uso de la sintaxis de escape con "?" para establecer las variables. Entonces este bloque se vería así (corrígeme si estoy equivocado):
String block = "declare v_return varchar2(30);" +
"begin" +
"? := 300;" +
"select ename into v_return from emp where empno = ?;" +
"end;"
Ahora, suponiendo que mi variable sea un parámetro INPUT, tendré que establecer el parámetro así:
// omitting the CallableStatement and conn declarations
cs = conn.prepareCall(block);
cs.setInt(parameterIndex, parameterValue);
El PROBLEMA es que en mi bloque tengo dos "?" utilizado para reemplazar el parámetro enlazado: v_value. Esto significa que al usar la sintaxis de escape solo el 1''st "?" se establecerá. El 2''nd "?" quedará "colgado".
En tales casos, cuando la misma variable de vinculación se usa varias veces en un bloque PL / SQL, ¿cómo debo proceder para traducir esto en la sintaxis de escape de JDBC?
EDITAR:
Encontré esta pregunta en SO que está relacionada con mi problema. Lo que entiendo de esto es que tendré que REESCRIBIR todos los bloques PL / SQL anónimos que hacen uso de instancias de variable de vinculación múltiple en el mismo bloque. ¿Hay ALGUNA solución para esto? O este es ... un juego terminado ... es la forma en que funciona JDBC y tendré que hacerlo.
Esperando una respuesta ... busqué esto por 2 horas sin resultados.
Eche un vistazo a este documento .
Básicamente, puede vincular la misma variable como Entrada y Salida de esta manera:
CallableStatement call = conn.prepareCall(
"{CALL doubleMyInt(?)}");
// for inout parameters, it is good practice to
// register the outparameter before setting the input value
call.registerOutParameter(1, Types.INTEGER);
call.setInt(1,10);
Espero que ayude.
Prueba esta consulta:
String block = "declare " +
" v_return varchar2(30);" +
"begin" +
" select ename into v_return from emp where empno = ?;" +
" ? := v_return; " +
"end;";
CallableStatement cs = connection.prepareCall( block );
cs.setInt( 1, v_value );
cs.registerOutParameter( 2, java.SQL.VARCHAR );
cs.executeUpdate();
String result = cs.getString( 2 );
Vea los enlaces a continuación para obtener más detalles y ejemplos:
http://docs.oracle.com/cd/E11882_01/java.112/e16548/getsta.htm#JJDBC28075
http://docs.oracle.com/cd/E11882_01/java.112/e16548/oraint.htm#JJDBC28168