0

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

引用回复

4

2 回答 2

2

我对mysql有类似的问题。我的问题是我将查询拆分为多行,而在 2 行之间没有留下空格。所以你的查询应该是:

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:我想把它写成评论,但由于某种原因我不能回答这个问题。对不起!

于 2011-10-27T17:56:30.980 回答
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.

于 2011-10-27T17:57:26.843 回答