要实现如下功能,sql语句该如何写?
从as001,as002,……as009表中抽取符合条件的数据,然后放到文件中,一个表对应一个文件,每个表所抽取的数据满足的条件都一样,
我的做法是在shell里面调用sqlplus执行all_table.sql语句,all_table里面在调用各个表的查询语句,
-------------all_table.sql-----------------
[code]
@@as001.sql
@@as002.sql
........
@@as009.sql
[/code]
--------------as001.sql--------------------
[code]
SET LINES 420
SET PAGES 0
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS';
SET TRIMSPOOL OFF
SET HEADING   OFF
SET FEEDBACK  OFF 
spool SC110001.log
select
a1||b1||c1||d1||……||z1 
from as001
where a1 < (select abc from bn0001)
and     b1 > (select abc from bn0001)
/spool OFF;                              
[/code]
as002……as009的where条件与as001一样,现在为了提高效率,我想先把bn0001表里的abc抽出来放在一个变量里,以后只是在where条件里改为 a1 < 变量 and b1 > 变量,该如何实现?

解决方案 »

  1.   

    我尝试了很多办法, 
    一种方法是在all_table.sql里define qwe = "select abc from bn0001",然后as00*.sql里where条件改为a1 < &qwe and b1 > &qwe,但这样做并没有提高效率,并且生成的文件里会多出几行,不知道该怎么去掉,因为想得到只是数据的文件,不知各位有什么别的方法去掉这几行; 
    另一种方法是在all_table.sql语句中嵌入plsql块, 
    ----------------all_table.sql--------------- 
    代码: SET VERIFY OFF 
    SET SERVEROUTPUT ON 
    SET TERMOUT ON WHENEVER OSERROR  EXIT 1 ROLLBACK 
    WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK DECLARE 
       c_qwe  CHAR(14); 
    BEGIN 
       SELECT abc INTO c_qwe FROM bn0001; 
    END; 

    define qwe = c_qwe 
     但这样做qwe并没有取到bn0001数据库里的值,请各位帮忙想想办法?
      

  2.   

    你后一种pl/sql的方法,定义的变量不合适,是pl/sql块内变量执行完该过程后变量就不存在了;且你的查询“SELECT abc  FROM bn0001”会不会返回多行或者没有结果?根据你第二个思想,修改变量的定义方式(假设你的子查询只返回一行):
    Variable qwe varchar2(20);
    begin
    SELECT abc INTO :qwe FROM bn0001;
    end;
    /
     
    调用时:
    select
    a1||b1||c1||d1||……||z1 
    from as001
    where a1 < :qwe 
    and   b1 > :qwe
    /
    ....