2010-01-27 6 views
6

Ho un'applicazione Java che gira su Weblogic. L'applicazione deve accedere a una stored procedure in un database DB2, pertanto un'origine dati JDBC è configurata e accessibile dal suo nome JNDI.Weblogic: chiama la stored procedure DB2 senza nome schema (property currentSchema)

Fonte dei dati:

ClassDriver: com.ibm.db2.jcc.DB2Driver 

Properties: 
user=MYUSER 
DatabaseName=MYDB 

Il seguente esempio funziona come previsto.

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(); 

Ma ora ho bisogno di chiamare la stored procedure senza il nome dello schema e utilizzare una proprietà driver JDBC, invece.

Fonte dei dati:

ClassDriver: com.ibm.db2.jcc.DB2Driver 

Properties: 
user=MYUSER 
DatabaseName=MYDB 
db2.jcc.override.currentSchema=MYSCHEMA 
com.ibm.db2.jcc.DB2BaseDataSource.currentSchema=MYSCHEMA 

i seguenti risultati di chiamata SQL in un errore

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

errore SQL:

SQLCODE = -440, ERROR: NO PROCEDURE BY THE NAME MYSTOREDPROCEDURE HAVING 
COMPATIBLE ARGUMENTS WAS FOUND IN THE CURRENT PATH 

presumo che le proprietà "currentSchema" sono sbagliate.

Modifica: Sembra che mi sia sbagliato: la proprietà currentSchema non è il problema! L'istruzione SQL "select current_schema fromsysibm.sysdummy1" restituisce lo schema corretto (MYSCHEMA). La domanda è ora, perché "CALL MYSCHEMA.MYSTOREDPROCEDURE(?)" funziona e "CALL MYSTOREDPROCEDURE(?)" risultati in un errore ...

Qualche suggerimento? Grazie!

risposta

9

La risoluzione della procedura (e della funzione) memorizzata non è controllata dal registro speciale CURRENT SCHEMA. È controllato dal registro speciale PERCORSO CORRENTE.

Quindi, è possibile:

  • eseguire l'istruzione SQL SET CURRENT PATH = MYSCHEMA
    o

  • Utilizzare la proprietà JDBC currentFunctionPath.

+0

La proprietà "currentFunctionPath" ha risolto il problema. Grazie mille! – Hellen

0

È possibile specificare al massimo l'URL JDBC dell'origine dati. Per esempio.

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

Questo tuttavia interessa tutte le connessioni provenienti dalla stessa origine dati.

+0

Ho provato la soluzione ma ho ancora lo stesso problema. Il driver (com.ibm.db2.jcc.DB2Driver) supporta la proprietà "currentSchema", giusto? È necessaria una configurazione DB2 per utilizzare il registro speciale CURRENT SCHEMA? – Hellen

+0

Può dipendere dalla versione del driver utilizzata. Suppongo almeno che tu stia utilizzando i driver più recenti. Almeno qui ci sono alcuni documenti che possono essere utili: http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.apdv.java.doc /doc/rjvdsprp.htm e http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.apdv.java.doc/doc/cjvcfgpr. htm – BalusC

+0

Sembra che mi sia sbagliato: la proprietà non è il problema! L'istruzione SQL "select current_schema fromsysibm.sysdummy1" restituisce lo schema corretto (MYSCHEMA). La domanda è ora, perché "CHIAMA MYSCHEMA.MYSTOREDPROCEDURE (?) "Funziona e" CALL MYSTOREDPROCEDURE (?) "Restituisce un errore ... – Hellen

Problemi correlati