![](/img/trans.png)
[英]How to execute sqlplus commands on ssh enabled unix machine from java code
[英]Create sequence of sqlplus commands in Java
如何創建Java代碼以連接到SQLPlus並執行一系列命令? 我需要執行以下命令來生成Oracle AWR。
//Connect to DB thru SQLPlus
sqlplus username/password@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host_name)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=service_name)))
//After connected
//Execute SQL Query to capture SID1 and SID2 vards
set heading off feedback off lines 800 pages 5000 trimspool on trimout on
set termout off
spool C:\\Temp\\AWR_TEST.html
select output from table(dbms_workload_repository.awr_global_report_html(4194236182,'',SID1,SID2,0))
spool off
set termout on
set heading on feedback 6 lines 100 pages 45
我有以下代碼,但是在這里我不知道如何適應完整的SQL命令。
processBuilder = new ProcessBuilder(
"sqlplus",
"username/password@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host_name)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=service_name)))"); //ORACLE
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((currentLine = in.readLine()) != null) {
appendLineToStringBuilder(responseBuilder,String.format("Result Each Line: %s", currentLine));
}
這比進行processbuilder / fork / capture stdout可能更容易。
SQLcl基於Java,可以在Java應用程序中利用
github示例/細節的倉庫在這里: https : //github.com/oracle/oracle-db-tools/tree/master/sqlcl/java
示例Java:
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import oracle.dbtools.raptor.newscriptrunner.ISQLCommand;
import oracle.dbtools.raptor.newscriptrunner.ScriptParser;
import oracle.dbtools.raptor.newscriptrunner.ScriptRunner;
import oracle.dbtools.raptor.newscriptrunner.ScriptRunnerContext;
public class ParseScriptRunOneAtATime {
public static void main(String[] args) throws SQLException, IOException {
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/XE", "klrice", "klrice");
conn.setAutoCommit(false);
InputStream stream = new ByteArrayInputStream("your sql here".getBytes(StandardCharsets.UTF_8));
ScriptParser parser = new ScriptParser(stream);
ISQLCommand cmd;
// #setup the context
ScriptRunnerContext ctx = new ScriptRunnerContext();
ctx.setBaseConnection(conn);
// Capture the results without this it goes to STDOUT
ByteArrayOutputStream bout = new ByteArrayOutputStream();
BufferedOutputStream buf = new BufferedOutputStream(bout);
ScriptRunner sr = new ScriptRunner(conn, buf, ctx);
while ( ( cmd = parser.next() ) != null ) {
// do something fancy based on a cmd
sr.run(cmd);
// check success/failure of the command
String errMsg = (String) ctx.getProperty(ctx.ERR_MESSAGE);
if ( errMsg != null ){
// react to a failure
System.out.println("**FAILURE**" + errMsg);
}
}
String results = bout.toString("UTF8");
results = results.replaceAll(" force_print\n", "");
System.out.println(results);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.