PL/SQL-Aufruf von JDBC-was in "SQLSyntaxErrorException: ORA-00900"
Ich versuche, verwenden Sie den folgenden code zum ausführen eines PL/SQL-Anweisung auf meinen Datenbank-server.
public class Main {
public static void main(String[] args) {
String jdbcURL = "jdbc:oracle:thin:@172.22.88.9:1521/xavier.i.com";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String user = "bigdb";
String password = "fakepassword";
String result = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
conn = DriverManager.getConnection(jdbcURL, user, password);
result = runStatement(conn,
"{begin ANALYZE TABLE BIGDB.scr_fct_exact_access
ESTIMATE STATISTICS; end}");
} catch (Exception ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
}
}
private static String runStatement(Connection con, String statement)
throws Exception {
PreparedStatement cstmt = con.prepareStatement(statement);
cstmt.execute(); //this is line 58
cstmt.close();
return count;
}
}
Auf dem der code ausgeführt wird, erhalte ich folgende exception:
java.sql.SQLSyntaxErrorException: ORA-00900: ungültige SQL-Anweisung
oracle.jdbc.- Treiber.T4CTTIoer.processError(T4CTTIoer.java:440)
bei oracle.jdbc.- Treiber.T4CTTIoer.processError(T4CTTIoer.java:396)
bei oracle.jdbc.- Treiber.T4C8Oall.processError(T4C8Oall.java:837)
bei oracle.jdbc.- Treiber.T4CTTIfun.erhalten(T4CTTIfun.java:445)
bei oracle.jdbc.- Treiber.T4CTTIfun.doRPC(T4CTTIfun.java:191)
bei oracle.jdbc.- Treiber.T4C8Oall.doOALL(T4C8Oall.java:523)
bei oracle.jdbc.- Treiber.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
bei oracle.jdbc.- Treiber.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1010)Zeit : -1307015416548oracle.jdbc.- Treiber.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1315)
bei oracle.jdbc.- Treiber.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3576)
bei oracle.jdbc.- Treiber.OraclePreparedStatement.execute(OraclePreparedStatement.java:3677)
bei oracle.jdbc.- Treiber.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1374)
am Main.prepareStatement(Main).java:58)
am Main.main(Main.java:29)
Was falsch läuft, und wie ich es beheben kann?
Du musst angemeldet sein, um einen Kommentar abzugeben.
ANALYZE TABLE
ist eine DDL (data definition language) - Anweisung. Es ist nicht gültig innerhalb eines BEGIN/END-block mit PL/SQL. Wenn Sie wollten, um es auszuführen in PL/SQL, würden Sie brauchen, um verwenden Sie EXECUTE IMMEDIATE.Zur Ausführung der Anweisung von JDBC, erstellen Sie einfach ein
Statement
- Instanz und verwenden SieexecuteUpdate
:Aber eine noch bessere Idee ist es, den
DBMS_STATS
- Paket zur Auswertung Ihrer Tabellen. Dann können Sie Ihr Konzept mit BEGIN/END.Verwenden
CallableStatement
stattPreparedStatement
zu führen Sie die Anweisungen mit dem PL/SQL block syntax von JDBC.Jedoch, wie Codo hat erklärt, in der anderen Antwort, ANALYZE TABLE nicht genau callable von PL/SQL. Es ist ein SQL-Befehl, und können folglich nicht ausgeführt werden, die in einem PL/SQL block. Und wie zu Recht vorgeschlagen,
DBMS_STATS
verwendet werden sollte. Dies ist auch in der Dokumentation erwähnt von der ANALYZE-Befehl:Wenn Sie wirklich wollen, um zu vermeiden, mit
DBMS_STATS
(und ganz ehrlich, ich würde nicht sehen, ein guter Grund, es zu vermeiden), verwenden SieEXECUTE IMMEDIATE
oderDBMS_SQL
zur Ausführung derANALYZE TABLE
Befehl.