很多次我只需要快速连接到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中打开命令窗口时,我设置窗口布局属性,以便我可以滚动,有一个更宽的窗口等,并保存设置以供将来的窗口使用。
其他人每天都使用SQLPLUS吗?有什么提示吗?
答案 0 :(得分:55)
您可以使用rlwrap为sqlplus添加readline支持。像这样运行sqlplus:
$ rlwrap -c sqlplus username@database
现在上/下将滚动浏览命令历史记录。使用ctrl-r向后搜索历史记录等。这使得sqlplus可以忍受。
另外,将此添加到您的login.sql,将lineize设置为终端的宽度:
HOST echo "set linesize" $(stty -a|head -n1|cut -f7 -d' '|cut -f1 -d';') > .tmp.sql
@.tmp.sql
HOST rm -f .tmp.sql
这两个提示仅适用于unix。
答案 1 :(得分:17)
是的,我每天都使用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程序非常有用。
答案 2 :(得分: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>
答案 3 :(得分: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
答案 4 :(得分:4)
我喜欢离线使用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文件中从数据库中获取信息。
答案 5 :(得分: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
然后我会按时间排序找到新日志 - 如果您愿意,可以随时使用除随机数之外的其他策略。