Взаимодействие с командной строкой Хранимых процедур Oracle Java
-
18-09-2019 - |
Вопрос
У меня есть забавное требование.
Нам нужно иметь взаимодействие с командной строкой в хранимой процедуре Java.Несмотря на предоставление соответствующих разрешений с использованием dbms_java.grant_permission
команды, с которыми я сталкиваюсь java.io.IOException
, откуда я читал System.in
используя java.io.InputStreamReader
.
В чем же проблема?
Исходный код Java находится здесь:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.SQLException;
import oracle.jdbc.driver.OracleDriver;
public class ExecuteInteractiveBatch {
public static void aFunction() {
Connection connection = null;
try {
int rowFetched = 0;
connection = new OracleDriver().defaultConnection();
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT count(1) cnt from sometable where c = 2");
int count = 0;
if (rs.next()) {
count = rs.getInt(1);
}
rs.close();
stmt.close();
rs = null;
stmt = null;
if (count == 1) {
System.out.println("Do you want to continue?");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String response = reader.readLine();
if ("Y".equalsIgnoreCase(response)) {
stmt = connection.createStatement();
int rowsAffected = stmt.executeUpdate("DELETE from sometable where c=2");
System.out.println("" + rowsAffected + " row(s) deleted");
stmt.close();
}
}
} catch (IOException ex) {
ex.printStackTrace();
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
try {
if (connection != null || !connection.isClosed()) {
connection.close();
}
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
}
Решение
Вы не можете выполнять ввод-вывод на консоль из Oracle...ни в java, ни в PL / SQL, нигде.Oracle работает в отдельном от пользователя процессе, вполне вероятно, даже на другом компьютере, и в этом процессе выполняются хранимые процедуры java.Вам понадобится некоторый java-код, запущенный в клиентской системе, для выполнения консольного ввода-вывода.