2017-02-19 198 views
1

我在Oracle數據庫中執行了以下代碼,但遇到視圖名稱錯誤不存在。任何人都可以看看它嗎?立即執行DDL語句

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; 

我知道DDL語句是自動提交的,但在這種情況下,我必須在執行immediate語句後添加一個提交語句來解決問題。

回答

4

你得到的是一個彙編錯誤。 PL/SQL將在執行前被編譯。因此在編譯期間,您嘗試到SELECT的表將不可用。因此錯誤。只有在視圖名稱已經存在的情況下,這纔有效。試試你的select也是動態的。

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; 
/

順便說一下,DDLs不需要COMMIT;

+0

我很好走。但是,請您澄清一下爲什麼它不起作用。我的意思是我們嘗試在上一行創建後檢索視圖的值。 – Satyaki

+0

@Satyaki正如我所提到的,當你選擇的表不存在時,PL/SQL甚至不會「編譯」。在EXECUTE immediate字符串中的任何SQL在編譯期間都將被忽略。只有在編譯成功後,執行立即執行的SQL纔會真正執行。 –

+0

謝謝你。那麼爲什麼當我在execute immediate之後向代碼添加一個提交時它會工作? – Satyaki