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

Hel*_*len 6 java db2 weblogic jndi

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

数据源:

ClassDriver: com.ibm.db2.jcc.DB2Driver

Properties:
user=MYUSER
DatabaseName=MYDB
Run Code Online (Sandbox Code Playgroud)

以下示例按预期工作.

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();
Run Code Online (Sandbox Code Playgroud)

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

数据源:

ClassDriver: com.ibm.db2.jcc.DB2Driver

Properties:
user=MYUSER
DatabaseName=MYDB
db2.jcc.override.currentSchema=MYSCHEMA
com.ibm.db2.jcc.DB2BaseDataSource.currentSchema=MYSCHEMA 
Run Code Online (Sandbox Code Playgroud)

以下SQL调用导致错误

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

SQL错误:

SQLCODE = -440, ERROR:  NO PROCEDURE BY THE NAME MYSTOREDPROCEDURE HAVING
COMPATIBLE ARGUMENTS WAS FOUND IN THE CURRENT PATH 
Run Code Online (Sandbox Code Playgroud)

我假设"currentSchema"属性是错误的.

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

有什么建议?谢谢!

Ian*_*vde 10

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

所以,您可以:

  • 执行SQL语句SET CURRENT PATH = MYSCHEMA

  • 使用currentFunctionPathJDBC属性.