我有一个查询
SELECT instance_guid FROM service_instances WHERE service_template_guid='E578F99360A86E4EE043C28DE50A1D84' AND service_family_name='TEST'
直接执行此操作会返回
4FEFDE7671A760A8DC8FC63CFBFC8316
F2F9DF641D8E2CACC03175A7A628D51D
现在我正在尝试使用JDBC中的相同代码。
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = executionContext.getConnection();
if (conn != null) {
ps = (PreparedStatement)conn.prepareStatement(query);
if (params == null) params = new Object[0];
for (int i=0;i<params.length;i++) {
if (params[i] instanceof Integer) {
ps.setInt(i+1, ((Integer)params[i]).intValue());
} else if (params[i] instanceof java.util.Date) {
((PreparedStatement)ps).setDATE(i+1, new oracle.sql.DATE((new java.sql.Timestamp(((Date)params[i]).getTime()))));
//ps.setObject(i+1, new oracle.sql.DATE(new Time(((Date)params[i]).getTime())));
} else {
if (params[i] == null) params[i] = "";
ps.setString(i+1, params[i].toString());
}
}
rs = ps.executeQuery();
我看到params[0] =E578F99360A86E4EE043C28DE50A1D84 and params[1]=TEST
但是resultSet是空的并且没有得到结果。我已经调试但没有多大帮助?
你能告诉我我正在尝试吗?
在java中定义如下
final static private String INSTANCE_GUID_BY_TEMPLATE_GUID =
"SELECT instance_guid FROM service_instances WHERE service_template_guid=? AND service_family_name=? "
SERVICE_FAMILY_NAME NOT NULL VARCHAR2(256)
SERVICE_TEMPLATE_GUID NOT NULL RAW(16 BYTE)
答案 0 :(得分:3)
首先,这会破坏我见过的每个sql映射模式。
String sql = "SELECT instance_guid FROM service_instances WHERE service_template_guid=? AND service_family_name=?";
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = executionContext.getConnection();
ps = conn.prepareStatement(sql);
ps.setString(1,guid);
ps.setString(2,family);
rs = ps.executeQuery();
while(rs.next(){...}
...
}
除非您尝试将一些代码写入从数据库X到数据库Y的端口,否则您不应该动态地计算出数据类型。
更新
我发现您使用RAW作为数据类型,来自post:
如Oracle JDBC Developer的指南和参考11g中所述, 使用RAW列时,可以将其视为BINARY或VARBINARY JDBC类型,这意味着您可以使用JDBC标准方法 getBytes()和setBytes()返回或接受byte []。另一个 选项是使用Oracle驱动程序特定的扩展getRAW()和 setRAW()返回或接受oracle.sql.RAW。使用这两个会 要求您解包和/或强制转换为特定的Oracle 实施班。
此外,从代码可读性的角度来看,您的解决方案使新开发人员难以接管。我经常看到人们让sql变得“动态”,而实际上99%的时候你不需要这种级别的动态查询构建。在大多数人的头脑中听起来不错,但它只会导致SDLC的疼痛和痛苦。