Wo ist mein ungültiger Charakter (ORA-00911)
Ich versuche zu legen CLOB
s in eine Datenbank (siehe stellt sich die Frage,). Ich kann nicht ganz herausfinden, was falsch ist. Ich habe eine Liste mit etwa 85 clobs ich möchte in eine Tabelle einfügen. Auch beim einfügen nur die erste clob bekomme ich ORA-00911: invalid character
. Ich kann nicht herausfinden, wie man die Behauptung aus der PreparedStatement
bevor es ausgeführt wird, so kann ich nicht 100% sicher, dass es richtig ist, aber wenn ich es hinbekommen, dann sollte es genau so Aussehen:
insert all
into domo_queries values ('select
substr(to_char(max_data),1,4) as year,
substr(to_char(max_data),5,6) as month,
max_data
from dss_fin_user.acq_dashboard_src_load_success
where source = ''CHQ PeopleSoft FS''')
select * from dual;
Letztlich einfügen, alle
Aussage hätte viel into
's, das ist der Grund, warum ich einfach nicht tun, eine regelmäßige insert
- Anweisung. Ich sehe nicht ein ungültiges Zeichen in es, tun Sie? (Ach ja, der code oben läuft gut, wenn ich es in meiner sql developer tool.) Und ich, wenn ich entfernen Sie das Semikolon in der PreparedStatement
es wirft ein ORA-00933: SQL command not properly ended
Fehler.
In jedem Fall, hier ist mein code für die Abfrage ausführt (und die Werte der Variablen für das Beispiel oben).
public ResultSet executeQuery(String connection, String query, QueryParameter... params) throws DataException, SQLException {
//query at this point = "insert all
//into domo_queries values (?)
//select * from dual;"
Connection conn = ConnectionPool.getInstance().get(connection);
PreparedStatement pstmt = conn.prepareStatement(query);
for (int i = 1; i <= params.length; i++) {
QueryParameter param = params[i - 1];
switch (param.getType()) { //The type in the example is QueryParameter.CLOB
case QueryParameter.CLOB:
Clob clob = CLOB.createTemporary(conn, false, oracle.sql.CLOB.DURATION_SESSION);
clob.setString(i, "'" + param.getValue() + "'");
//the value of param.getValue() at this point is:
/*
* select
* substr(to_char(max_data),1,4) as year,
* substr(to_char(max_data),5,6) as month,
* max_data
* from dss_fin_user.acq_dashboard_src_load_success
* where source = ''CHQ PeopleSoft FS''
*/
pstmt.setClob(i, clob);
break;
case QueryParameter.STRING:
pstmt.setString(i, "'" + param.getValue() + "'");
break;
}
}
ResultSet rs = pstmt.executeQuery(); //Obviously, this is where the error is thrown
conn.commit();
ConnectionPool.getInstance().release(conn);
return rs;
}
Ist es etwas, was ich bin fehlt nur noch big time?
InformationsquelleAutor der Frage kentcdodds | 2012-05-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie das string-literal genau so, wie Sie uns gezeigt haben, das problem ist das
;
- Zeichen am Ende. Sie können nicht, dass in der Abfrage-string im JDBC-Aufrufe.Als Sie einfügen, wird nur eine einzelne Zeile, eine regelmäßige
INSERT
sollte in Ordnung sein, auch beim einfügen von mehreren Zeilen an. Mit einer Batch-Anweisung ist wahrscheinlich effizienter anywy. Keine Notwendigkeit fürINSERT ALL
. Außerdem brauchen Sie nicht die temporäre clob und all das. Vereinfachen Sie Ihre Methode, um so etwas (vorausgesetzt, ich habe die Parameter von rechts):InformationsquelleAutor der Antwort a_horse_with_no_name
Der Spitze von meinem Kopf, können Sie versuchen, verwenden Sie die 'q' - operator für die string-literal
etwas wie
Beachten Sie, dass die Anführungszeichen von Ihr Prädikat nicht entgangen, und der string sitzt zwischen q'[...]'.
InformationsquelleAutor der Antwort