0

私はウェブサイトの古いユーザーですが、以前は自分で問題を解決することができました. 今回はあなたのアドバイスが必要です:)

状況: SQLJ がデータベース アクセスに使用される古い Java プロジェクト コードを継承しました。このプロジェクトにはデータベースも SQLJ も必要ありませんが、履歴を変更することはできないため、それと一緒に暮らす必要があります。話のもう 1 つの部分は、以前は JDeveloper で開発が行われていたということですが、新しい会社の標準では Eclipse (私の好みではより優れた製品) が必要です。

しかし、SQLJ を Oracle コンパイラの代わりに javac を使用して Ant で自動的にビルドするように移行する際に問題が発生しました。だからここに問題があります:

パッケージ構造の違いにより、SQLJ によって生成された Java ファイルは javac コンパイラでは有効ではありません。ただし、JDeveloper (11.1.1.0.2) は、古いオラクル コンパイラを使用する限り、そのような 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 も使用しているため、同じ問題があることに注意してください (私は信じています)。

回避策として、SQLJ とともに Java ファイルを保存し、変更された SQLJ から Java を再生成した後、Java を再度修正します。SQLJ を更新する必要がある場合の自動ビルド手順が無効になるため、手動で行うことにはあまり満足できません。

誰にもアイデアはありますか?あなたの助けは大歓迎です:)

乾杯

4

1 に答える 1

0

まあ、それは合理的ですが、私が応答を得ることができることはあまりありません.トピックはまれです. 私も自分自身を見つけたことはあまりありません。克服する必要がある ant と sqlj に既存の問題があるようです。

実際、元の回避策についていく必要がありました。つまり、sqlj をコンパイルしてから、手動でファイルを変更し (scrip が行います)、それをコンパイルします。醜いが動作します。

于 2011-04-13T05:36:22.620 に答える