繁体   English   中英

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

[英]Query runs on DB but throws exception in java

我在执行嵌套的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+")

引用回复

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

首先,我没有在Java代码中看到开头或结尾的双引号。 由于你的Java代码必须编译才能足够接收Oracle错误,我假设在SELECT之前有一个双引号,在最后的close paren之后有一个双引号,然后是另一个匹配的父代匹配在executeQuery上打开paren。 所以我假设你的实际代码是这样的

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任何单引号)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM