簡體   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