另一个客户端替换sqlplus来访问oracle?

时间:2013-09-30 19:22:11

标签: oracle sqlplus

我对如何为终端格式化sqlplus输出有一些问题,我只是想围绕sqlplus编写脚本并修复它们。

另一方面,哇看起来真的很蹩脚。因为Oracle有几吨工具编写。但似乎很难得到我想要的东西。有没有人有其他建议?

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

其次,我希望能够轻松访问列的侧面显示,例如在MySQL的命令末尾使用\ G.我知道在Oracle中有一种方法可以做到这一点,但它似乎很复杂。为什么不只是一个简单的开关?像命令末尾的\ G一样?如果我将输出包装到sqlplus并自己执行此操作。

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

1 个答案:

答案 0 :(得分: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 

我将向您介绍一些我在这里完成的事情

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

我正在执行这样的脚本 我的细分:

@seg 

斯科特的片段

@seg scott

Scott与Emp相关的细分

@seg scott emp

我有类似的会话,longops,等待事件,表,约束,锁定,杀死会话等脚本....在我的日常例程中,我很少编写SQL来查询这些东西。