Oracle SQL *Plus有一个非常有用的子参数(subparameter)它从属于一个叫着NEW_VALUE的数据栏参数NEW_VALUE指示允许你以SQL *Plus脚本中的变量保存从Oracle表格查询而得到的数据
用过使用NEW_VALUE参数你可以像真正的编程语言那样使用SQL *Plus脚本来保存和寻址程序变量如同PL/SQL那样
保存SQL *Plus变量并在其中填充Oracle数据是非常重要的特性由于它减少了对数据库访问所以它提高了SQL *Plus脚本的有效性
collog_mode_valnew_valuelog_modenoprint
select
value log_mode
from
v$parameter
where
name = archive_log_mode;
select
The current archivelog mode is ||&&log_mode from dual;
column today new_value today;
select
to_char(sysdatemm/dd/yyyy hh:mi) today
from
dual;
现在我们理解了SQL *Plus变量是如何保存的了让我们看看一个真实的例子下面的例子来自STATSPACK报告改报告描述了表格增长与数据库块大小的函数关系由于DB_BLOCK_SIZE在整个数据库中是一个常量我们使用NEW_VALUE参数来捕获改数值一次并把它作为输出的一部分重新显示出来
在这个例子中我们定义了一个称之为&blksz的变量并在主查询中用它来判断表格中的剩余空间下面的例子向我们演示了如何进行这个计算知道块大小可以让我们很快估计出表格中的剩余空间容量
(num_rows*avg_row_len)
*
(blocks*&blksz)
这是整个查询
column c heading TABLE NAME format a;
column c heading EXTS format ;
column c heading FL format ;
column c heading # OF ROWS format ;
column c heading #_rows*row_len format ;
column c heading SPACE ALLOCATED format ;
column c heading PCT USED format ;
column db_block_sizenew_valueblksznoprint
select value db_block_size from v$parameter where name = db_block_size;
set pages ;
set lines ;
spool tab_rptlst
select
table_name c
bextents c
bfreelists c
num_rows c
num_rows*avg_row_len c
blocks*&blksz c
((num_rows*avg_row_len)/(blocks*&blksz))* c
from
perfstatstats$tab_stats a
dba_segments b
where
bsegment_name = atable_name
and
to_char(snap_timeyyyymmdd) =
(select max(to_char(snap_timeyyyymmdd)) from perfstatstats$tab_stats)
and
avg_row_len >
order by c desc
;