2012-03-16 35 views
1

是否有可能以某种方式使用COUNT这会给我一个.sql文件中元组的数量?我试着像这样的文件名的查询中使用它:文件的COUNT函数?

SELECT COUNT(*) FROM @q65b; 

它告诉我,该表是无效的,这我理解,因为它不是一个表,q65b是保存在查询文件它。我试图将q65b中的行数与我创建的视图进行比较。这是可能的还是我只需要运行查询并检查底部的行数?

谢谢

+0

您不能使用文件名从中进行选择。你需要一个类似桌子的结构(表格,视图,常量......) – Konerak 2012-03-16 23:17:47

+1

+1。我不明白为什么有人这样做。我认为答案是“没有办法”,但如果有*方式,我会觉得它非常有用! – ruakh 2012-03-16 23:19:26

+1

(请注意,顺便说一句,“q65b是一个保存有查询的文件”并不完全正确:它是一个包含SQL * Plus脚本的文件,并且该SQL * Plus脚本包含一个查询。) – ruakh 2012-03-16 23:21:10

回答

3

可以在SQL * Plus中执行此操作。例如:

  1. 创建文本文件,包含查询(注:别无分号!):在一个文件中

    select * from dual 
    
  2. 保存它,例如myqueryfile.txt,指向可从SQL * Plus会话访问的文件夹。

  3. 现在,您可以从另一个SQL查询中调用这一点 - 但要确保@作为在一行的开头,如:

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

我个人不使用此功能多但是。

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文件的内容:

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方面的错误处理 - it's a package which can throw lots of exceptions - 并且可能会对通过的脚本进行一些安全检查。