JDBC: вызов внешних сценариев SQL, которые объявляют пакет PL / SQL

1

У меня есть сценарий SQL под названием setup, который устанавливает некоторые параметры, а затем объявляет пакет PL/SQL под названием salespack

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-пакет, а затем использовать функцию в пакете. Ошибка, которую я получаю, заключается в том, что 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();
  }
}
  • 3
    Похоже, у вас есть сценарий SQL Plus. Если вы хотите использовать это, вам нужно вызвать клиент SQL Plus. Я полагаю, вы могли бы вызвать исполняемый файл SQL Plus из вашего Java-приложения, предполагая, что Java-приложение работает на компьютере с полной установкой клиента Oracle. Но это была бы очень странная архитектура. Если вам нужно вызвать сценарий SQL Plus, это будет более целесообразно как часть процесса установки, внешнего по отношению к вашему приложению. С другой стороны, было бы более разумно хранить код где-нибудь, чтобы приложение Java могло читать по одному выражению за раз.
  • 0
    Вы пытаетесь накатить свой собственный процесс сборки приложения? Ява, вероятно, не тот язык для этой задачи. Попробуйте язык сценариев, такой как Groovy. В качестве альтернативы, используйте один из существующих пакетов, например FlyWay (одобрение не предполагается и не подразумевается).
Теги:
plsql
jdbc

1 ответ

0

Я думаю, вы можете запустить 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();
}
}

и, возможно, ниже ссылки дадут вам другую идею;

Как показать результат sqlplus в java?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню