Weblogic:调用没有模式名称的DB2存储过程(属性currentSchema)

我有一个在Weblogic上运行的Java应用程序。 应用程序需要访问DB2数据库中的存储过程,因此JDBC数据源由其JNDI名称配置和访问。

数据源:

ClassDriver: com.ibm.db2.jcc.DB2Driver Properties: user=MYUSER DatabaseName=MYDB 

以下示例按预期工作。

 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(); 

但是现在我需要调用没有模式名称的存储过程,而是使用JDBC驱动程序属性。

数据源:

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

以下SQL调用导致错误

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

SQL错误:

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

我假设“currentSchema”属性是错误的。

编辑:看起来我错了:属性currentSchema不是问题! SQL语句"select current_schema fromsysibm.sysdummy1"返回正确的模式( MYSCHEMA )。 现在的问题是,为什么"CALL MYSCHEMA.MYSTOREDPROCEDURE(?)"有效并且"CALL MYSTOREDPROCEDURE(?)"导致错误……

有什么建议么? 谢谢!

存储过程(和function)分辨率不受CURRENT SCHEMA专用寄存器控制。 它由CURRENT PATH特殊寄存器控制。

所以,您可以:

  • 执行SQL语句SET CURRENT PATH = MYSCHEMA
    要么

  • 使用currentFunctionPath JDBC属性。

您最多可以在数据源的JDBC URL中指定它。 例如

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

但是,这会影响来自同一数据源的所有连接。