[問題] 在JDBC,如何將經過preparedStatement處

作者: lueichun (no anonymous)   2022-02-10 21:45:43
※狀況概述:
在JDBC,PreparedStatement會將含有?的SQL,透過setString等方法,把?替代成參數值
從而組出真正可執行的SQL。但我現在疑似在這一步出錯,執行結果都沒有查詢出東西來。
所以我想看看組出來的SQL是甚麼樣子,我GOOGLE半天,找到的都是針對MySQL的語法,
而我用的資料庫是Oracle,Oracle似乎沒有可以把「組出來沒有?的SQL」印出來的語法。
請問還可以用甚麼方法,把「組出來沒有?的SQL」印出來呢??
※程式碼:
※錯誤訊息:
※補充說明:
作者: tw11509 (John-117)   2022-02-10 22:48:00
visualvm jdbc profiler,要不然就用Debug模式追
作者: ssccg (23)   2022-02-10 23:11:00
不會替代掉,至少在JDBC層不會對有支援parameterized query的DBMS(至少Oracle、MySQL都有),driver實作通常就是SQL string和參數分別傳給DBMS各DBMS的語法不同driver會處理,但是參數不會替代進去是說"Prepared"Statement的原用意就是讓DBMS可以cache相同的指令來跑多組參數用的啊
作者: MarcoReus (Marco Reus)   2022-02-11 00:03:00
有個work around的解法是自己寫一個中繼層紀錄params
作者: often897 (澤渡 真琴)   2022-02-11 00:45:00
P6SPY
作者: tw11509 (John-117)   2022-02-11 01:58:00
S大就說了很清楚了,不過剛剛用VisualVM測試了一下,會處理後印出取代?後的SQL,方便你閱讀,最少你可以確認是否送出去的東西有錯誤有時候碰到這種問題可能需要檢查程式或相關設定是否有不正確的地方甚至你可以直接用完整的SQL語句來測試是否可以取得資料,如果可以,那就代表原本的程式可能有問題;反之,你可能要檢查DB相關的設定
作者: jej (晃奶大馬桶)   2022-02-12 18:49:00
我猜原po是要問preparedstatement.toStringoracle沒有還原原始sql的樣子如果問題是這個 可以用九樓的套件或是用你上一篇的裝飾模式包裝ojdbc實作preparedstatement那個物件用其他樓所說的的方式達成
作者: haha02 (來人!上夾棍!)   2022-02-14 02:48:00
以前用過log4jdbc 可以印出取代後的SQL

Links booklink

Contact Us: admin [ a t ] ucptt.com