Java Weblogic:不使用模式名调用DB2存储过程(属性currentSchema)

Java Weblogic:不使用模式名调用DB2存储过程(属性currentSchema),java,db2,weblogic,jndi,Java,Db2,Weblogic,Jndi,我有一个在Weblogic上运行的Java应用程序。应用程序需要访问DB2数据库中的存储过程,因此JDBC数据源通过其JNDI名称进行配置和访问 数据来源: ClassDriver: com.ibm.db2.jcc.DB2Driver Properties: user=MYUSER DatabaseName=MYDB ClassDriver: com.ibm.db2.jcc.DB2Driver Properties: user=MYUSER DatabaseName=MYDB db2.jc

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

数据来源:

ClassDriver: com.ibm.db2.jcc.DB2Driver

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

Properties:
user=MYUSER
DatabaseName=MYDB
db2.jcc.override.currentSchema=MYSCHEMA
com.ibm.db2.jcc.DB2BaseDataSource.currentSchema=MYSCHEMA 
下面的示例按预期工作

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
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语句
“从sysibm.sysdummy1中选择当前模式”
返回正确的模式(
MYSCHEMA
)。现在的问题是,为什么
“CALL MYSCHEMA.mystoredprocesdure(?”
有效,而
“CALL mystoredprocesdure(?”
会导致错误


有什么建议吗?谢谢

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

jdbc:db2://hostname:port/DBNAME:currentSchema=MYSCHEMA;
但是,这会影响来自同一数据源的所有连接。

存储过程(和函数)的分辨率不受当前模式特殊寄存器的控制。它由当前路径专用寄存器控制

因此,您可以:

  • 执行SQL语句
    SET CURRENT PATH=MYSCHEMA

  • 使用
    currentFunctionPath
    JDBC属性


我尝试了您的解决方案,但仍然有相同的问题。驱动程序(com.ibm.db2.jcc.DB2Driver)支持属性“currentSchema”,对吗?使用当前模式特殊寄存器是否需要任何DB2配置?它可能取决于所使用的驱动程序版本。我至少认为你使用的是最新的驱动程序。至少这里有一些可能有用的文档:看起来我错了:属性不是问题!SQL语句“select current_schema fromsysibm.sysdummy1”返回正确的模式(MYSCHEMA)。现在的问题是,为什么“CALL MYSCHEMA.MYSTOREDPROCEDURE(?)”有效,而“CALL MYSTOREDPROCEDURE(?)”会导致错误……如果您以交互模式使用db2,它会使用用户名作为默认模式。在我们的例子中,有人想出了一个好主意,即模式应该是db2admin。我们使用不同的用户连接到数据库,因此需要在每个操作中指定架构。请尝试以下查询以确定它是否显示不同的架构:选择*from(values(CURRENT schema))作为X(R1)属性“currentFunctionPath”解决了此问题。谢谢!