【问题标题】:Another client to replace sqlplus for access to oracle?另一个客户端替换 sqlplus 以访问 oracle?
【发布时间】:2013-09-30 19:22:10
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: oracle sqlplus


    【解决方案1】:

    首先我建议您查看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 显示多个级别的小计。
    • 我添加了两个参数,所有者和分段名称。两者都可以包含 外卡。两者都可以为空。如果未提供,查询将获取 当前用户细分。
    • Order by decode 使我能够为不同的 段类型。您可以随意更改。

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

    @seg 
    

    斯科特的片段

    @seg scott
    

    Scott's Emp 相关细分

    @seg scott emp
    

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

    【讨论】:

    • 我希望我可以使用 Toad 或其他东西。不幸的是,数据库在防火墙后面,我必须远程登录。不,我们不想设置 ssh 端口转发,尽管我们希望可以。
    猜你喜欢
    • 2017-02-27
    • 1970-01-01
    • 2019-10-09
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 2012-03-06
    相关资源
    最近更新 更多