2011-10-27 31 views
0

我在执行嵌套的SQL查询时遇到了一些麻烦。它工作正常,当我运行TOAD(对于Oracle数据库),但是当我尝试执行相同的查询从我的Java程序,它给了我一个错误:ORA-00923:FROM关键字找不到预期的地方: 以下是查询:查询在数据库上运行,但在java中抛出异常

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') 

就像我提到的,执行罚款蟾蜍和能够检索数据,但相同的查询将引发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

我曾与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:我想它写成注释,但出于某种原因,我不能在这个问题上。抱歉!

+0

谢谢吨!!工作得很好......干杯! – sloggers1894

+1

嗯,我' m很高兴它帮助你请将它标记为已接受的答案! – andreapier

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到第一绑定变量,另一方面,你不需要担心添加单引号(或转义任何单引号loc

+0

字符串loc已经附加了单引号,如下所示: String l oc =“'ENG_USA','ENG_CHINA','FR_FRANCE'”; 至于双引号,我很抱歉,这是一个错字。我有他们在我的代码..所以这仍然会给我同样的错误。 – sloggers1894

+0

@ user973536 - 您可以在一个字符串变量中构建SQL语句,打印该变量,然后将该变量传递给'executeQuery'调用?在构建SQL语句时,您在引入某个错误时会引入错误,但很难确定错误发生的位置,而无法准确了解两个变量中的含义。当然,如果你使用绑定变量,那么你就不必担心这些事情。 –

+0

我在单行中传递查询,它工作。所以我想把查询分成多行有一些问题。谢谢您的帮助。 – sloggers1894