Функция COUNT для файлов? - PullRequest
       0

Функция COUNT для файлов?

1 голос
/ 17 марта 2012

Можно ли каким-то образом использовать COUNT, что даст мне количество кортежей в файле .sql? Я попытался использовать его в запросе с именем файла, как это:

SELECT COUNT(*) FROM @q65b;

Это говорит мне, что таблица недопустима, что я понимаю, потому что это не таблица, q65b - это файл с сохраненным в нем запросом. Я пытаюсь сравнить количество строк в q65b с созданным мною представлением. Это возможно, или мне просто нужно выполнить запрос и проверить количество строк внизу?

Спасибо

Ответы [ 2 ]

3 голосов
/ 29 марта 2012

Вы можете сделать это в SQL * Plus. Например:

  1. Создать текстовый файл, содержащий запрос (примечание: без точки с запятой!):

    select * from dual
    
  2. Сохраните его в файле, например, myqueryfile.txt, в папку, доступную из сеанса SQL * Plus.

  3. Теперь вы можете вызывать это из другого SQL-запроса - но убедитесь, что @ в начале строки, например ::

    SQL> select * from (
      2  @myqueryfile.txt
      3  );
    
    D
    -
    X
    

Однако я не пользуюсь этой функцией лично.

1 голос
/ 17 марта 2012

Вот один из подходов. Это функция, которая читает файл в каталоге, упаковывает содержимое в конструкцию 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 - это пакет, который может выдавать множество исключений - и, возможно, некоторую проверку безопасности сценария, который проходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...