查询在DB上运行但在java中引发异常

时间:2011-10-27 17:47:45

标签: java sql oracle jdbc nested-query

我在执行嵌套的sql查询时遇到了一些麻烦。它在TOAD(对于Oracle DB)上运行时工作正常,但是当我尝试从我的java程序执行相同的查询时,它给出了一个错误:ORA-00923:找不到FROM关键字: 这是查询:

Select *
from(select tb1.Number, tb1.Desc, tb1.Local, tb2.Division
     from tb1
     inner join tb2
     on tb1.Number = tb2.Number
     and Local in ('ENG_USA', 'ENG_CHINA', 'FR_FRENCH'))
where Number in ('7512','4706')

就像我提到的,它在Toad上执行正常并且能够检索数据,但同一个查询会抛出ORA-00923异常。

rset = stmt.executeQuery(Select *
from(select tb1.Number, tb1.Desc, tb1.Local, tb2.Division
from tb1
inner join tb2
on tb1.Number = tb2.Number
and Local in ("+loc+"))
where Number in ("+s+")

回复报价

2 个答案:

答案 0 :(得分:2)

我和mysql有类似的问题。我的问题是我在多行中分割查询而不在两行之间留下空格。 所以你的查询应该是:

rset = stmt.executeQuery("Select * from(select tb1.Number, tb1.Desc, tb1.Local, tb2.Division from tb1 inner join tb2 on tb1.Number = tb2.Number and Local in ("+loc+")) where Number in ("+s+")"
PS:我想把它写成评论,但出于某种原因,我不能在这个问题上。遗憾!

答案 1 :(得分:0)

首先,我没有在Java代码中看到开头或结尾的双引号。由于您的Java代码必须编译才能获得足够远的接收Oracle错误,我假设在SELECT之前有双引号,在最终关闭之后有双引号,然后是另一个关闭父级以匹配executeQuery上的开放式父级。所以我假设您的实际代码类似于

rset = stmt.executeQuery(
        "Select *
           from(select tb1.Number, tb1.Desc, tb1.Local, tb2.Division
                  from tb1
                       inner join tb2
                          on tb1.Number = tb2.Number
                             and Local in ("+loc+"))
                 where Number in ("+s+")");

您是否有动态构建SQL语句而不是使用绑定变量?使用绑定变量更安全,因为您不必担心SQL注入攻击。它更高效,因为您不是每次都强制数据库硬解析查询。它可以避免引发和转义中出现的各种错误。在您的情况下,假设局部变量loc没有前导和尾随单引号,您需要在查询中包含那些

rset = stmt.executeQuery(
        "Select *
           from(select tb1.Number, tb1.Desc, tb1.Local, tb2.Division
                  from tb1
                       inner join tb2
                          on tb1.Number = tb2.Number
                             and Local in ('"+loc+"'))
                 where Number in ("+s+")");

如果您使用绑定变量并将loc绑定到第一个绑定变量,另一方面,您不必担心添加单引号(或转义{{1}中的任何单引号}。