服务器 频道

如何在SQLPlus中把数据库栏以变量形式保存

  【IT168 服务器学院】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
0
相关文章