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
新聞熱點
疑難解答