2010-01-15 17 views
28

मैं सभी फाइल सामग्री को बिना किसी बड़ी क्वेरी में पढ़ने और इसे निष्पादित किए बिना जावा में एक SQL स्क्रिप्ट फ़ाइल निष्पादित करना चाहता हूं। क्या कोई मानक तरीका है?जावा में एसक्यूएल-स्क्रिप्ट फ़ाइल कैसे निष्पादित करें?

उत्तर

15

ऐसा करने का कोई पोर्टेबल तरीका नहीं है। आप एक बाहरी प्रोग्राम के रूप में एक देशी ग्राहक को अंजाम कि हालांकि ऐसा करने के लिए कर सकते हैं:

import java.io.*; 
public class CmdExec { 

    public static void main(String argv[]) { 
    try { 
     String line; 
     Process p = Runtime.getRuntime().exec 
     ("psql -U username -d dbname -h serverhost -f scripfile.sql"); 
     BufferedReader input = 
     new BufferedReader 
      (new InputStreamReader(p.getInputStream())); 
     while ((line = input.readLine()) != null) { 
     System.out.println(line); 
     } 
     input.close(); 
    } 
    catch (Exception err) { 
     err.printStackTrace(); 
    } 
    } 
} 
  • कोड का नमूना here से निकाला और यह सोचते हैं उपयोगकर्ता एक PostgreSQL स्क्रिप्ट फ़ाइल को कार्यान्वित करना चाहता है कि इस सवाल का जवाब करने के लिए संशोधित किया गया था।
2

नहीं, आपको फ़ाइल को पढ़ना होगा, इसे अलग-अलग प्रश्नों में विभाजित करना होगा और फिर उन्हें व्यक्तिगत रूप से निष्पादित करना होगा (या जेडीबीसी के बैच एपीआई का उपयोग करना)।

कारणों में से एक (दूसरों /, कुछ अपनी खुद की विभाजक परिभाषित करने के लिए दोनों या यहाँ तक कि अनुमति देते हैं, कुछ का उपयोग ;) है कि हर डेटाबेस SQL ​​कथन को अलग करने के अपने तरीके से परिभाषित करता है।

0

जेडीबीसी इस विकल्प का समर्थन नहीं करता है (हालांकि एक विशिष्ट डीबी ड्राइवर यह पेशकश कर सकता है)। वैसे भी, सभी फ़ाइल सामग्री को स्मृति में लोड करने में कोई समस्या नहीं होनी चाहिए।

2

आप जेडीबीसी का उपयोग नहीं कर सकते क्योंकि यह समर्थन नहीं करता है। IBatis iBATIS सहित चारों ओर काम करना एक दृढ़ता ढांचा है और कन्स्ट्रक्टर को कॉल करें जैसा कि iBatis दस्तावेज में दिखाया गया है।

इसका अच्छा नहीं आदेश एक सरल एसक्यूएल स्क्रिप्ट किसी भी तरीके में जो आप कमांड लाइन

$ mysql -u root -p db_name < test.sql 
+0

ibatis इस कार्य के लिए अच्छा लगता है! – felipecrp

23

का उपयोग कर जावा से SQL स्क्रिप्ट को क्रियान्वित करने के महान तरीका नहीं है क्या कर सकते हैं चलाने के लिए ibatis की तरह एक भारी वजन हठ ढांचे शामिल करने के लिए जब तक आप चींटी पर निर्भरता नहीं रखते हैं, तब तक उन्हें स्वयं को पढ़ने के बिना। मेरी राय में इस तरह की निर्भरता आपके मामले में बहुत अच्छी तरह से उचित है।

private void executeSql(String sqlFilePath) { 
    final class SqlExecuter extends SQLExec { 
     public SqlExecuter() { 
      Project project = new Project(); 
      project.init(); 
      setProject(project); 
      setTaskType("sql"); 
      setTaskName("sql"); 
     } 
    } 

    SqlExecuter executer = new SqlExecuter(); 
    executer.setSrc(new File(sqlFilePath)); 
    executer.setDriver(args.getDriver()); 
    executer.setPassword(args.getPwd()); 
    executer.setUserid(args.getUser()); 
    executer.setUrl(args.getUrl()); 
    executer.execute(); 
} 
+0

मैंने अपनी ओरेकल एसक्यूएल स्क्रिप्ट्स में से कुछ के लिए यह कोशिश की, यह 'डालने' के लिए काम करता है, 'टेबल बनाएं'। लेकिन स्क्रिप्ट के लिए 'ट्रिगर बनाना या प्रतिस्थापित करना' के लिए यह ** java.sql.SQLSyntaxErrorException: ORA-00900: अमान्य SQL कथन ** –

+0

शायद आपके delimiters – carpinchosaurio

