2010-01-27 5 views
6

Tengo una aplicación Java que se ejecuta en Weblogic. La aplicación necesita acceder a un procedimiento almacenado en una base de datos DB2, por lo tanto, un origen de datos JDBC se configura y se accede por su nombre JNDI.Weblogic: procedimiento DB2 llamado almacenado sin nombre de esquema (propiedad currentSchema)

Fuente de datos:

ClassDriver: com.ibm.db2.jcc.DB2Driver 

Properties: 
user=MYUSER 
DatabaseName=MYDB 

El siguiente ejemplo funciona como se esperaba.

Context env = null; 
DataSource pool = null; 

Hashtable ht = new Hashtable(); 
ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); 
ht.put(Context.PROVIDER_URL,"t3://myserver:7777"); 

env = new InitialContext(ht); 

pool = (DataSource) env.lookup("jdbc/myjndiname"); 
conn = pool.getConnection(); 

// call stored procedure with schema name 
String procName = "MYSCHEMA.MYSTOREDPROCEDURE"; 
String sql = "CALL " + procName + "(?)"; 
callStmt = conn.prepareCall(sql); 

callStmt.setString(1, "1"); 
callStmt.execute(); 

Pero ahora necesito llamar al procedimiento almacenado sin el nombre del esquema y usar una propiedad del controlador JDBC en su lugar.

Fuente de datos:

ClassDriver: com.ibm.db2.jcc.DB2Driver 

Properties: 
user=MYUSER 
DatabaseName=MYDB 
db2.jcc.override.currentSchema=MYSCHEMA 
com.ibm.db2.jcc.DB2BaseDataSource.currentSchema=MYSCHEMA 

los siguientes resultados de llamadas SQL en un error

// call stored procedure without schema name 
String procName = "MYSTOREDPROCEDURE"; 
String sql = "CALL " + procName + "(?)"; 
callStmt = conn.prepareCall(sql); 

error de SQL:

SQLCODE = -440, ERROR: NO PROCEDURE BY THE NAME MYSTOREDPROCEDURE HAVING 
COMPATIBLE ARGUMENTS WAS FOUND IN THE CURRENT PATH 

Asumo que las propiedades "CurrentSchema" están equivocados.

Editar: Parece que estaba equivocado: la propiedad currentSchema no es el problema! La instrucción SQL "select current_schema fromsysibm.sysdummy1" devuelve el esquema correcto (MYSCHEMA). La pregunta ahora es por qué "CALL MYSCHEMA.MYSTOREDPROCEDURE(?)" funciona y "CALL MYSTOREDPROCEDURE(?)" resulta en un error ...

¿Alguna sugerencia? ¡Gracias!

Respuesta

9

La resolución del procedimiento almacenado (y de la función) no está controlada por el registro especial CURRENT SCHEMA. Está controlado por el registro especial CURRENT PATH.

lo tanto, usted puede:

  • ejecutar la instrucción SQL SET CURRENT PATH = MYSCHEMA
    o

  • Utilice la propiedad currentFunctionPath JDBC.

+0

La propiedad "currentFunctionPath" resolvió el problema. ¡Muchas gracias! – Hellen

0

Puede especificarlo en la URL JDBC de la fuente de datos. P.ej.

jdbc:db2://hostname:port/DBNAME:currentSchema=MYSCHEMA; 

Sin embargo, esto afecta a todas las conexiones provenientes de la misma fuente de datos.

+0

Intenté su solución pero seguía teniendo el mismo problema. El controlador (com.ibm.db2.jcc.DB2Driver) admite la propiedad "currentSchema", ¿verdad? ¿Se necesita alguna configuración de DB2 para usar el registro especial CURRENT SCHEMA? – Hellen

+0

Puede depender de la versión del controlador utilizada. Al menos supongo que estás usando los últimos controladores. Al menos aquí hay algunos documentos que pueden ser de utilidad: http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.apdv.java.doc /doc/rjvdsprp.htm y http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.apdv.java.doc/doc/cjvcfgpr. htm – BalusC

+0

Parece que estaba equivocado: ¡la propiedad no es el problema! La instrucción SQL "select current_schema fromsysibm.sysdummy1" devuelve el esquema correcto (MYSCHEMA). La pregunta es ahora, ¿por qué "LLAMAR A MYSCHEMA.MYSTOREDPROCEDURE (?) "Funciona y" CALL MYSTOREDPROCEDURE (?) "Da como resultado un error ... – Hellen

Cuestiones relacionadas