これは1つのアプローチです。これは、ディレクトリ内のファイルを読み込み、内容をselect count(*) from (....)
コンストラクタでラップし、結果の文を実行する関数です。ここで
1 create or replace function get_cnt
2 (p_file in varchar2)
3 return number
4 as
5 n pls_integer;
6 stmt varchar2(32767);
7 f_line varchar2(255);
8 fh utl_file.file_type;
9 begin
10 stmt := 'select count(*) from (';
11 fh := utl_file.fopen('SQL_SCRIPTS', p_file, 'R');
12 loop
13 utl_file.get_line(fh, f_line);
14 if f_line is null then exit;
15 elsif f_line = '/' then exit;
16 else stmt := stmt ||chr(10)||f_line;
17 end if;
18 end loop;
19 stmt := stmt || ')';
20 execute immediate stmt into n;
21 return n;
22* end get_cnt;
SQL>
は、SQLファイルの内容です:
SQL> select get_cnt ('q_emp.sql') from dual
2/
GET_CNT('Q_EMP.SQL')
--------------------
14
SQL>
だから、それは動作します:
select * from emp
/
~
~
~
"scripts/q_emp.sql" 3L, 21C
そして、ここでは、スクリプトの実行方法です。私が投稿したことは明らかに概念の証明に過ぎません。あなたはUTL_FILEアスペクトのために多くのエラー処理(it's a package which can throw lots of exceptions)を含める必要があります。そしておそらく、渡されるスクリプトの安全性のチェックでしょう。
出典
2012-03-17 19:08:06
APC
ファイル名を使用して選択することはできません。あなたはテーブルのような構造(テーブル、ビュー、定数...)が必要 – Konerak
+1。私はなぜ誰かがこのことを理解していない。私は答えが「方法はありません」と思うが、もし*ある方法があれば、それは非常に便利だと思うだろう! – ruakh
(ただし、「q65bはクエリが保存されたファイルです」という注釈は真実ではありません.SQL * Plusスクリプトを含むファイルであり、SQL * Plusスクリプトは単一のクエリで構成されています) – ruakh