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 に答える