2009-08-06 10 views
5

Ich versuche, mehrere ddl-Anweisungen innerhalb einer Execute Immediate-Anweisung auszuführen. Ich dachte, das wäre ziemlich einfach, aber es scheint, dass ich mich irre.ORACLE Batching DDL-Anweisungen innerhalb eines Execute Immediate

Die Idee ist folgende:

declare v_cnt number; 

begin 

select count(*) into v_cnt from all_tables where table_name='TABLE1' and owner = 'AMS'; 

if v_cnt = 0 then 

execute immediate 'CREATE TABLE TABLE1(VALUE VARCHAR2(50) NOT NULL) ALTER TABLE TABLE1 ADD (MYVAL2 NVARCHAR2(10))'; 

end if; 

end; 

jedoch führt dies zu einem Fehler

ORA-00911: ungültiges Zeichen ORA-06512: in Zeile 10

Jede Die Anweisungen innerhalb des Stapels laufen gut, wenn ich sie selbst ausführe. und wenn ich diese Aussage nehme und sie ausführe, läuft sie gut (mit den; zwischen den 2 Aussagen). Wenn ich das entferne; zwischen den Anweisungen bekomme ich einen anderen Fehler über ungültige Option

der Plan ist, dass ich in der Lage sein werde, eine Tabelle zu erstellen, exportieren Sie das Tabellenschema für diese Tabelle einschließlich aller Änderungen Anweisungen, und führen Sie dann den Stapel gegen ein anderes System als Teil eines Installations-/Aktualisierungsprozesses.

Also, wie Batch ich diese DDL-Anweisungen innerhalb einer einzigen Ausführung sofort? Oder gibt es einen besseren Weg, um das zu tun, was ich brauche?

Ich bin ein bisschen ein Oracle newb, ich muss zugeben. Vielen Dank für Ihre Geduld.

Antwort

2

Warum benötigen Sie einen einzelnen Aufruf EXECUTE IMMEDIATE? Sicher tun Sie es nur als 2 Anrufe?

Bedenken Sie, dass jede DDL-Anweisung eine implizite COMMIT-Anweisung enthält, so dass es keinen Vorteil bietet, sie als einzelnen Aufruf auszuführen.

Warum auch nicht einfach die Tabelle beim ersten Anruf richtig einrichten? Sie tun können ...

CREATE TABLE TABLE1 (VALUE VARCHAR2 (50) NOT NULL, MYVAL2 NVARCHAR2 (10))

... statt 2 Anrufe von zu benötigen.

Haben Sie auch DBMS_METADATA betrachtet ... es kann DDL für Objekte wie Tabellen für Sie generieren.

+0

Die Tabellenerstellung und Änderungen werden als eine einzelne Datei exportiert und im Moment gibt es genug davon, dass es sich lohnt, es in 1 EXECUTE IMMEDIATE vs vielen pro db-Objekt zu versuchen. – Beta033

+0

In diesem Fall würde ich vorschlagen, nur die richtige DDL in erster Linie zu erzeugen. Schau dir DBMS_METADATA an. :-) – cagcowboy

+0

sieht aus wie das ist mein Problem beheben kann. Leider lag die offensichtliche Antwort direkt vor meiner Nase. Lektion gelernt: Verwenden Sie nicht TOAD, um die Struktur auszugeben, obwohl es ein schickes GUI-Menü dafür gibt. – Beta033

4

Das Semikolon ist nicht Teil der SQL-Syntax von Oracle. SQL * Plus und andere clientseitige Tools verwenden ein Semikolon, um das Ende einer SQL-Anweisung zu signalisieren, der Server sieht sie jedoch nicht.

Wir SQL * zwingen kann, plus das Semikolon an die DB zu übergeben:

SQL> set sqlterminator off 
SQL> select * from user_tables; 
    2/
select * from user_tables; 
         * 
ERROR at line 1: 
ORA-00911: invalid character 

Wenn ich diese Aussage nehmen und führen Sie es aus, es wird gut laufen (mit dem, zwischen den 2 Anweisungen) Die Client-Tool, das Sie verwenden, bricht es in zwei Aufrufe an die DB.

Also, ich glaube nicht, dass es möglich ist, mehrere Anweisungen in einem execute sofort zu übergeben.

Ich könnte man könnte sofort mit einem String mit einem anonymen PL/SQL-Block, mit einzelnen Aufrufen direkt ausführen ausführen aufrufen ... und ich weiß nicht, was der Punkt der das tun würde.;)

+0

Meine Erfahrung ist die gleiche: Wir können nicht mehrere Anweisungen innerhalb einer 'EXECUTE IMMEDIATE' übergeben. – Baodad