2011-03-09 103 views
0

雖然我是網站的舊時用戶,但之前設法自己解決問題。這一次我需要你的建議:)SQLJ生成無效的Java代碼

The situation: 我已經繼承了SQLJ用於數據庫訪問的舊Java項目代碼。該項目不需要數據庫和SQLJ,但我無法更改歷史記錄,因此不得不忍受它。這個故事的另一部分是之前的開發是在JDeveloper中完成的,然而新的公司標準需要Eclipse(我的偏好是一個更好的產品)。

但我有一個遷移SQLJs的問題,使用javac代替Oracle編譯器自動構建Ant。因此,問題來了:

由於Package結構的差異,SQLJ生成的Java文件對於javac編譯器無效。但是JDeveloper(11.1.1.0.2)只要使用舊的oracle編譯器就可以接受這樣的java文件。既SQLJ和Java的例子來解釋這個問題更好:

SQLJ

package Sess; 
public class UserDB extends Object implements SessConstants 
{ 
    #sql public static iterator UserIterator(
     String    m 
<cut off> 
    ); 
<cut off> 

private static UserIterator UserIter = null; 
} 

public static boolean readNext(User theUser) 
    throws SQLException 
    { 
    if (iteratorOpen == false) 
    { 
    #sql UserIter = { 
     select 
      m 
      <cut off> 
    from 
      <cut off> 
    }; 

    iteratorOpen = true; 
    <cut off> 

生成的Java:

package Sess; 
public class UserDB extends Object implements SessConstants 
{ 
public static class UserIterator 
extends sqlj.runtime.ref.ResultSetIterImpl 
implements sqlj.runtime.NamedIterator 
<cut off> 
public static boolean readNext(User theUser) 
throws SQLException 
{ 
if (iteratorOpen == false) 
{ 
<cut off> 

{ 
<cut off> 

UserIter = new Sess.UserDB.UserIterator(new 
... 
<cut off> 

問題是與塔的最後一條語句

UserIter = new Sess.UserDB.UserIterator(new  ... 

它實際上應該是:

UserIter = new UserDB.UserIterator(new 

然後就可以了。

請注意,較新版本的JDeveloper具有相同的問題,因爲它們也使用javac(我相信)。

作爲一種解決方法,我們將Java文件與SQLJ一起存儲,並且在從SQLJ重新生成Java之後,我們再次修復了Java。手動執行這些東西並不是很開心,因爲它會在SQLJ需要更新時使自動構建過程失效。

任何人有任何想法?你的幫助是非常讚賞:)

乾杯

回答

0

好了,不多我可以得到迴應,儘管這是合理的 - 專題是難得的一個。我也沒有發現太多。它看起來像螞蟻和sqlj存在一個問題需要克服。我們不得不跟上原來的解決方法。即我們編譯sqlj,然後手動修改文件(scrip),然後編譯它。醜陋但有用。