2017-02-19 4 views
1

Ich führte den folgenden Code in Oracle Database, aber mit einem Fehler der Ansicht Name ist nicht vorhanden. Kann jemand hinein schauen?Ausführen sofort auf DDL-Anweisungen

Declare 
Stmt varchar2(2000); 
Var number; 
Begin 
Stmt:='create or replace view emp_dept_v as select * from emp'; 
Execute immediate stmt; 
Select count(*) into var from emp_dept_v; 
Dbms_output. Put_line(var); 
End; 

Ich weiß, dass DDL-Anweisungen automatisch verpflichtet sind, aber in diesem Fall muss ich eine Erklärung verpflichten hinzufügen, nachdem die sofortige Anweisung ausführen, das Problem zu lösen.

Antwort

4

Was Sie bekommen, ist eine Kompilierung Fehler. Die PL/SQL wird vor der Ausführung kompiliert. Während der Kompilierung ist die Tabelle, die Sie versuchen, SELECT nicht verfügbar. Und daher der Fehler. Nur wenn der Ansichtsname bereits existiert, wird dies funktionieren. Versuchen Sie Ihre select auch als dynamisch.

Declare 
Stmt varchar2(2000); 
Var number; 
Begin 
Stmt:='create or replace view emp_dept_v as select * from emp'; 
Execute immediate stmt; 

Stmt:='Select count(*) from emp_dept_v'; 
Execute immediate stmt into var; 
Dbms_output. Put_line(var); 
End; 
/

Und übrigens, DDLs brauchen keine COMMIT;

+0

Ich bin gut zu gehen. Könnten Sie bitte einige Klarstellungen machen, warum es nicht funktioniert? Ich meine, wir versuchen, den Wert der Ansicht nach ihrer Erstellung in der vorherigen Zeile abzurufen. – Satyaki

+0

@Satyaki Wie ich erwähnt habe, kompiliert das PL/SQL nicht einmal, wenn die von Ihnen gewählte Tabelle nicht existiert. Jede SQL innerhalb der 'EXECUTE sofort' als Zeichenkette wird während der Kompilation ignoriert. Nur bei erfolgreicher Kompilierung wird das SQL in Ihrem execute direkt ausgeführt. –

+0

Danke dafür. Warum funktioniert es also, wenn ich nach dem execute execute einen Commit zum Code hinzufüge? – Satyaki

Verwandte Themen