Oracle ORA-00922: Fehlende oder ungültige Option

dior

Bekanntes Mitglied
Hi,

ich versuche ein paar DB Einträge zu löschen, bekomme aber immer eine Fehlermeldung...

Java:
try{
String plsql =  
"set pagesize 1024 \n"
+ "set linesize 1024 \n"
+ "set echo on \n"
+ "spool C:\\TEMP\\LOGFILE.log \n"
+ "-- \n"
+ "execute LTT_USER.SETCONFIGURATION ('PROD'); \n"
+ " \n"
+ "grant shorttermtransactions to PROD; \n"
+ "delete from DIS where fid = " + txtFID.getText() + "; \n"
+ "delete from DIN where fid = " + txtFID.getText() + "; \n"
+ "delete from ON where fid = " + txtFID.getText() + "; \n"
+ "delete from ADN where fid = " + txtFID.getText() + "; \n"
+ "delete from SAN where fid = " + txtFID.getText() + "; \n"
+ "delete from SUN where fid = " + txtFID.getText() + "; \n"
+ "-- commit; \n"
+ " \n"
+ "-- \n"
+ "revoke shorttermtransactions from PROD;  \n"
+ " \n"
+ "spool off                                               \n"                                        
+ "set echo off ; \n";
                       System.out.println(plsql);
                       CallableStatement cs = conn.prepareCall(plsql); 
                      
                       cs.executeQuery(plsql);
                       System.out.println("erfolgreich gelöscht");
        } catch (SQLException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }


java.sql.SQLSyntaxErrorException: ORA-00922: Fehlende oder ungültige Option

:rtfm:
 

Michael...

Top Contributor
Ich kenne CallableStatements nur um in der Datenbank gespeicherte Prozeduren aufzurufen. Was ist das was in dem String plsql steckt? Das ist doch kein PL/SQL - schaut eher nach Batch aus?
 

dior

Bekanntes Mitglied
Ja stimmt, das ist eigentlich kein plsql aber ich brauche eine Möglichkeit das nach der reihe abzuarbeiten... wenn ich einen normalen sql aufruf mache, dann funktioniert das nicht das es ja mehrere sql Befehle hintereinander sind.

Hat jemand eine Idee wie ich das umsetzen kann?
 

dior

Bekanntes Mitglied
Danke für den Tipp.... hätte mir auch einfallen können!

Es funktioniert auch das Grant, aber ein Teil nicht:

Java:
st.execute("execute LTT_USER.SETCONFIGURATION ('KPROD')");

wie kann ich das machen?
 

Michael...

Top Contributor
Verwendest Du normalerweise SQLPlus bzw. dessen Kommandozeile? execute, pool usw. sind Applikationsspezifische Befehle von SQLPlus, das ist ja kein SQL.
 

dior

Bekanntes Mitglied
ja, der ursprüngliche Befehl war eine Batch Datei über sqlplus.

Aber ich suche jetzt nach einer Möglichkeit das komplett in java abzuhandel.....

irgend eine idee?
 
T

togal

Gast
Hi,

ich bin grad zufällig hierauf gestoßen, auf der Suche nach einem Javaforum. Bin selbst höchstens Java-Anfänger, aber zu Deinem Oracle-Problem:

entweder Du lässt im letzten Fall das "Execute" weg, oder Du machst in deinem code Block oben ein klammerndes Begin end drumrum. Damit hast Du einen anonymen Block, der am Stück in einer TR, ganz oder gar nicht, ausgeführt wird.
 

dior

Bekanntes Mitglied
hmm danke für den Tipp, aber ich bekomme es nicht hin.....

könntest du mir kurz ein Codebeispiel geben?
danke!
 

togal

Mitglied
Du benutzt jetzt die Step by Step Variante?

Falls ja:
Es Könnte problematisch werden, wenn es zwischendurch hakt. Unvollständige deletes, ..?
Versuch lieber den 1.Ansatz als kopletten anonymen block. Die ganzen sqlplus anweisungen raus, ebenso das auskommentierte commit, dann sollte es auch gehen.
Für grant/revoke vlt. noch ein execute immediate spendieren, da bin ich nicht sicher.
 

dior

Bekanntes Mitglied
Ja, die Step by Step Variante funktioniert.... aber dein Hinweis ist gut! Ich werde das mit dem anonymen Block auch noch versuche :)
 

Michael...

Top Contributor
Oder gleich das ganze als Prozedur mit der ID als IN-Parameter in der Datenbank anlegen und von Java per CallableStatement einfach nur die Prozedur mit der ID aus dem Textfeld aufrufen.
 

Ähnliche Java Themen


Oben