0

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

另一方面,哇,这似乎真的很蹩脚。因为 Oracle 编写了好几吨工具。然而似乎很难得到我想要的东西。有人有其他建议吗?

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

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

所以,问题似乎是这样的。我应该围绕 sqlplus 编写一个简单的脚本来给我想要的东西,还是有办法让 Oracle 在 sqlplus 中给我这种行为?如果有的话,我需要在脑海中塞入多少额外的信息才能完成这项工作?因为它似乎并不应该很复杂。但甲骨文肯定不会让事情变得简单。

4

1 回答 1

2

首先,我建议您查看SQL*plus 参考- 您可能会在那里找到一些有用的提示,例如调整列宽

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's Emp 相关部门

@seg scott emp

我有类似的会话脚本、longops、等待事件、表、约束、锁、终止会话等....在我的日常工作中,我很少再编写 SQL 来查询这些东西了。

于 2013-09-30T19:36:33.757 回答