2010-12-09 45 views
1

Je suis complètement nouveau à Oracle (je viens de MySQL et MSSQL) et je suis novice à JDBC. L'une de mes tables requêtes de création ressemble à ceci:Comment inclure plusieurs commandes dans une requête SQL JDBC à Oracle 10g?

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 
/

Lorsque je tente de connection.createStatement().execute() cette requête, je reçois java.sql.SQLSyntaxErrorException: ORA-00922: missing or invalid option. Si je supprime les barres obliques, je reçois la même chose. Si j'essaie de les remplacer par des points-virgules, j'obtiens java.sql.SQLSyntaxErrorException: ORA-00911: invalid character.

Est-il impossible d'inclure plusieurs commandes dans une requête dans JDBC et/ou Oracle? Ou est-ce que je manque juste une sorte de syntaxe pour les séparer?

Répondre

2

Chacun de ces énoncés est distinct. Émettez un à la fois via des objets Statement séparés via Connection#createStatement() ou via plusieurs appels SQL à Statement#execute(String). Inversement, quelle est votre raison de les vouloir dans une déclaration délimitée?

+0

Ce n'est pas si important qu'ils sont une déclaration (je les avais séparés en trois chaînes comme une solution de contournement avant de poster), je voulais juste voir si je manque quelque chose et/ou le fait mal. Merci! – kobachi

+0

Vous pouvez tromper JDBC avec une syntaxe spécifique à Oracles, mais le modèle objet de JDBC est vraiment conçu pour transmettre des commandes au niveau de l'instruction à la base de données, car chacune aurait potentiellement des réponses/exceptions. – Xailor

+0

Makes sense =) La plupart du temps j'étais confus que le fichier sql qu'Oracle/Apex lui-même crachait était une syntaxe invalide lorsque j'ai essayé de le réexécuter via Apex ou via JDBC. – kobachi

3

Pour oracle si vous incluez votre SQL entre BEGIN et END; ça devrait marcher.

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

Je pense que ce n'est applicable UPDATE/INSERT/DELETE statements- Je ne pouvais pas le faire fonctionner quand mon SQL avait CREER/DROP –

+0

Ce qui suit a fonctionné pour moi: \t \t 'cordes wa = « »" DECLARE \t \t \t \t v_command VARCHAR2 (32767); \t \t \t \t BEGIN \t \t \t \t v_command: = 'CREATE OR REPLACE ET JAVA SOURCE COMPILE $ NOMMÉ clsName AS clsDef $'; \t \t \t \t EXECUTE IMMEDIATE v_command; \t \t \t \t FIN; « » » \t \t jdbcTemplate.execute (wa)' – Dave

+0

Notez également créer des déclarations sont alors mises à jour (LDD, etc.) sont des déclarations DML Je ne recommande pas l'agrégation DML à PLSQL, mais faire plutôt l'exécution par lots. . – Dave