Java JDBC:调用外部SQL脚本,这些脚本声明PL/SQL包
我有一个名为setup的SQL脚本,它建立了一些设置,然后声明了一个名为salespack的PL/SQL包 setup.sql:Java JDBC:调用外部SQL脚本,这些脚本声明PL/SQL包,java,sql,oracle,jdbc,plsql,Java,Sql,Oracle,Jdbc,Plsql,我有一个名为setup的SQL脚本,它建立了一些设置,然后声明了一个名为salespack的PL/SQL包 setup.sql: set verify off set feedback off set serveroutput on; set linesize 200; @Package/pack.sql @Package/packbody.sql 我有一个名为main.java的文件,它尝试运行上面的SQL脚本,然后调用包,但这似乎不起作用。如何使用jdbc调用SQL脚本、声明PL/SQL包
set verify off
set feedback off
set serveroutput on;
set linesize 200;
@Package/pack.sql
@Package/packbody.sql
我有一个名为main.java的文件,它尝试运行上面的SQL脚本,然后调用包,但这似乎不起作用。如何使用jdbc调用SQL脚本、声明PL/SQL包,然后使用包中的函数。我得到的错误是callstmt.execute();是无效的SQL语句
main.java:
import java.sql.*;
import java.io.*;
class main
{
public static void main (String args [])
throws SQLException, IOException
{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
String connect = "jdbc:oracle:thin:@vmaddress:1521:xe";
Connection conn = DriverManager.getConnection (connect, "user", "pass");
//Perform setup
//Load packages, allow output, establish sale database
//Make sure to run the main script from dbSetup to have fresh data
CallableStatement callstmt = conn.prepareCall ("@setup.sql");
callstmt.execute();
callstmt.close();
CallableStatement callstmt2 = conn.prepareCall ("{ ? = call salepack.getspname(?) }");
callstmt2.registerOutParameter (1, Types.VARCHAR);
int id = 23; // the id is hard-coded here for simplicity
callstmt2.setInt(2, id);
callstmt2.execute();
String name = callstmt2.getString(1);
System.out.println ("The salesperson with id of " + id + " is " + name);
callstmt2.close();
conn.close();
}
}
我想您可以用下面的代码运行setup.sql
private static String script_location = "";
private static String file_extension = ".sql";
private static ProcessBuilder processBuilder =null;
public static void main(String[] args) {
try {
File file = new File("C:/sql_folder");
File [] list_files= file.listFiles(new FileFilter() {
public boolean accept(File f) {
if (f.getName().toLowerCase().endsWith(file_extension))
return true;
return false;
}
});
for (int i = 0; i<list_files.length;i++){
script_location = "@" + list_files[i].getAbsolutePath();//ORACLE
processBuilder = new ProcessBuilder("sqlplus", "UserName/Password@database_name", script_location); //ORACLE
//script_location = "-i" + list_files[i].getAbsolutePath();
// processBuilder = new ProcessBuilder("sqlplus", "-Udeep-Pdumbhead-Spc-de-deep\\sqlexpress-de_com",script_location);
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String currentLine = null;
while ((currentLine = in.readLine()) != null) {
System.out.println(" " + currentLine);
}
}
} catch (IOException e) {
e.printStackTrace();
}catch(Exception ex){
ex.printStackTrace();
}
}
私有静态字符串脚本_location=”“;
私有静态字符串文件_扩展名=“.sql”;
私有静态ProcessBuilder ProcessBuilder=null;
公共静态void main(字符串[]args){
试一试{
File File=新文件(“C:/sql_文件夹”);
File[]list_files=File.listFiles(新文件过滤器(){
公共布尔接受(文件f){
if(f.getName().toLowerCase().endsWith(文件扩展名))
返回true;
返回false;
}
});
对于(int i=0;iIt似乎您有一个SQLPlus脚本。如果您想使用它,您需要调用SQLPlus客户端。我想您可以从Java应用程序调用SQLPlus可执行文件,假设Java应用程序运行在一台安装了完整Oracle客户端的机器上。但这将是一个非常奇怪的体系结构。如果您作为应用程序外部安装过程的一部分,调用SQLPlus脚本更有意义。或者,将代码存储在Java应用程序一次可以读取一条语句的地方更有意义。您是否正在尝试运行自己的应用程序构建过程?Java可能是错误的语言尝试Groovy这样的脚本语言。或者,使用现有的一个包,比如(没有意图或暗示的支持)。