熟悉Oracle SQL语法的人可能都知道在*sql文件里可以用&& & 变量名称去获取并使用变量
以scott用户 举例如下
在C盘的根目录下写一个SQL文件c:\sqlsql
select empnoenamejobsal from emp where deptno=[$ and sal>&]
在SQL*PLUS下带参数调用 c:\sqlsql
SQL> c:\sqlsql
输入被截为个字符
原值:select empnoenamejobsal from emp where deptno=& and sal>&
新值:select empnoenamejobsal from emp where deptno= and sal>
EMPNO ENAMEJOBSAL
SMITHCLERK
JONESMANAGER
SCOTTANALYST
SQL> c:\sqlsql
输入被截为个字符
原值:select empnoenamejobsal from emp where deptno=& and sal>&
新值:select empnoenamejobsal from emp where deptno= and sal>
EMPNO ENAMEJOBSAL
CLARKMANAGER
KING PRESIDENT
但是这种获取并使用变量的方法不太方便变量名必须按出现的顺序以来命名相同变量也要传递多次 还有一定的数量限制
有时我们要获取系统内已有的参数或者固定格式的系统时间就要采取另一种方法
比如以system用户查看数据库物理文件的详细信息c:\sqlsql
column db_block_size new_value blksz noprint;
select value db_block_size from v$parameter where name=db_block_size;
column tablespace_name format A;
column file_name format A;
set linesize ;
select file_nameround(bytes/(*)) as total_spaceautoextensible
increment_by*&blksz/(*) as incrementmaxbytes/(*) as maxsize
from dba_data_files order by tablespace_name;
说明column db_block_size new_value blksz noprint;
把查询出来的db_block_size赋值到变量blksz 这样出现多次的&blksz变量都可以被一个系统内已有的参数值所替换
类似的可采用如下的方法获取固定格式的系统时间:
比如查询前一天订单的数量并生成操作系统下的文件c:\sqlsql
column yesterday new_value checkdate noprint;
select to_char(sysdateyyyymmdd) yesterday from dual;
spool c:\[$checkdatetxt]
select count(*) from orders
where ordertime>=to_date(&checkdateyyyymmdd)
and ordertime<to_date([$checkdateyyyymmdd)+]
spool off;