我在执行嵌套的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+")
回复报价
答案 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}中的任何单引号}。