2010-12-09 5 views
1

Ich bin komplett neu bei Oracle (ich komme aus MySQL und MSSQL) und bin Neuling bei JDBC. Einer meiner Tabellenerstellung Abfragen sieht wie folgt aus:Wie können mehrere Befehle in einer JDBC-SQL-Abfrage in Oracle 10g eingefügt werden?

CREATE TABLE "LISTS" 
    ("ID" NUMBER NOT NULL ENABLE, 
    "NAME" VARCHAR2(1000) NOT NULL ENABLE, 
    "DOMAIN_ID" NUMBER NOT NULL ENABLE, 
    CONSTRAINT "LISTS_PK" PRIMARY KEY ("ID") ENABLE 
    ) 
/

CREATE OR REPLACE TRIGGER "BI_LISTS" 
    before insert on "LISTS"    
    for each row 
begin 
    select "LISTS_SEQ".nextval into :NEW.ID from dual; 
end; 

/
ALTER TRIGGER "BI_LISTS" ENABLE 
/

Als ich connection.createStatement().execute() diese Abfrage versuchen, ich java.sql.SQLSyntaxErrorException: ORA-00922: missing or invalid option bekommen. Wenn ich die Schrägstriche entferne, bekomme ich das gleiche. Wenn ich versuche, sie durch Semikola zu ersetzen, bekomme ich java.sql.SQLSyntaxErrorException: ORA-00911: invalid character.

Ist es nicht möglich, mehrere Befehle in einer Abfrage in JDBC und/oder Oracle aufzunehmen? Oder fehlt mir einfach eine Art von Syntax, um sie zu trennen?

Antwort

2

Jeder dieser separaten Anweisungen. Geben Sie einzeln über separate Statement-Objekte über Connection#createStatement() oder über mehrere SQL-Aufrufe an Statement#execute(String) aus.

Umgekehrt, was ist der Grund dafür, sie in einer abgegrenzten Aussage zu haben?

+0

Es ist nicht so wichtig, dass sie eine Aussage sind (ich sie in drei Saiten aus als Behelfslösung vor der Veröffentlichung getrennt hatte), ich wollte nur sehen, ob ich etwas fehlte und/oder es falsch machen. Vielen Dank! – kobachi

+0

Sie können JDBC mit einer bestimmten Oracles-spezifischen Syntax triggern, aber das JDBC-Objektmodell ist wirklich so konzipiert, dass Befehle auf Anweisungsebene an die Datenbank übergeben werden, da jeder möglicherweise Antworten/Ausnahmen haben könnte. – Xailor

+0

macht Sinn =) Meistens war ich verwirrt, dass die SQL-Datei, die Oracle/Apex selbst ausspuckte, als ungültige Syntax zurückkam, als ich versuchte, es durch Apex oder durch JDBC auszuführen. – kobachi

3

Für Oracle, wenn Sie Ihre SQL zwischen BEGIN und END enthalten; es sollte funktionieren.

Ex:

BEGIN 
    CREATE TABLE "LISTS" 
     ("ID" NUMBER NOT NULL ENABLE, 
     "NAME" VARCHAR2(1000) NOT NULL ENABLE, 
     "DOMAIN_ID" NUMBER NOT NULL ENABLE, 
     CONSTRAINT "LISTS_PK" PRIMARY KEY ("ID") ENABLE 
     ) 
    ; 

    CREATE OR REPLACE TRIGGER "BI_LISTS" 
     before insert on "LISTS"    
     for each row 
    begin 
     select "LISTS_SEQ".nextval into :NEW.ID from dual; 
    end; 
    ; 

    ALTER TRIGGER "BI_LISTS" ENABLE; 
END; 
+0

Ich denke, das für UPDATE/INSERT nur anwendbar/DELETE statements- ich es nicht zur Arbeit kommen konnte, wenn meine SQL CREATE hatte/DROP-Anweisungen –

+0

Die für mich gearbeitet folgende: \t \t 'String wa =„“" ERKLÄREN \t \t \t \t v_command VARCHAR2 (32767); \t \t \t \t BEGIN \t \t \t \t v_command: = 'CREATE OR REPLACE und zu kompilieren Java-Quellcode namens $ clsName AS $ clsDef'; \t \t \t \t EXECUTE IMMEDIATE v_command; \t \t \t \t END; ""“ \t \t jdbcTemplate.execute (wa)' – Dave

+0

Beachten Sie auch Anweisungen erstellen sind DDL während Update (usw.) Aussagen DML sind würde ich DML nicht empfehlen, in PLSQL aggregieren, sondern Batch-Ausführung zu tun. . – Dave