2013-09-30 34 views
0

我有一些问题,如何为终端格式化sqlplus输出,我只是想写一个围绕sqlplus的脚本并修复这些问题。另一个用于替换sqlplus以访问oracle的客户端?

另一方面,哇,这似乎真的跛脚。因为Oracle有数吨的工具。然而,看起来很难得到我想要的。有没有人有另一个建议?

首先,我想要更明智的列宽。如果我创建了一个最大大小为200个字符的列表,但我在其中放置了“abc”,“xyz”和“123”,我是否需要在终端上显示200个空格宽的列来显示内容?我不这么认为。我想我需要3个字符加上一对夫妇填充。然而,甲骨文坚持要给我一个200字宽的专栏。除非有解决这个问题的地方。

其次,我想要轻松访问列的横向显示,例如在MySQL中命令末尾使用\ G。我知道有一种方法可以在Oracle中做到这一点,但看起来很复杂。为什么不能有一个简单的开关?就像命令结尾的\ G一样?如果我将输出包装到sqlplus中,并且可以自己做这件事。

所以,这个问题似乎是这样的。我应该写一个围绕sqlplus的简单脚本来给我我想要的东西,还是有办法让Oracle给我这种行为在sqlplus中?如果有的话,我还需要多少额外的信息才能做到这一点?因为它看起来好像不是很复杂。但是Oracle并不是那么容易。

回答

2

首先,我建议你看看在SQL*plus reference - 你可能会发现一些有用的提示有像调整列宽

COL column_name for a20 

你可以在GLOGIN文件设置自己的设置。随着时间的推移,就像任何其他CMD一样,你会得到你的偏好恰到好处。

要描述一个表,你可以使用DESC。如果你想要更多的数据写你自己的脚本并重复使用@

如果这一切都不适用于您,您可以随时切换到像Toad或SQL开发人员这样的GUI。

编辑:

我加入我自己的脚本来向您展示如何制作的SQL * Plus在命令行更友好一些技巧之一。这是为了获取细分市场的大小。

/* This is the trick - clears &1 and &2 if received an empty string */ 
set ver off feed off 
col 1 new_v 1 
col 2 new_v 2 
select 1,2 from dual where 1=0; 

variable p_owner varchar2(30) 
variable p_segment varchar2(30) 

/* set bind variables */ 
begin 
    :p_owner := '&1'; 
    :p_segment := '&2'; 
end; 
/

set feed 1 

break on segment_type skip 1 

column MB for a25 

select 
    segment_type, 
    decode(gi_segment_name + gi_segment_type + gi_tablespace_name , 3 ,'...Grand Total', segment_name) SEGMENT_NAME, 
    to_char(round(MB,3),'99,999,999.99') MB , 
    nvl(tablespace_name,'-*-') tablespace_name 
from (
    select tablespace_name , segment_type , segment_name , sum(bytes/1024/1024) MB , 
      grouping_id(segment_name) gi_segment_name , 
      grouping_id(segment_type) gi_segment_type , 
      grouping_id(segment_type) gi_tablespace_name 
    from  dba_segments 
    where ((:p_owner is null and owner = user) or owner like upper(:p_owner)) 
    and  (:p_segment is null or segment_name like upper('%'||:p_segment||'%')) 
    group by rollup(tablespace_name, segment_type , segment_name) 
    ) 
where not (gi_segment_name = 1 and gi_segment_type = 0 and gi_tablespace_name = 0) 
order by decode(segment_type,'TABLE','0','TABLE PARTITION','1','INDEX','2','INDEX PARTITION','3',segment_type) , 
     (case when segment_name like '.%' then 'z' else 'a' end) , 
     gi_segment_name , 
     MB desc , 
     segment_name; 

clear break 

/* clear definition for &1 and &2 after being used. 
    allows the variable to be null the next run. */ 
undefine 1 
undefine 2 

我将向您介绍一些事情iv'e这里完成

  • 脚本接受两个参数。如果没有收到,前4行清除参数
    。如果您不这样做,SQL * Plus会为您提示 。我们不需要这个。
  • 设置绑定在过去的版本中更重要。这是 旨在保存硬/软解析。最新版本解决了这个问题 的问题。尽管如此,这仍然是最佳做法。
  • break是一个很好的接触。你会看到它。
  • 分组ID可以显示几个级别的小计。
  • 我已经添加了两个参数,所有者和细分名称。两者都可以包含 百搭牌。两者都可以为空。如果未提供,则该查询将获取当前用户段的 。
  • 通过解码排序使我能够为不同的 段类型设置自定义排序顺序。您可以根据需要更改它。

我执行这样的脚本 我段:

@seg 

斯科特的段

@seg scott 

斯科特的Emp相关细分

@seg scott emp 

我有一个类似的脚本会话,longops,等待事件,ta bles,constraints,locks,kill session等......在我的日常工作中,我很少编写SQL来查询这些东西。

+0

我希望我可以使用蟾蜍或其他东西。不幸的是,数据库是在防火墙后面,我必须telnet进来。不,我们不想设置ssh端口转发,尽管我们希望我们可以。 –

相关问题