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(sysdate,'mm/dd/yyyy hh24:mi') today
from
dual;
现在,我们理解了SQL *Plus变量是如何保存的了,让我们看看一个真实的例子。下面的例子来自STATSPACK报告,改报告描述了表格增长与数据库块大小的函数关系。由于DB_BLOCK_SIZE在整个数据库中是一个常量,我们使用NEW_VALUE参数来捕获改数值一次,并把它作为输出的一部分重新显示出来。
在这个例子中,我们定义了一个称之为&blksz的变量并在主查询中用它来判断表格中的剩余空间。下面的例子向我们演示了如何进行这个计算。知道块大小可以让我们很快估计出表格中的剩余空间容量。
(num_rows*avg_row_len)
--------------------- * 100
(blocks*&blksz)
这是整个查询:
column c1 heading "TABLE NAME" format a15;
column c2 heading "EXTS" format 999;
column c3 heading "FL" format 99;
column c4 heading "# OF ROWS" format 99,999,999;
column c5 heading "#_rows*row_len" format 9,999,999,999;
column c6 heading "SPACE ALLOCATED" format 9,999,999,999;
column c7 heading "PCT USED" format 999;
column db_block_sizenew_valueblksznoprint
select value db_block_size from v$parameter where name = 'db_block_size';
set pages 999;
set lines 80;
spool tab_rpt.lst
select
table_name c1,
b.extents c2,
b.freelists c3,
num_rows c4,
num_rows*avg_row_len c5,
blocks*&blksz c6,
((num_rows*avg_row_len)/(blocks*&blksz))*100 c7
from
perfstat.stats$tab_stats a,
dba_segments b
where
b.segment_name = a.table_name
and
to_char(snap_time,'yyyy-mm-dd') =
(select max(to_char(snap_time,'yyyy-mm-dd')) from perfstat.stats$tab_stats)
and
avg_row_len 500
order by c5 desc
;