У меня есть 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(?)"
результаты по ошибке...
Какие-либо предложения?Спасибо!
Сохраненная процедура (и функция) разрешение не контролируется текущей схемой специального регистра. Он контролируется текущим путем.
Итак, вы можете либо:
Выполнить оператор SQL Установите текущий путь = MySchema
или
Использование CurrentFunctionPath
Свойство JDBC.
Вы можете попробовать что-то подобное:
$total = 'SELECT COUNT(*) FROM table;';
$query = 'SELECT * FROM table ORDER BY id ASC LIMIT 1 OFFSET ' . (date('Ymd') % $total) . ';';
-121--4132669- Я добавляю ту же проблему, пытаясь протестировать мой DAL. Я обнаружил, что это работает:
<add name="SalesEntities" connectionString="metadata=res://*;provider=System.Data.SqlClient;provider connection string="Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
-121--1426002- Вы можете указать его на самом высоком уровне в URL-адресе JDBC источника данных. Например,
jdbc:db2://hostname:port/DBNAME:currentSchema=MYSCHEMA;
Это, однако, влияет на все соединения, поступающие из одного источника данных.