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 開発者ガイドおよびリファレンス 11g で説明されているように、RAW 列を使用する場合、それを BINARY または VARBINARY JDBC 型として扱うことができます。つまり、JDBC 標準メソッド getBytes() および setBytes() を使用できます。バイト[]。その他のオプションは、oracle.sql.RAW を返すか受け入れる Oracle ドライバ固有の拡張 getRAW() および setRAW() を使用することです。これら 2 つを使用するには、特定の Oracle 実装クラスにアンラップまたはキャストする必要があります。

さらにコードの可読性の観点から言えば、あなたのソリューションは、新しい開発者が引き継ぐのを難しくします。実際には 99% の確率で、このレベルの動的クエリ構築は必要ないのに、SQL を「動的」にしている人をよく見かけます。ほとんどの人の頭の中では良さそうに聞こえますが、SDLC に痛みや苦しみをもたらすだけです。

于 2013-09-05T12:18:03.923 に答える