0

इस कोड का प्रयास करें:: यहाँ नमूना कोड है, जहां SQLExec वर्ग ant.jar में रहती है

String strProc = 
     "DECLARE \n" + 
     " sys_date DATE;"+ 
     "" + 
     "BEGIN\n" + 
     "" + 
     " SELECT SYSDATE INTO sys_date FROM dual;\n" + 
     "" + 
     "END;\n"; 

try{ 
    DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver()); 
    Connection connection = DriverManager.getConnection ("jdbc:oracle:thin:@your_db_IP:1521:your_db_SID","user","password"); 
    PreparedStatement psProcToexecute = connection.prepareStatement(strProc); 
    psProcToexecute.execute(); 
}catch (Exception e) { 
    System.out.println(e.toString()); 
} 
+8

पर विचार करना चाहिए आपका उदाहरण अत्यधिक सरल है। एक 'स्टेटमेंट' आमतौर पर एक समय में केवल एक SQL कथन निष्पादित कर सकता है। सवाल का तात्पर्य है कि इसमें बड़ी संख्या में प्रश्न या सम्मिलन शामिल हैं, और इसलिए उन्हें विभाजक ढूंढकर अलग-अलग वक्तव्य में विभाजित करने की आवश्यकता है। – BoffinbraiN

+0

सहमत हैं, यह समाधान बहु-कथन स्क्रिप्ट पर काम नहीं करेगा। जैसा कि नीचे सुझाया गया है jisql का प्रयोग करें। –

1

के बाद से JDBC इस विकल्प को इस सवाल को हल करने के लिए सबसे अच्छा तरीका आदेश को क्रियान्वित करने का समर्थन नहीं करता जावा प्रोग्राम के माध्यम से लाइनें। Bellow PostgreSQL के लिए एक उदाहरण है:

private void executeSqlFile() { 
    try { 
     Runtime rt = Runtime.getRuntime(); 
     String executeSqlCommand = "psql -U (user) -h (domain) -f (script_name) (dbName)"; 
     Process pr = rt.exec(); 
     int exitVal = pr.waitFor(); 
     System.out.println("Exited with error code " + exitVal); 
     } catch (Exception e) { 
     System.out.println(e.toString()); 
     } 
} 
2

Flyway पुस्तकालय इस के लिए वास्तव में अच्छा है:

Flyway flyway = new Flyway(); 
    flyway.setDataSource(dbConfig.getUrl(), dbConfig.getUsername(), dbConfig.getPassword()); 
    flyway.setLocations("classpath:db/scripts"); 
    flyway.clean(); 
    flyway.migrate(); 

इस स्क्रिप्ट के लिए स्थानों को स्कैन करता है और उन्हें क्रम में चलाता है। स्क्रिप्ट को V01__name.sql के साथ संस्करणित किया जा सकता है, इसलिए यदि केवल माइग्रेट कहा जाता है तो केवल वे पहले से ही नहीं चलेंगे। चीजों का ट्रैक रखने के लिए 'schema_version' नामक एक टेबल का उपयोग करता है। लेकिन अन्य चीजें भी कर सकते हैं, दस्तावेज़ देखें: flyway

स्वच्छ कॉल की आवश्यकता नहीं है, लेकिन एक स्वच्छ डीबी से शुरू करने के लिए उपयोगी है। इसके अलावा, स्थान से अवगत रहें (डिफ़ॉल्ट "क्लासपाथ: डीबी/माइग्रेशन" है), ':' के बाद कोई जगह नहीं है, जिसने मुझे पकड़ा।

1

सबसे सरल बाहरी उपकरण जो मैंने पाया वह पोर्टेबल भी है jisql - https://www.xigole.com/software/jisql/jisql.jsp। आप इसे इस प्रकार चलाएंगे:

java -classpath lib/jisql.jar:\ 
      lib/jopt-simple-3.2.jar:\ 
      lib/javacsv.jar:\ 
      /home/scott/postgresql/postgresql-8.4-701.jdbc4.jar 
    com.xigole.util.sql.Jisql -user scott -password blah  \ 
    -driver postgresql          \ 
    -cstring jdbc:postgresql://localhost:5432/scott -c \; \ 
    -query "select * from test;" 
+0

मैंने 'जावा-क्लास्पाथ lib/jisql-2.0.11.jar का उपयोग किया: lib/jopt-simple-3.2.jar: lib/javacsv.jar: ../ ojdbc7.jar com.xigole.util.sql.Jisql -user ecm -password TODO -Driver oracle.jdbc.OracleDriver -cstring jdbc: oracle: पतला: @localhost: 1521: XE -c \; -इनपुट myoracle.sql' और यह बेकार ढंग से काम किया। –

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