2017-02-19 6 views
1

次のコードをOracle Databaseで実行しましたが、ビュー名のエラーが発生しました。誰もそれを見ることができますか?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文が自動コミットしていることを知っているが、この場合には、私は問題を解決するための即時の文を実行した後にコミット文を追加する必要があります。

答えて

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

ところで、DDLsCOMMITは必要ありません。

+0

私は良いです。しかし、それがうまくいかない理由として何らかの説明をしてください。前の行で作成したビューの値を取得しようとしています。 – Satyaki

+0

@Satyakiあなたが選択したテーブルが存在しない場合でも、PL/SQLは 'compile 'しません。文字列としての' EXECUTE immediate'内のSQLはコンパイル時に無視されます。コンパイルが成功した場合にのみ、即時実行のSQLが実際に実行されます。 –

+0

ありがとう。では、実行直後にコードにコミットを追加すると、なぜそれは機能しますか? – Satyaki

関連する問題