Weblogic: вызвать хранимую процедуру DB2 без имени схемы (свойство currentSchema) - PullRequest
6 голосов
/ 27 января 2010

У меня есть приложение Java, которое работает на Weblogic. Приложению требуется доступ к хранимой процедуре в базе данных 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(?)" приводит к ошибке ...

Есть предложения? Спасибо!

Ответы [ 2 ]

9 голосов
/ 28 января 2010

Разрешение хранимой процедуры (и функции) не контролируется специальным регистром CURRENT SCHEMA. Управляется специальным регистром CURRENT PATH.

Итак, вы можете:

  • Выполнить инструкцию SQL SET CURRENT PATH = MYSCHEMA
    или

  • Используйте свойство currentFunctionPath JDBC.

0 голосов
/ 27 января 2010

Вы можете указать его в URL-адресе JDBC источника данных. Например.

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

Однако это влияет на все соединения, поступающие из одного источника данных.

...