SQL iBatis MySQL und Oracle

Helios co.

Lt. Commander
Dabei seit
März 2005
Beiträge
1.863
Hallo @all,

ich verusche aktuell ein größeres System von MySQL auf Oracle zu migrieren. In dem System kommt iBatis zum Einsatz, das eigentlich den Migrationsprozess erleichtern sollte. Demist leider (zumindest aktuell) nicht so.

Wie ihr wisst kommt bei iBatis ein Mapping-Mechanismus zum Einsatz, der XML Dateien verwendet. Diese enthalten die eigentlichen SQL Queries sowie Parameter und Attribute.

In meinem Projekt ist das Problem, dass ich eine Tabelle umbennen musste. Diese heißt unter MySQL "User". In Oracle ist ein derartiger Bezeichner leide rnicht gestattet, da er bereits reserviert ist. D.h. ich habe das Ding umbenannt in User_

Jetzt kriege ich allerdings folgenden Fehler:

Code:
[ERROR] [org.meinprojekt.database.common.impl.DBSessionImpl] - Couldn't execute query 'getUserDetails' - throwing RuntimeException
com.ibatis.common.jdbc.exception.NestedSQLException:   
--- The error occurred in User.xml.  
--- The error occurred while applying a parameter map.  
--- Check the getUserDetails-InlineParameterMap.  
--- Check the statement (query failed).  
--- Cause: java.sql.SQLSyntaxErrorException: ORA-00903: Ungültiger Tabellenname

at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback(MappedStatement.java:201)
	at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryForObject(MappedStatement.java:120)
	at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:518)
	at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:493)
	at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:106)
	at org.meinProjekt.database.common.impl.DBSessionImpl.queryForObject(DBSessionImpl.java:180)
	at org.meinProjekt.database.common.AbstractDatabaseManager.queryForObject(AbstractDatabaseManager.java:49)
	at org.meinProjekt.database.managers.UserDatabaseManager.getUserDetails(UserDatabaseManager.java:90)
	at org.meinProjekt.database.managers.UserDatabaseManager.validateUserUserAccess(UserDatabaseManager.java:467)
	at org.meinProjekt.database.DBLogicUserInterfaceFactory.getLoggedInUserAccess(DBLogicUserInterfaceFactory.java:74)
	at org.meinProjekt.database.DBLogicUserInterfaceFactory.getLoggedInUser(DBLogicUserInterfaceFactory.java:56)
	at org.meinProjekt.database.DBLogicUserInterfaceFactory.getLogicAccess(DBLogicUserInterfaceFactory.java:34)
	at filters.InitUserFilter.doFilter(InitUserFilter.java:253)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:122)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.sql.SQLSyntaxErrorException: ORA-00903: Ungültiger Tabellenname

	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:440)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
	at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:837)
	at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:445)
	at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
	at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:523)
	at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
	at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:863)
	at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1153)
	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1267)
	at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3576)
	at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3677)
	at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1374)
	at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:169)
	at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery(SqlExecutor.java:186)
	at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.sqlExecuteQuery(MappedStatement.java:221)
	at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback(MappedStatement.java:189)

Mir ist leider nicht ganz klar, welche Änderungen ich noch an den XML-Dateien (sprich an den Mapping Dateien) vornehmen muss. Könnte mir da jemand einen Tip geben?

Danke im Voraus.
 
M

MacGyver

Gast
Wenn du User in User_ umbenennst schlagen alle Queries fehlt, die noch auf User als Tabellenname zielen.

Im Query "getUserDetails" muß also im Select Statement dann nicht mehr "from User" sondern "from User_" stehen. Darum gibts jetzt hier den Fehler "Ungültiger Tabellenname"..

Ich denke ein Search & Replace-Lauf auf der XML-Datei sollte das Problem beheben.
 

Helios co.

Lt. Commander
Ersteller dieses Themas
Dabei seit
März 2005
Beiträge
1.863
Das war auch meien Vermutung, und eigentlich habe ich alle betroffenen Queries angepasst. Und auf jdenen Fall die betreffende.

Wie ist es mit der Namensgebung in iBatis? Muss die User.xml ebenfalls in User_.xml umbenannt werden? Was ist mit dem Scope? Ist da noch mehr?

Mich verwunderte an der Fehlermeldung, dass egal was ich bis jetzt geändert habe,nicht wie zu erwarten war, die Fehlermeldung von:

Code:
The error occured in User.xml
zu:

Code:
The error occured in User_.xml
gewechselt ist. Da die Fehlermeldung eigentlich dynamisch erzeugt wird,muss ich wohl noch irgendwo etwas ändern. Oder liege ich falsch und das Ganze ist irrelevant?

Btw. die Query habe ich von Hand ausgeführt und sie funzt.
 
M

MacGyver

Gast
Dann dürfte das Mapping nicht stimmen und du mappst die User.xml auf die Oracle-Datenbank und nicht die User_.xml.

Mein Vorstellungsvermögen reicht leider nicht für tiefer gehende Diagnose. Dafür dürfte das alles etwas zu komplex sein ;)
 

Helios co.

Lt. Commander
Ersteller dieses Themas
Dabei seit
März 2005
Beiträge
1.863
Hmm, wenn ich das richtig verstehe, dann gibt es in dem System eine:

SQLMapConfix.xml, in der Einträge der Art: <sqlMap resource="User.xml"/> stehen.

Darüberhinaus gibt es eine Java-Datei "User.java" und eine "User.xml". Die User.xml enthält alle User-bezogenen Queries.

Sehr viel mehr als das,sehe ich zumindest für das Mapping nicht.

Ich muss doch für das Mapping eigentlich nicht den Namen dieser 3 Dateien ändern. Erst Recht nicht den Namen der Java-Datei, denn sonst wäre iBatis ja komplett sinnlos, oder liege ich da falsch?

Dann dürfte das Mapping nicht stimmen und du mappst die User.xml auf die Oracle-Datenbank und nicht die User_.xml.
Genau das ist der Punkt! Abgesehen von den oben genannten 3 Dateien, sehe ich keine weitere Mapping-Möglichkeit.

Für den Buildprozess kommt mir jedoch Maven zum Einsatz. Muss ich hier noch etwas machen? Sprich ein mvn:compiel oderähnliches durchführen?
 
Zuletzt bearbeitet:
M

MacGyver

Gast
Ich war davon ausgegangen dass es eine XML-Datei für die Quelle und eine für das Ziel gibt.
Ansonsten ist man ja gezwungen dass die Tabellen im Ziel genau mit denen in der Quelle übereinstimmen. Dann hast du meiner Ansicht nach verloren. Es sei denn, du benennst die User-Tabelle schon in der Quelle in User_ um.
 
Top