1

このクエリを実行しようとしていますが、エラーが発生しました

ORA-00907: 右括弧がありません

ステートメントを確認しましたが、括弧は正しいです。クエリの最後の行を削除しましたが、動作します:

AND TN.LAST_UPDATEDATE > (CURRENT_TIMESTAMP - INTERVAL ? MINUTE)

「>」演算子の何かかもしれませんが、それなしではこれを行うことはできません。

コード:

String sql= "SELECT DID.ORDER_ID "
            + "FROM TEST_ORDER DID, TEST_ORDER_SG DOS, TEST_HRD_SHIPS_GRP DHSG, TEST_INFO CSI "
            + "WHERE DID.ORDER_ID = DOS.ORDER_ID "
            + "AND DOS.SHIPPING_GROUPS = DHSG.SHIPPING_ID "
            + "AND DOS.SHIPPING_GROUPS = CSI.SHIPPING_ID "
            + "AND DHSG.TRACKING_CODE IS NULL AND CSI.SHIPPING_CARRIER IN "
            + "(?) "
            + "AND DID.STATE IN (?) "
            + "AND NOT EXISTS "
            + "("
            + "SELECT 1 FROM "
            + "CLIENT_INTEGRATION.TEST_LOG_ORDERS_STATUS TN "
            + "WHERE TN.ORDER_ID = DID.ORDER_ID AND TN.STATE = DID.STATE "
            + "AND TN.LAST_UPDATEDATE > (CURRENT_TIMESTAMP - INTERVAL ? MINUTE)"
            + ")";

パラメータをバインドするコード:

int actualIndex = 0;
for (int i = 0; i < params.length; i++) {
    actualIndex = sql.indexOf('?', actualIndex+1);
    Class classe = params[i].getClass();

    if(classe.isArray()) {
        StringBuffer newPlaceHolders = new StringBuffer();

        int arrayLength = java.lang.reflect.Array.getLength(params[i]);

        for (int j = 0; j < arrayLength; j++) {

            if (j>0) {
                newPlaceHolders.append(",?");                        
            } else {
                newPlaceHolders.append("?");                        
            }
        }

        sql = sql.substring(0, actualIndex) + newPlaceHolders + sql.substring(actualIndex+1);
        actualIndex += newPlaceHolders.length();
    }

    if (actualIndex == -1) {
           break;
    }
}

したがって、別の方法では、いくつかの for ループを埋めます。場合によっては、(プロパティ ファイルにある) パラメーターが複数になる可能性があります。

int i=1;
    for(String carriers : getCarrier()) {
        ps.setString(i, carriers);              
        i++;
    }

    for(String state : getAllStates()) {
        ps.setString(i, state);
        i++;
    }
4

3 に答える 3

0

intervalorを使用するより簡単なソリューションto_dsinterval()は、直接日付演算を使用することです。日時またはタイムスタンプに数値を加算または減算できます。数値は日単位で表されるため、入力 (? として表示) が分単位の場合は、24*60 で割る必要があります。そのようです:

... and tn.last_update > current_timestamp - ? / 24 * 60

これにより、右側が日付/時刻 (小数秒なし) に変更されるため、小数秒が必要な場合は機能しないことに注意してください。

于 2016-06-27T15:11:10.147 に答える
0

サブクエリの句の最終条件は、次のWHEREようになります。

AND TN.LAST_UPDATEDATE > (CURRENT_TIMESTAMP - INTERVAL '10' MINUTE)

時間は一重引用符で囲む必要があります。

于 2016-06-27T14:25:54.207 に答える