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

看板java作者 (= =)時間2年前 (2022/02/10 21:45), 編輯推噓4(4020)
留言24則, 6人參與, 2年前最新討論串1/1
※狀況概述: 在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

02/10 22:48, 2年前 , 1F
visualvm jdbc profiler,要不然就用Debug模式追
02/10 22:48, 1F

02/10 23:11, 2年前 , 2F
不會替代掉,至少在JDBC層不會
02/10 23:11, 2F

02/10 23:12, 2年前 , 3F
對有支援parameterized query的DBMS(至少Oracle、MySQL都有
02/10 23:12, 3F

02/10 23:13, 2年前 , 4F
),driver實作通常就是SQL string和參數分別傳給DBMS
02/10 23:13, 4F

02/10 23:14, 2年前 , 5F
各DBMS的語法不同driver會處理,但是參數不會替代進去
02/10 23:14, 5F

02/10 23:15, 2年前 , 6F
是說"Prepared"Statement的原用意就是讓DBMS可以cache相同
02/10 23:15, 6F

02/10 23:16, 2年前 , 7F
的指令來跑多組參數用的啊
02/10 23:16, 7F

02/11 00:03, 2年前 , 8F
有個work around的解法是自己寫一個中繼層紀錄params
02/11 00:03, 8F

02/11 00:45, 2年前 , 9F
P6SPY
02/11 00:45, 9F

02/11 01:58, 2年前 , 10F
S大就說了很清楚了,不過剛剛用VisualVM測試了一下,會
02/11 01:58, 10F

02/11 01:58, 2年前 , 11F
處理後印出取代?後的SQL,方便你閱讀,最少你可以確
02/11 01:58, 11F

02/11 01:58, 2年前 , 12F
認是否送出去的東西有錯誤
02/11 01:58, 12F

02/11 02:07, 2年前 , 13F
有時候碰到這種問題可能需要檢查程式或相關設定是否有不
02/11 02:07, 13F

02/11 02:07, 2年前 , 14F
正確的地方
02/11 02:07, 14F

02/11 02:13, 2年前 , 15F
甚至你可以直接用完整的SQL語句來測試是否可以取得資
02/11 02:13, 15F

02/11 02:13, 2年前 , 16F
料,如果可以,那就代表原本的程式可能有問題;反之,你
02/11 02:13, 16F

02/11 02:13, 2年前 , 17F
可能要檢查DB相關的設定
02/11 02:13, 17F

02/12 18:49, 2年前 , 18F
我猜原po是要問preparedstatement.toString
02/12 18:49, 18F

02/12 18:49, 2年前 , 19F
oracle沒有還原原始sql的樣子
02/12 18:49, 19F

02/12 18:52, 2年前 , 20F
如果問題是這個 可以用九樓的套件
02/12 18:52, 20F

02/12 18:52, 2年前 , 21F
或是用你上一篇的裝飾模式
02/12 18:52, 21F

02/12 18:52, 2年前 , 22F
包裝ojdbc實作preparedstatement那個物件
02/12 18:52, 22F

02/12 18:52, 2年前 , 23F
用其他樓所說的的方式達成
02/12 18:52, 23F

02/14 02:48, 2年前 , 24F
以前用過log4jdbc 可以印出取代後的SQL
02/14 02:48, 24F
文章代碼(AID): #1Y1HS9SE (java)