作者lueichun (= =)
看板java
標題[問題] 在JDBC,如何將經過preparedStatement處
時間Thu Feb 10 21:45:43 2022
※狀況概述:
在JDBC,PreparedStatement會將含有?的SQL,透過setString等方法,把?替代成參數值
從而組出真正可執行的SQL。但我現在疑似在這一步出錯,執行結果都沒有查詢出東西來。
所以我想看看組出來的SQL是甚麼樣子,我GOOGLE半天,找到的都是針對MySQL的語法,
而我用的資料庫是Oracle,Oracle似乎沒有可以把「組出來沒有?的SQL」印出來的語法。
請問還可以用甚麼方法,把「組出來沒有?的SQL」印出來呢??
※程式碼:
※錯誤訊息:
※補充說明:
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.10.13.51 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/java/M.1644500745.A.70E.html
1F:推 tw11509: visualvm jdbc profiler,要不然就用Debug模式追 02/10 22:48
2F:→ ssccg: 不會替代掉,至少在JDBC層不會 02/10 23:11
3F:→ ssccg: 對有支援parameterized query的DBMS(至少Oracle、MySQL都有 02/10 23:12
4F:→ ssccg: ),driver實作通常就是SQL string和參數分別傳給DBMS 02/10 23:13
5F:→ ssccg: 各DBMS的語法不同driver會處理,但是參數不會替代進去 02/10 23:14
6F:→ ssccg: 是說"Prepared"Statement的原用意就是讓DBMS可以cache相同 02/10 23:15
7F:→ ssccg: 的指令來跑多組參數用的啊 02/10 23:16
8F:→ MarcoReus: 有個work around的解法是自己寫一個中繼層紀錄params 02/11 00:03
9F:推 often897: P6SPY 02/11 00:45
10F:→ tw11509: S大就說了很清楚了,不過剛剛用VisualVM測試了一下,會 02/11 01:58
11F:→ tw11509: 處理後印出取代?後的SQL,方便你閱讀,最少你可以確 02/11 01:58
12F:→ tw11509: 認是否送出去的東西有錯誤 02/11 01:58
13F:→ tw11509: 有時候碰到這種問題可能需要檢查程式或相關設定是否有不 02/11 02:07
14F:→ tw11509: 正確的地方 02/11 02:07
15F:→ tw11509: 甚至你可以直接用完整的SQL語句來測試是否可以取得資 02/11 02:13
16F:→ tw11509: 料,如果可以,那就代表原本的程式可能有問題;反之,你 02/11 02:13
17F:→ tw11509: 可能要檢查DB相關的設定 02/11 02:13
18F:推 jej: 我猜原po是要問preparedstatement.toString 02/12 18:49
19F:→ jej: oracle沒有還原原始sql的樣子 02/12 18:49
20F:→ jej: 如果問題是這個 可以用九樓的套件 02/12 18:52
21F:→ jej: 或是用你上一篇的裝飾模式 02/12 18:52
22F:→ jej: 包裝ojdbc實作preparedstatement那個物件 02/12 18:52
23F:→ jej: 用其他樓所說的的方式達成 02/12 18:52
24F:推 haha02: 以前用過log4jdbc 可以印出取代後的SQL 02/14 02:48