要实现如下功能,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 > 变量,该如何实现?
从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 > 变量,该如何实现?
一种方法是在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数据库里的值,请各位帮忙想想办法?
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
/
....