2009-09-17 45 views
60

很多时候,我只需要一个快速连接到Oracle数据库,SQLPLUS处理这项工作。收藏SQLPLUS提示和技巧

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

我有我跑的时候,我开始我的外壳,所以我得到了更好的体验的脚本:

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'; 

我修整我的“列”设置在这个例子中,但基本上,这有助于将数据代入上屏幕。

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

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

其他人每天都使用SQLPLUS吗?有小费吗?

+1

@ThiefMaster我同意这个问题不适合普通的问题格式。但它根本没有提出任何辩论。这是一个非常有用和非常有建设性的SQLPlus提示和技巧列表。那为什么要关闭它? – 2014-02-04 15:54:11

+0

更好的理由重新关闭:)它应该保持关闭。但这并不意味着它被删除了! – ThiefMaster 2014-02-04 16:43:07

+3

这个密切的原因也是无稽之谈。也许一些意见涉及到答案,但这些都是很难找到的主题上的有用提示。我不明白我们受到保护的问题,这些问题明显有助于被关闭。我希望有一条规则,即5 + upvotes的问题不能被关闭 – 2015-10-28 14:29:06

回答

17

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

我已经在我的login.sql脚本(SQL Plus中自动运行)以下:

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

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

2)请SQL提示显示数据库名,所以我知道我在哪里(感谢汤姆凯特此):

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程序非常有用。

+2

感谢您添加“哪个SQL Plus自动运行”。 – Upperstage 2012-04-23 13:51:46

+0

链接已损坏! – atom 2016-10-06 05:02:05

3

我发现在指令中使用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 

我会再由按时间排序找到新的日志 - 你总是可以使用一些其他的策略比随机数,如果你喜欢。

10

请记住,我们可以将这些设置放在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> 
+0

是的,重新连接后login.sql的自动运行在10g中是一个不错的改进。但是“清晰屏幕”提交在该版本中挂起,所以对我来说它可能是9或11。 – 2009-09-17 20:02:40

+0

我已经从9i直接移动到11g,所以我不知道10g的特定功能。 – APC 2009-09-17 21:08:59

+0

在我的第一个评论 – 2009-09-18 09:22:49

4

我喜欢用的sqlplus在离线。

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

其中查询。sql是

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

因此,我可以从我的蝙蝠/脚本文件在Windows或UNIX的数据库中获取信息。

8

我使用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 
55

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

$ rlwrap -c sqlplus [email protected] 

现在,向上/向下将滚动查看命令历史记录。使用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工作。

+0

rlwrap刚刚成为我的一天时,“commit”一词应该是“命令”。谢谢,达纳 – Kirby 2012-03-01 21:58:43

+0

感谢您的线条化技巧。 rlwrap我已经在使用。两者都可以在Mac OSX上运行,只需要使用'cut -f6'而不是'cut -f7'(或使用'HOST echo“set linesize”$(stty -a | head -1 | awk'{打印$ 6}')> .tmp.sql') – Johanna 2012-10-05 07:17:48

+0

如果你使用的是基于Debian的发行版(Debian/Ubuntu/Mint等),你可以执行apt-get install rlwrap(在Ubuntu 14.04和16.04上测试) 。 – labyrinth 2017-05-09 15:33:05