最喜欢的SQLPLUS技巧和窍门

很多时候我只需要快速连接到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”设置,但基本上,这有助于数据适合在屏幕上。

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

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

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

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

 $ rlwrap -c sqlplus username@database 

现在上/下将滚动通过命令历史。 使用ctrl-r通过历史logging等向后search。这使得sqlplus可以忍受。

另外,把这个添加到你的login.sql来设置任何你的terminal的宽度为:

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

这两个提示只适用于Unix。

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

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

1)用我的selectreplace默认编辑器(记事本):

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

请记住,我们可以将这些设置放入login.sql脚本中,每当我们启动SQL * Plus时,脚本就会自动运行。 了解更多。

关于这一点的简单的事情是,从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> 

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

这是我的login.sql 。 我在那里复制了Tom Kyte和William Robertson的一些build议。 也许你会发现一些你想要使用的东西。

 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 

我喜欢在离线状态下使用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中的数据库中获取信息。

我发现在指令中使用SQL * Plus列variables是很方便的,例如,我经常在一个会话中,想要假脱机到一个新的文件名,以避免覆盖另一个可能已经存在的日志,并做到这一点(前三个语句通过@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 

然后,我会通过按时间sorting来查找新日志 – 如果您愿意,可以随时使用除随机数之外的其他策略。