2013-01-24 24 views
6

मैं एक मुद्दा मेरी ओरेकल क्वेरी में अंतराल पैरामीटर parameterize करने के लिए कोशिश कर रहा हो रहा है।स्प्रिंग नाम पैरामीटर: मैं अपनी क्वेरी में ओरेकल अंतराल को पैरामीटर कैसे कर सकता हूं? अगर मैं लगातार साथ अंतराल पैरामीटर को बदलना तो यह ठीक कार्यान्वित</p> <pre><code>select current_timestamp - interval :hours hour from dual </code></pre> <p>:

उद्धृत और SQL में गैर उद्धृत पैरामीटर की कोशिश की।

नीचे कम से कम स्निपेट का उपयोग कर एक उदाहरण देखें:

public class Main { 
    private static String SQL_CONSTANT_INTERVAL = "select current_timestamp - interval '1' hour from dual"; 

    private static String SQL_PARAMETERIZED_INTERVAL_QUOTED = "select current_timestamp - interval ':hours' hour from dual"; 

    private static String SQL_PARAMETERIZED_INTERVAL_UNQUOTED = "select current_timestamp - interval :hours hour from dual"; 

    public static void main(String[] args) throws Exception { 
     Properties properties = new Properties(); 
     properties.load(Main.class.getClassLoader().getSystemResourceAsStream("db.properties")); 
     DataSource dataSource = BasicDataSourceFactory.createDataSource(properties); 

     NamedParameterJdbcTemplate npTemplate = new NamedParameterJdbcTemplate(dataSource); 

     Map<String, String> params = Collections.singletonMap("hours", "1"); 

     String[] queries = 
       new String[] { SQL_CONSTANT_INTERVAL, SQL_PARAMETERIZED_INTERVAL_QUOTED, SQL_PARAMETERIZED_INTERVAL_UNQUOTED }; 

     for (String q : queries) { 
      System.out.println("Executing " + q); 
      try { 
       System.out.println("Result = " + npTemplate.queryForObject(q, params, String.class)); 
      } catch (RuntimeException e) { 
       System.out.println("Error: " + e); 
      } 
      System.out.println(); 
     } 
    } 
} 

आउटपुट:

Executing select current_timestamp - interval '1' hour from dual 
Result = 2013-01-24 18:55:16.373 Europe/Moscow 

Executing select current_timestamp - interval ':hours' hour from dual 
24-Jan-2013 20:55:16 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml] 
24-Jan-2013 20:55:16 org.springframework.jdbc.support.SQLErrorCodesFactory <init> 
INFO: SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase] 
Error: org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [select current_timestamp - interval ':hours' hour from dual]; ORA-01867: the interval is invalid 
; nested exception is java.sql.SQLDataException: ORA-01867: the interval is invalid 


Executing select current_timestamp - interval :hours hour from dual 
Error: org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [select current_timestamp - interval ? hour from dual]; nested exception is java.sql.SQLSyntaxErrorException: ORA-00923: FROM keyword not found where expected 
+0

स्रोत कोड: https://gist.github.com

NUMTODSINTERVAL(1, 'HOUR') 

तो फिर तुम इतने तरह अपने जावा एसक्यूएल में पूर्णांक शाब्दिक जगह ले सकता है/4632533 – vitaly

उत्तर

7

interval '1' hour एक Oracle literal है। इस प्रकार, आप इसके बीच में '1' को प्रतिस्थापित करने के लिए बाध्य पैरामीटर का उपयोग नहीं कर सकते हैं।

इसके बजाय, आप इस का उपयोग कर सकते हैं:

NUMTODSINTERVAL(?, 'HOUR') 
+0

एक आकर्षण की तरह काम किया, धन्यवाद। मुझे स्प्रिंग (या जेडीबीसी?) का एहसास नहीं हुआ है कि अक्षर – vitaly

+2

में चर को प्रतिस्थापित करने में समस्या है असल में, यह ओरेकल प्रतिबंध है। आपके स्प्रिंग/जेडीबीसी क्वेरी वेरिएबल्स डेटाबेस की निष्पादित वास्तविक क्वेरी में ओरेकल बाइंड वैरिएबल में बदल जाते हैं, और आप ओरेकल शाब्दिक के मध्य_ में कुछ _ को बदलने के लिए बस बाइंड वैरिएबल का उपयोग नहीं कर सकते हैं। – GriffeyDog