我对如何为终端格式化sqlplus输出有一些问题,我只是想围绕sqlplus编写脚本并修复它们。
另一方面,哇看起来真的很蹩脚。因为Oracle有几吨工具编写。但似乎很难得到我想要的东西。有没有人有其他建议?
首先,我想要更智能的列宽。如果我创建一个包含最大大小为200个字符的列的表但是我在其中放入“abc”,“xyz”和“123”,我是否需要在终端上显示200个空格的宽列来显示内容?我不这么认为。我想我需要3个字符加一对填充。然而甲骨文坚持给我一个200字符宽的专栏。除非有某处可以解决这个问题。
其次,我希望能够轻松访问列的侧面显示,例如在MySQL的命令末尾使用\ G.我知道在Oracle中有一种方法可以做到这一点,但它似乎很复杂。为什么不只是一个简单的开关?像命令末尾的\ G一样?如果我将输出包装到sqlplus并自己执行此操作。
所以,问题似乎是这样。我应该围绕sqlplus编写一个简单的脚本来给我我想要的东西,还是有办法让Oracle在sqlplus中给我这个行为?如果有的话,我还需要多少额外的信息才能让我的工作变得更好?因为它看起来好像不应该很复杂。但甲骨文肯定不会那么容易。
答案 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
我将向您介绍一些我在这里完成的事情
break
很不错。你会看到的。我正在执行这样的脚本 我的细分:
@seg
斯科特的片段
@seg scott
Scott与Emp相关的细分
@seg scott emp
我有类似的会话,longops,等待事件,表,约束,锁定,杀死会话等脚本....在我的日常例程中,我很少编写SQL来查询这些东西。