script - jdbc java ejemplo
Cómo ejecutar el archivo de secuencia de comandos SQL en Java? (9)
Quiero ejecutar un archivo de script SQL en Java sin leer todo el contenido del archivo en una gran consulta y ejecutarlo.
¿Hay alguna otra forma estándar?
Como JDBC no es compatible con esta opción, la mejor forma de resolver esta cuestión es ejecutar líneas de comando a través del Programa Java. Bellow es un ejemplo para 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());
}
}
Existe una gran manera de ejecutar scripts SQL desde Java sin leerlos usted mismo, siempre y cuando no le importe tener una dependencia en Ant. En mi opinión, esa dependencia está muy bien justificada en tu caso. Aquí hay un código de ejemplo, donde la clase SQLExec vive en 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();
}
JDBC no admite esta opción (aunque un controlador de base de datos específico puede ofrecer esto). De todos modos, no debería haber un problema al cargar todo el contenido del archivo en la memoria.
La biblioteca de Flyway es realmente buena para esto:
Flyway flyway = new Flyway();
flyway.setDataSource(dbConfig.getUrl(), dbConfig.getUsername(), dbConfig.getPassword());
flyway.setLocations("classpath:db/scripts");
flyway.clean();
flyway.migrate();
Esto escanea las ubicaciones de las secuencias de comandos y las ejecuta en orden. Los scripts se pueden versionar con V01__name.sql, de modo que si solo se llama a migrate, solo se ejecutarán los que no se hayan ejecutado. Utiliza una tabla llamada ''schema_version'' para realizar un seguimiento de las cosas. Pero también puede hacer otras cosas, vea los documentos: flyway .
La llamada limpia no es necesaria, pero es útil comenzar desde una base de datos limpia. Además, tenga en cuenta la ubicación (el valor predeterminado es "classpath: db / migration"), no hay espacio después de '':'', ese me llamó la atención.
La herramienta externa más simple que encontré que también es portátil es jisql - https://www.xigole.com/software/jisql/jisql.jsp . Lo ejecutarías como:
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;"
No hay una forma portátil de hacer eso. Sin embargo, puede ejecutar un cliente nativo como un programa externo para hacer eso:
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();
}
}
}
- El ejemplo de código se extrajo de here y se modificó para responder la pregunta suponiendo que el usuario desea ejecutar un archivo de script PostgreSQL.
No puede hacer uso de JDBC porque no es compatible. El trabajo sería incluir iBatis iBATIS es un marco de persistencia y llamar al constructor Scriptrunner
como se muestra en la documentación de iBatis .
No es bueno incluir un marco de persistencia de gran peso como ibatis para ejecutar scripts sql simples en cualquier forma que se pueda hacer usando la línea de comando
$ mysql -u root -p db_name < test.sql
No, debe leer el archivo, dividirlo en consultas separadas y luego ejecutarlas individualmente (o utilizando la API por lotes de JDBC).
Una de las razones es que cada base de datos define su propia forma de separar las sentencias SQL (algunas usan ;
otras /
, otras permiten ambas o incluso definen su propio separador).
Prueba este código:
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());
}