Вот один из подходов. Это функция, которая читает файл в каталоге, упаковывает содержимое в конструкцию 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:
select * from emp
/
~
~
~
"scripts/q_emp.sql" 3L, 21C
А вот как работает скрипт:
SQL> select get_cnt ('q_emp.sql') from dual
2 /
GET_CNT('Q_EMP.SQL')
--------------------
14
SQL>
Так что это работает. Очевидно, что я разместил это просто доказательство концепции. Вам нужно будет включить множество обработчиков ошибок для аспектов UTL_FILE - это пакет, который может выдавать множество исключений - и, возможно, некоторую проверку безопасности сценария, который проходит.