首页 > 开发 > 综合 > 正文

如何在SQL *Plus中把数据库栏以变量的形式保存

2024-07-21 02:34:26
字体:
来源:转载
供稿:网友

  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
  ;

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表