Я хочу выполнить файл SQL script на Java без чтения всего содержимого файла в большой запрос и его выполнения. Есть ли стандартный способ?
Как выполнить sql- script файл в java?
Ответ 1
Нет такого портативного способа сделать это. Вы можете выполнить собственный клиент как внешнюю программу, чтобы сделать это:
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();
}
}
}
- Пример кода был извлечен из здесь и изменен, чтобы ответить на вопрос, предполагая, что пользователь хочет выполнить файл PostgreSQL script.
Ответ 2
Существует отличный способ выполнения SQL-скриптов из Java, не читая их самостоятельно, если вы не против зависимости от Ant. На мой взгляд, такая зависимость очень хорошо оправдана в вашем случае. Вот пример кода, где класс SQLExec живет в Ant.jar:
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();
}
Ответ 3
Нет, вы должны прочитать файл, разделить его на отдельные запросы и затем выполнить их индивидуально (или используя пакетный API JDBC).
Одна из причин заключается в том, что каждая база данных определяет свой собственный способ разделения операторов SQL (некоторые используют ;
, другие /
, некоторые позволяют либо или даже определять собственный разделитель).
Ответ 4
В приведенном ниже учебном пособии можно выполнить sql
.
http://www.mkyong.com/jdbc/how-to-run-a-mysql-script-using-java/
Ответ 5
Вы не можете использовать JDBC, поскольку он не поддерживает. Работа вокруг будет включать в себя iBatis iBATIS - это структура персистентности и вызов конструктора Scriptrunner
, как показано в iBatis.
Нехорошо включать инфраструктуру жесткого веса, такую как ibatis, чтобы запускать простые sql-скрипты любыми способами, которые вы можете использовать с помощью командной строки
$ mysql -u root -p db_name < test.sql
Ответ 6
Библиотека 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.
Чистый вызов не требуется, но полезно начать с чистой БД. Кроме того, знайте о местоположении (по умолчанию это "classpath: db/migration" ), после ":" нет пробела, который меня поймал.
Ответ 7
Поскольку JDBC не поддерживает эту опцию, лучшим способом решить этот вопрос является выполнение командных строк через Java-программу. 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());
}
}
Ответ 8
Самый простой внешний инструмент, который я нашел, который также переносится, - 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;"
Ответ 9
JDBC не поддерживает эту опцию (хотя конкретный драйвер DB может предложить это). Во всяком случае, не должно быть проблем с загрузкой содержимого всех файлов в память.
Ответ 10
Попробуйте этот код:
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());
}