1

我有一个查询

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

但是结果集是空的,没有得到结果。我调试了但没有太大帮助?

你能告诉我我在努力吗?

在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)  
4

1 回答 1

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 作为数据类型,来自这篇文章

如 Oracle JDBC Developer's guide and reference 11g 中所述,当使用 RAW 列时,您可以将其视为 BINARY 或 VARBINARY JDBC 类型,这意味着您可以使用返回或接受的 JDBC 标准方法 getBytes() 和 setBytes()一个字节[]。其他选项是使用 Oracle 驱动程序特定的扩展 getRAW() 和 setRAW(),它们返回或接受 oracle.sql.RAW。使用这两个将需要您解包和/或转换为特定的 Oracle 实现类。

进一步从代码可读性的角度来看,您的解决方案让新开发人员接管变得很痛苦。我经常看到人们让 sql 变得“动态”,而实际上 99% 的时间你不需要这种级别的动态查询构建。在大多数人看来这听起来不错,但它只会在 SDLC 中引起痛苦和痛苦。

于 2013-09-05T12:18:03.923 回答