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