作者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/cn.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