Weblogic: Назовите хранимую процедуру DB2 без названия схемы (свойство currentSchema)

У меня есть 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(?)" результаты по ошибке...

Какие-либо предложения?Спасибо!

6
задан Hellen 28 January 2010 в 12:18
поделиться

2 ответа

Сохраненная процедура (и функция) разрешение не контролируется текущей схемой специального регистра. Он контролируется текущим путем.

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

  • Выполнить оператор SQL Установите текущий путь = MySchema
    или

  • Использование CurrentFunctionPath Свойство JDBC.

10
ответ дан 10 December 2019 в 00:38
поделиться

Вы можете попробовать что-то подобное:

$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=&quot;Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 
-121--1426002-

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

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

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

0
ответ дан 10 December 2019 в 00:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: