2015-05-05 5 views
5

मैं निम्नलिखित SQL स्क्रिप्ट (initDB.sql)लाइन निरंतरता स्प्रिंग एसक्यूएल ScriptUtils (एच 2 का उपयोग करना)

CREATE TABLE FFShareHistorical ( ID int NOT NULL AUTO_INCREMENT, 
            PX_LAST Double DEFAULT NULL, 
            PX_OPEN Double DEFAULT NULL, 
            PX_HIGH Double DEFAULT NULL, 
            PX_LOW Double DEFAULT NULL, 
            PRIMARY KEY (ID)) 

और, स्प्रिंग के ScriptUtils (4.1.4.RELEASE) का उपयोग कर इसे निष्पादित करने के लिए चाहते हैं यानी

Resource rc = new ClassPathResource("initDB.sql"); 
ScriptUtils.executeSqlScript(dataSource.getConnection(), rc); 

समस्या यह है कि ऐसा लगता है कि पंक्ति विराम SQL विवरण की समाप्ति के रूप में व्याख्या कर रहे हैं, यानी त्रुटि स्टैक ट्रेस इस

org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement at line 1 of resource class path resource [initDB.sql]: CREATE TABLE FFShareHistorical (ID int NOT NULL AUTO_INCREMENT, ; nested exception is org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "CREATE TABLE FFSHAREHISTORICAL (ID INT NOT NULL AUTO_INCREMENT, "; expected "identifier"; SQL statement: 
CREATE TABLE FFShareHistorical (ID int NOT NULL AUTO_INCREMENT, [42001-176] 
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:344) 
    at org.h2.message.DbException.getSyntaxError(DbException.java:204) 
    at org.h2.command.Parser.readColumnIdentifier(Parser.java:3068) 
    at org.h2.command.Parser.parseCreateTable(Parser.java:5722) 
    at org.h2.command.Parser.parseCreate(Parser.java:4122) 
    at org.h2.command.Parser.parsePrepared(Parser.java:351) 
    at org.h2.command.Parser.parse(Parser.java:306) 
    at org.h2.command.Parser.parse(Parser.java:278) 
    at org.h2.command.Parser.prepareCommand(Parser.java:243) 
    at org.h2.engine.Session.prepareLocal(Session.java:442) 
    at org.h2.server.TcpServerThread.process(TcpServerThread.java:265) 
    at org.h2.server.TcpServerThread.run(TcpServerThread.java:160) 
    at java.lang.Thread.run(Unknown Source) 

    at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:475) 
    at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:393) 
    at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:372) 
    at ch.qpmlib.flatfiledatabase.jdbc.dao.FFDBSetup.setupDB(FFDBSetup.java:26) 
    at ch.qpmlib.flatfiledatabase.jdbc.main.SpringMain.setupDB(SpringMain.java:30) 
    at ch.qpmlib.flatfiledatabase.jdbc.main.SpringMain.main(SpringMain.java:17) 
Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "CREATE TABLE FFSHAREHISTORICAL (ID INT NOT NULL AUTO_INCREMENT, "; expected "identifier"; SQL statement: 
CREATE TABLE FFShareHistorical (ID int NOT NULL AUTO_INCREMENT, [42001-176] 
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:344) 
    at org.h2.message.DbException.getSyntaxError(DbException.java:204) 
    at org.h2.command.Parser.readColumnIdentifier(Parser.java:3068) 
    at org.h2.command.Parser.parseCreateTable(Parser.java:5722) 
    at org.h2.command.Parser.parseCreate(Parser.java:4122) 
    at org.h2.command.Parser.parsePrepared(Parser.java:351) 
    at org.h2.command.Parser.parse(Parser.java:306) 
    at org.h2.command.Parser.parse(Parser.java:278) 
    at org.h2.command.Parser.prepareCommand(Parser.java:243) 
    at org.h2.engine.Session.prepareLocal(Session.java:442) 
    at org.h2.server.TcpServerThread.process(TcpServerThread.java:265) 
    at org.h2.server.TcpServerThread.run(TcpServerThread.java:160) 
    at java.lang.Thread.run(Unknown Source) 
की तरह लग रहा है

तो सवाल यह है कि मैं एक बहुभाषी एसक्यूएल स्क्रिप्ट के साथ ScriptUtils का उपयोग कैसे कर सकता हूं? विशेष रूप से मैं किसी प्रकार की "लाइन निरंतरता" चरित्र की तलाश कर रहा हूं जिसे मैं स्क्रिप्ट में जोड़ सकता हूं या स्प्रिंग्स स्क्रिप्ट को सभी नए अक्षरों को हटाने के लिए कह सकता हूं।

+0

वसंत किस संस्करण का उपयोग कर रहे हैं? .. –

+0

मैं 4.1.4 का उपयोग कर रहा हूँ। रिलीज –

उत्तर

3

आपके संग्रह में दस्तावेज़ हैं। निम्न स्थानों को देखो:

  • springframework-4.1.4.RELEASE-जिले/springframework-4.1.4.RELEASE/docs/जावाडोक-api/org/springframework/JDBC/डेटा स्रोत/init/
  • वसंत-ढांचा-4.1.4.RELEASE-जिले/वसंत-ढांचा-4.1.4.RELEASE/docs/वसंत-ढांचा-संदर्भ/

executeSqlScript(...) विधि आंतरिक रूप से एक ResourceDatabasePopulator प्रयोग SQL स्क्रिप्ट निष्पादित करने के लिए ।

ResourceDatabasePopulator बाह्य संसाधनों में परिभाषित एसक्यूएल स्क्रिप्ट का उपयोग करके प्रोग्रामेटिक रूप से पॉप्युलेटिंग, प्रारंभिक, या डेटाबेस को साफ करने के लिए एक साधारण ऑब्जेक्ट-आधारित API प्रदान करता है।

ResourceDatabasePopulator विन्यस्त करने के लिए विकल्प प्रदान करता है -

  • वर्ण एन्कोडिंग
  • बयान विभाजक
  • टिप्पणी
  • त्रुटि हैंडलिंग जब पार्स करने और स्क्रिप्ट

से प्रत्येक को क्रियान्वित करने के लिए इस्तेमाल किया झंडे सीमांकक कॉन्फ़िगरेशन विकल्पों में डिफ़ॉल्ट va है लू

एसक्यूएल स्क्रिप्ट के भीतर डिफ़ॉल्ट कथन विभाजक ";" पर सेट है।

इसके अलावा:

  • static void executeSqlScript(Connection connection, EncodedResource resource) बयान विभाजक, टिप्पणी सीमांकक, और अपवाद हैंडलिंग झंडे के लिए डिफ़ॉल्ट सेटिंग का उपयोग दिया SQL स्क्रिप्ट निष्पादित।

  • static void executeSqlScript(Connection connection, EncodedResource resource, boolean continueOnError, boolean ignoreFailedDrops, String commentPrefix, String separator, String blockCommentStartDelimiter, String blockCommentEndDelimiter) दिए गए SQL स्क्रिप्ट का निष्पादन करें।

  • static void executeSqlScript(Connection connection, Resource resource) कथन विभाजक, टिप्पणी delimiters, और अपवाद हैंडलिंग झंडे के लिए डिफ़ॉल्ट सेटिंग्स का उपयोग कर दिए गए एसक्यूएल स्क्रिप्ट निष्पादित करें।


हालांकि, वहाँ "\n" को वापस आने तंत्र हैं, जब वहाँ पूरी स्क्रिप्ट में कोई ";"। अधिक जानकारी के लिए @chuchikaeschtli जवाब देखें।

+0

मैं प्रयास की सराहना करता हूं और इसे ऊपर उठाता हूं। हालांकि, यह वास्तव में प्रश्न का उत्तर नहीं देता है, यानी समस्या "\ n" होने पर फॉलबैक तंत्र है जब कोई ";" नहीं है पूरी लिपि में। यदि आप इसे अपने उत्तर में जोड़ते हैं तो मैं इसे स्वीकार करूंगा। धन्यवाद। –

+0

आपका स्वागत है! मुझे अपना जवाब अपडेट किया गया है। –

5

जैसा कि यह पता चला है, मल्टीलाइन कथन का उपयोग करने में कोई समस्या नहीं है। हालांकि, अगर कथन (ओं) को ";" से समाप्त नहीं किया गया है, तो ScriptUtils "\ n" को विभाजक के रूप में उपयोग करने के लिए वापस आ जाएगा। तो इस मामले में सिर्फ ";" का उपयोग करके स्क्रिप्ट को समाप्त करना यानी

CREATE TABLE FFShareHistorical ( ID int NOT NULL AUTO_INCREMENT, 
            PX_LAST Double DEFAULT NULL, 
            PX_OPEN Double DEFAULT NULL, 
            PX_HIGH Double DEFAULT NULL, 
            PX_LOW Double DEFAULT NULL, 
            PRIMARY KEY (ID)); 

नौकरी करेगा।

0

ScriptUtils ऐसे परिदृश्यों के लिए स्पष्ट समर्थन है।

ScriptUtils.EOF_STATEMENT_SEPARATORseparator के मान के रूप में बस पास करें।

फ़ाइल (EOF) SQL विवरण विभाजक का अंत:: "^^^ स्क्रिप्ट समाप्त ^^^"

यहाँ EOF_STATEMENT_SEPARATOR के लिए जावाडोक है।

यह मान विभाजक के रूप में executeSqlScript(Connection, EncodedResource, boolean, boolean, String, String, String, String) पर प्रदान किया जा सकता है ताकि यह इंगित किया जा सके कि एक SQL स्क्रिप्ट में एक स्पष्ट कथन विभाजक के साथ एक एकल कथन (संभावित रूप से एकाधिक पंक्तियों को फैला रहा है) शामिल है। ध्यान दें कि ऐसी स्क्रिप्ट में वास्तव में यह मान नहीं होना चाहिए; यह केवल आभासी कथन विभाजक है।

सादर,

सैम (स्प्रिंग TestContext फ्रेमवर्क की लेखक)

संबंधित मुद्दे