最喜欢的 SQL*Plus 提示和技巧 [关闭]

Posted

技术标签:

【中文标题】最喜欢的 SQL*Plus 提示和技巧 [关闭]【英文标题】:Favorite SQL*Plus tips and tricks [closed] 【发布时间】:2010-11-29 04:19:03 【问题描述】:

很多时候我只需要快速连接到 Oracle 数据库,SQLPLUS 会在其中处理这项工作。

我想当人们开始使用 Oracle 时,他们被告知要做的第一件事就是安装 Toad 或 SQLDeveloper。即便如此,如果您正在执行一些简单的查询,有时您也不想等待这些工具加载。

我有一个在我启动 shell 时运行的脚本,以便获得更好的体验:

SET pagesize 2000
SET LONG 10000
SET linesize 1000
COLUMN last_name format a20
COLUMN total format 999,999,999
SET feedback ON
alter session set nls_date_format = 'yyyy-mm-dd hh:mi:ssPM';

我为这个例子修剪了我的“COLUMN”设置,但基本上,这有助于数据适合屏幕。

设置日期格式确实简化了日期处理。

当命令窗口在 Windows 中打开时,我设置了窗口布局属性,以便我可以滚动、拥有更宽的窗口等,并为以后的窗口保存设置。

还有其他人每天都使用 SQL*Plus 吗?有什么建议吗?

【问题讨论】:

@ThiefMaster 我同意这个问题不符合常规问题格式。但这根本没有引起争论。这是一个非常有用且非常有建设性的 SQLPlus 提示和技巧列表。那为什么要关闭它呢? 以更好的理由重新关闭 :) 它应该保持关闭状态。但这并不意味着它被删除了! 这个接近的理由也是无稽之谈。也许答案中涉及到一些意见,但这些都是关于很难找到的主题的有用提示。我不明白这些问题对我们的保护是什么,这些问题被关闭显然很有帮助。我希望有一条规则,不能关闭超过 5 票的问题 ...或者可能标记为最喜欢的问题,例如 50 多次 这个问题显然不是一个人可能遇到的具体问题,也没有正确的答案或解决方案,因此它不符合 SE Q&A 格式!更合适的可能是新的 SO 文档:***.com/tour/documentation 【参考方案1】:

您可以使用rlwrap 为sqlplus 添加readline 支持。像这样运行 sqlplus:

$ rlwrap -c sqlplus username@database

现在向上/向下将滚动浏览命令历史记录。使用 ctrl-r 向后搜索历史等。这使得 sqlplus 可以忍受。

另外,将其添加到您的 login.sql 中,以将 linesize 设置为终端的宽度:

HOST echo "set linesize" $(stty -a|head -n1|cut -f7 -d' '|cut -f1 -d';') > .tmp.sql
@.tmp.sql
HOST rm -f .tmp.sql

这两个技巧都只适用于 unix。

【讨论】:

感谢 linesize 技巧。 rlwrap 我已经在使用了。两者都可以在 Mac OSX 上运行,差别不大,您必须使用 cut -f6 而不是 cut -f7(或使用 HOST echo "set linesize" $(stty -a | head -1 | awk 'print $6') > .tmp.sql 如果您使用的是基于 Debian 的发行版(Debian/Ubuntu/Mint 等),您可以执行 apt-get install rlwrap(在 Ubuntu 14.04 和 16.04 上测试)。【参考方案2】:

是的,我每天都使用 SQL Plus,而不是 Toad 或 SQL Developer(尽管我也使用 SQL Developer 来浏览数据库)。

我的 login.sql 脚本(SQL Plus 自动运行)中有以下内容:

1) 用我选择的一种替换默认编辑器(记事本):

define _editor = "C:\Program Files\TextPad 5\TextPad.exe"

2) 让 SQL 提示符显示数据库名称,以便我知道我在哪里(感谢 Tom Kyte):

COLUMN global_name new_value gname
SET TERMOUT OFF
SELECT LOWER(USER) || '@' || global_name||CHR(10)||'SQL> ' AS global_name
FROM   global_name;
SET SQLPROMPT '&gname'
SET TERMOUT ON

...加上与您类似的其他设置。

我还发现 Tom Kyte 的 print_table 程序非常有用。

【讨论】:

链接已损坏!【参考方案3】:

请记住,我们可以将这些设置放在 login.sql 脚本中,该脚本将在我们启动 SQL*Plus 时自动运行。 Find out more.

