2010-01-27 4 views
6

Ich habe eine Java-Anwendung, die auf Weblogic ausgeführt wird. Die Anwendung muss auf eine gespeicherte Prozedur in einer DB2-Datenbank zugreifen. Daher wird eine JDBC-Datenquelle konfiguriert und über ihren JNDI-Namen zugegriffen.Weblogic: Rufen Sie gespeicherte DB2-Prozedur ohne Schemaname (Eigenschaft currentSchema)

Datenquelle:

ClassDriver: com.ibm.db2.jcc.DB2Driver 

Properties: 
user=MYUSER 
DatabaseName=MYDB 

Das folgende Beispiel funktioniert wie erwartet.

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

Aber jetzt muss ich die gespeicherte Prozedur ohne den Schemanamen aufrufen und stattdessen eine JDBC-Treibereigenschaft verwenden.

Datenquelle:

ClassDriver: com.ibm.db2.jcc.DB2Driver 

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

Der folgende SQL-Aufruf führt zu einem Fehler

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

SQL-Fehler:

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

Ich gehe davon aus, dass die "Current" Eigenschaften sind falsch.

Edit: Es sieht aus wie ich falsch lag: die Eigenschaft currentSchema ist nicht das Problem! Die SQL-Anweisung gibt das korrekte Schema zurück (MYSCHEMA). Die Frage ist nun, warum "CALL MYSCHEMA.MYSTOREDPROCEDURE(?)" funktioniert und "CALL MYSTOREDPROCEDURE(?)" zu einem Fehler führt ...

Irgendwelche Vorschläge? Vielen Dank!

Antwort

9

Gespeicherte Prozedur (und Funktion) Auflösung wird nicht vom CURRENT SCHEMA Sonderregister gesteuert. Es wird vom Sonderregister CURRENT PATH gesteuert.

So können Sie entweder:

  • Führen Sie die SQL-Anweisung SET CURRENT PATH = MYSCHEMA
    oder

  • Verwenden Sie die currentFunctionPath JDBC-Eigenschaft.

+0

Eigenschaft "currentFunctionPath" löste das Problem. Vielen Dank! – Hellen

0

Sie können es maximal in der JDBC-URL der Datenquelle angeben. Z.B.

Dies betrifft jedoch alle Verbindungen, die von derselben Datenquelle stammen.

+0

Ich versuchte Ihre Lösung, aber immer noch das gleiche Problem. Der Treiber (com.ibm.db2.jcc.DB2Driver) unterstützt die Eigenschaft "currentSchema", richtig? Wird für die Verwendung des CURRENT SCHEMA-Sonderregisters eine DB2-Konfiguration benötigt? – Hellen

+0

Dies hängt möglicherweise von der verwendeten Treiberversion ab. Ich nehme zumindest an, dass Sie die neuesten Treiber verwenden. Zumindest hier sind einige Dokumente, die nützlich sein können: http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.apdv.java.doc /doc/rjvdsprp.htm und http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.apdv.java.doc/doc/cjvcfgpr. htm – BalusC

+0

Es sieht aus wie ich falsch lag: die Eigenschaft ist nicht das Problem! Die SQL-Anweisung "select current_schema fromsysibm.sysdummy1" gibt das korrekte Schema (MYSCHEMA) zurück. Die Frage ist jetzt, warum "CALL MYSCHEMA.MYSTOREDPROCEDURE (?) "Funktioniert und" CALL MYSTOREDPROCEDURE (?) "Führt zu einem Fehler ... – Hellen