2016-06-27 9 views
0

私はこのクエリを実行しようとしていると右括弧が欠落していたが、私はエラーにORA-00907:PreparedStatementの

ORA-00907を持っている:欠落している右括弧

私がレビュー括弧は正しいです。私は、クエリの最後の行を削除し、それが動作します:

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

は多分「>」oparatorで何かすることができますが、私はそれwhithoutこれを行うことはできません。

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

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; 
    } 
} 

ファイル)は複数の場合があります。

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

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

答えて

0

INTERVAL ? MINUTEは無効です。

構文はINTERVAL '1' MINUTEです(値には変数を指定できません)。

あなたがTO_DSINTERVAL()

何かのように使用する必要がある変数を指定したい場合は、次の脇

TO_DSINTERVAL('0 00:' || TO_CHAR(?, 'FM00') || ':00') 

アンをあなたが修正することにより、クエリにリストを渡すように見えます複数のバインド変数を取得するクエリ。あなたはこれをする必要はありません。代わりに、Oracleコレクションを単一のバインド変数として渡すことができます。この例はhereです(その例は多次元配列の場合より少し複雑です)。より簡単な例がhereです。

0

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

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

あなたは、単一引用符で時間量を配置する必要があります。

0

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

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

2番目の画分を必要とする場合、それは動作しませんので、これは、日付/時間(無秒の小数)に右側に変更されますのでご注意ください。