【问题标题】:SQLJ produced invalid Java codeSQLJ 产生了无效的 Java 代码
【发布时间】:2011-03-09 04:46:52
【问题描述】:

虽然我是该网站的老用户,但我之前自己设法解决了问题。这次我需要你的建议:)

情况: 我继承了使用 SQLJ 进行数据库访问的旧 Java 项目代码。项目中既不需要数据库也不需要 SQLJ,但我无法更改历史记录,因此必须忍受它。故事的另一部分是以前在 JDeveloper 中进行开发,但是新的公司标准需要 Eclipse(我更喜欢一个更好的产品)。

但是我在迁移 SQLJ 以使用 javac 而不是 Oracle 编译器自动构建 Ant 时遇到了问题。那么问题来了:

由于包结构的差异,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 

那么就OK了。

请注意,较新版本的 JDeveloper 也存在与使用 javac 相同的问题(我相信)。

作为一种解决方法,我们将 Java 文件与 SQLJ 一起存储,并且在我们从更改的 SQLJ 重新生成 java 之后,我们再次修复 Java。手动执行这些操作不太高兴,因为在需要更新 SQLJ 的情况下,它会使自动构建过程无效。

有人有什么想法吗?非常感谢您的帮助:)

干杯

【问题讨论】:

    标签: java sqlj


    【解决方案1】:

    好吧,我能得到的回应不多,尽管这是合理的 - 话题很少见。我也没有发现自己。 ant 和 sqlj 似乎存在需要克服的问题。

    事实上,我们必须跟上最初的解决方法。即我们确实编译了 sqlj,然后手动修改文件(脚本完成),然后编译它。丑陋但有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      相关资源
      最近更新 更多