雖然我是網站的舊時用戶,但之前設法自己解決問題。這一次我需要你的建議:)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需要更新時使自動構建過程失效。
任何人有任何想法?你的幫助是非常讚賞:)
乾杯