关于这个的巧妙之处在于,从 10g 开始,每次我们连接时都会运行这个脚本,而只是在我们第一次启动 SQL*Plus 时运行......

SQL> conn apc
Enter password:
Connected.
Running login script

Session altered.

SQL> conn scott
Enter password:
Connected.
Running login script

Session altered.

SQL>

【讨论】:

是的,重新连接后login.sql的自动运行是10g中一个不错的改进。但是“清除屏幕”提交挂在那个版本中,所以对我来说是 9 或 11。 我是直接从 9i 升级到 11g,所以我不知道 10g 的那个特殊功能。 我的第一条评论中“commit”这个词应该是“command”【参考方案4】:

我专门使用 SQL*Plus 来处理 Oracle。其他答案已经给出了一些非常方便的 login.sql 内容。

这是我的login.sql。我在那里复制了 Tom Kyte 和 William Robertson 的一些建议。也许你也找到了一些你想用的东西。

set termout off
set serveroutput on size unlimited
set pagesize 50000
set linesize 135
set long 50000
set trimspool on
set tab off
def _editor = "C:\Progra~1\Notepad++\Notepad++.exe"

define gname=idle
column global_name new_value gname
select lower(user) || '@' ||
       substr(global_name,1,decode(dot,0,length(global_name),dot-1)) global_name
from (select global_name,instr(global_name,'.') dot from global_name);
set sqlprompt '&gname> '

alter session set nls_date_format = 'dd-mm-yyyy hh24:mi:ss'
/
var sid number
var serial# number
var tracefile VARCHAR2(200)

DECLARE
    v_audsid v$session.audsid%TYPE;
BEGIN
    SELECT sid, serial#, audsid
    INTO   :sid, :serial#, v_audsid
    FROM   v$session
    WHERE  audsid = SYS_CONTEXT('USERENV','SESSIONID');

    SELECT par.value ||
           CASE WHEN par.value LIKE '%/%' THEN '/' ELSE '\' END ||
           LOWER(th.instance) ||
           '_ora_' || LTRIM(TO_CHAR(pro.spid,'fm99999')) || '.trc' AS filename
    INTO   :tracefile
    FROM   v$process   pro
         , v$session   se
         , v$parameter par
         , v$thread    th
    WHERE  se.audsid = v_audsid
    AND    pro.addr = se.paddr
    AND    par.NAME = 'user_dump_dest';
END;
/

BEGIN
    IF :sid IS NULL THEN
        SELECT sid
        INTO   :sid
        FROM   v$mystat
        WHERE  rownum = 1;
    END IF;
END;
/

set termout on
set feedback off
exec DBMS_OUTPUT.PUT_LINE('Sessie: ' || :sid || CASE WHEN :serial# IS NULL THEN ' (no access to V$ tables)' ELSE ',' || :serial# END)
exec IF :tracefile IS NOT NULL THEN DBMS_OUTPUT.PUT_LINE('Eventueel trace-bestand: ' || :tracefile); END IF
prompt
set feedback on

【讨论】:

【参考方案5】:

我喜欢离线使用sqlplus。

sqlplus -S user/password @query.sql> file.txt

query.sql 在哪里

set feedback off verify off heading off pagesize 0
...here goes a query...
quit;
/

所以我可以在 windows 或 unix 的 bat/script 文件中从数据库中获取信息。

【讨论】:

【参考方案6】:

我发现在指令中使用 SQL*Plus 列变量很方便 - 例如,我经常在会话中并希望假脱机到一个新文件名以避免覆盖另一个可能已经存在的日志并执行此操作(通过@file 的前三个语句):

SQL> column spr new_value spoolref
SQL> select user||'_'||abs(dbms_random.random) spr from dual;
SQL> spool &spoolref
         ... do work here ...
SQL> spool off

然后,我将按时间排序找到新日志 - 如果您愿意,您可以随时使用随机数以外的其他策略。

【讨论】:

以上是关于最喜欢的 SQL*Plus 提示和技巧 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

SQL PLUS 使用小技巧

最喜欢的 Kohana 提示和功能? [关闭]

『干货』分享你最喜欢的技巧和提示(Xcode,objective-c,swift,c...等等)

你最喜欢的 MATLAB/Octave 编程技巧是啥? [关闭]

分享你最喜欢的技巧和提示(Xcode,Objective-C,Swift,C...等等)

是否有通过电子邮件发送每日 C# 提示和技巧的网站? [关闭]