转:sqlplus使用总结

摘要:
为什么我要使用sqlplus:SQLPLUS很多人用的并不多,在我观察周围来看,很多人都在使用PLSQLDEVELOPER,尤其是开发人员,更是如此,那学习SQLPLUS有啥好处呢?--登录数据库:1.直接敲sqlplus并回车就是启动SQL*PLUS,输入user及password将使用户登陆到缺省的数据库。请输入用户名:2.sqlplususer/password@SERVICE_NAME将连接到指定的数据库。SQL˃3.敲sqlplus/nolog就是使SQL*PLUS启动,但不登陆Oracle数据库。然后需要使用connect命令连接Oracle。

为什么我要使用sqlplus:

SQLPLUS很多人用的并不多,在我观察周围来看,很多人都在使用PLSQL DEVELOPER,尤其是开发人员,更是如此,那学习SQLPLUS有啥好处呢?在我看来有如下三点
1、当我们要在UNIX平台用SHELL访问数据库(如:做一些后台操作,定时任务等等),这个时候SQLPLUS是唯一选择。
2、SQLPLUS 是ORACLE自带的工具,只要安装了数据库就有了,而PLSQL DEVELOPE等工具还要独立安装。并且由于是客户端工具,在网络故障或者是主机性能障碍情况下,往往根本就无法登陆进该工具。
3、每个工具都各有所长,SQLPLUS少了PLSQL DEVELOPER的可视化的方便性,自然有其他独到的优势,在下文中会简要说明。

wKiom1MMS5fTxJBXAAEkX0P60Bk677.jpg

wKiom1MMVoegek-FAAUDZmOO6e4583.jpg

wKioL1MMWSDDd7NWAAFXGUrSP2g069.jpg

--

登录数据库:

1.直接敲sqlplus并回车就是启动SQL*PLUS,输入user及password将使用户登陆到缺省的数据库。

请输入用户名:

2.sqlplus user/password@SERVICE_NAME将连接到指定的数据库。

SQL>connect sys/oracle@192.168.1.204/icpdb
已连接。
SQL>

3.敲sqlplus /nolog就是使SQL*PLUS启动,但不登陆Oracle数据库。然后需要使用connect命令连接Oracle。

SQL>conn u/p[@ip:port/jiagulun]|[service_name]

----

sqlplus hr/hr ------>直接连,不走监听,直接在本地连

sqlplus / as sysdba ------>直接连,不走监听,直接在本地连

sqlplus hr/hr@jiagulun ------>走本地tnsname.ora,走监听

sqlplus hr/hr@ip:port/jiagulun ------>走监听,不走tnsname.ora

sqlplus命令:

--http://ss64.com/ora/syntax-sqlplus.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
@pathname Run (START) an SQL Script
@MyScript.sql parameter1 parameter2 parameter3
In the SQL-Script, refer to the parametersas&1, &2, and &3.
@ScriptName.sql will call sub-scripts from the current working directory of SQL*Plus.
@C:workoracleScriptName.sql will call a sub-script from a specific directory.
@@pathname Run (START) an SQL Script
@@ will call a sub-script from the same directoryasthe main script.
&variable A substitutionvariable
&&variable A substitutionvariable validforthe session.
/ Execute (or re-execute) commandsinthe SQL*Plus buffer
does not list commands before running.
ACCEPT User input
ACC[EPT]variable [NUM[BER]|CHAR|DATE] [FORMAT format]
[DEFAULTdefault] [PROMPT text|NOPROMPT] [HIDE]
APPEND Add text to the end of the current lineinthe buffer.
A[PPEND] text_to_add
BREAK Specify where and how formatting will change.
BREAK ON {column|expr|ROW|REPORT} action
BTITLE Place and format a title at the bottom ofeachpage.
BTITLE printspec [text|variable]
BTITLE [OFF|ON]
CHANGE Change text on the current line (change what you just typed.)
C /oldval/newval
CLEAR Clear the SQL*Plus screen and the screen buffer.
CLEAR {BREAKS|BUFFER|COLUMNS|COMPUTES|SCREEN|SQL TIMING}
COLUMN Change display width of a column.
COMPUTE Calculate and display totals.
CONNECT Connect to a databaseasa specified user:
connect username/password@SID
COPY Copy data from a query into a table (local or remote)
DEFINE Uservariables:
DEFINEvarName =StringDisplay a uservariable:
DEFINEvarName Display allvariables:
DEFINE
DEL Delete the current lineinthe SQL buffer.
DEF show oracledefaultvaribales;
DESC[RIBE] Describe a table, column, view, synonym,function
procedure,packageorpackagecontents.
DISCONNECT Logoff (but don't exit)
EDIT Load the SQL*Plus buffer into an editor.
Bydefault, saves the file to AFIEDT.BUF
EXECUTE Run a single PLSQL statement
EXEC :answer := EMP_PAY.BONUS('SMITH')
EXIT [n] Commit, logoff and exit (n = error code)
EXIT SQL.SQLCODE
GET file Retrieve a previously stored command file.
HELP topic Topicisan SQL PLUS command or HELP COMMANDS
HOST Execute a host operating system command.
HOST CD scripts
INPUT Edit sql buffer - add line(s) to the buffer.
LIST n m Edit sql buffer - display buffer lines n to m For all lines - specify masLAST
PAUSE message Waitforthe user to hit RETURN.
PRINTvariable List the value of a bindvariable or REF Cursor (see VARIABLE / SHOW)
PROMPT message Echo a message to the screen.
REMARK REMARK comment or --comment-- or/* comment */
RUN Execute (or re-execute) commandsinthe SQL*Plus buffer
Lists the commands before running.
RUNFORM Run a SQL*Forms application.
SAVE file Save the contents of the SQL*Plus bufferina command file.
SAVE file [CRE[ATE] | REP[LACE] | APP[END]]
SET Display or change SQL*Plus settings.
SHOW List the value of a systemvariable (see PRINT)
SHUTDOWN [ABORT|IMMEDIATE|NORMAL|TRANSACTIONAL]
SPOOL file Store query resultsinfile
SPOOL OFF Turn off spooling
SPOOL OUT sends file to printer
SQLPLUS Start SQL*Plus and connect to a database.
STA[RT] Run an SQL Script (see @)
STARTUP [NoMOUNT|MOUNT|OPEN]
TIMING Record timing data TIMING {START | SHOW | STOP}
see CLEAR TIMING
TTITLE Define a page title
UNDEFINE Delete a user/substitutionvariable UNDEFINEvarName (see DEFINE)
VARIABLE Define a bindvariable (Can be usedinboth SQLPlus and PL/SQL)
VAR[IABLE] [variable {NUMBER|CHAR|CHAR(n)|REFCURSOR}]
A RefCursor bindvariable can be used to reference PL/SQL cursorvariablesinstored procedures.
PRINT myRefCursor
EXECUTE somePackage.someProcedure(:myRefCursor)
VARIABLE on its own will display the definitions made.
WHENEVER OSERROR Exitifan OS error occurs
WHENEVER SQLERROR Exitifan SQL or PLSQL error occurs

SQL*Plus Prompt:

To display the currently connected UserName and SID, instead of just SQL>
SET sqlprompt '&_user:&_connect_identifier > '
Add the line above to the file: $ORACLE_SID/sqlplus/admin/glogin.sql (this tip requires Oracle 10g or greater)

“Client Servers were a tremendous mistake and we are sorry that we sold it to you. Instead of applications running on the desktop and data sitting on the server, everything will be Internet based” ~ Larry Ellison, CEO, Oracle Corp.

spacer.gif
spacer.gifwKioL1MNhKvhTej9AAEv_G5s27Y114.jpg

一点演示:

wKiom1MMWFPTvYK3AALcWQ9BxIg607.jpg

wKioL1MMWC_Dn9D7AAK3Mt_yAsE452.jpg

--

wKioL1MMWLKyTlL2AAHDkZwRbcY224.jpg

--

wKiom1MMWFWQf0XWAANlSFVxTZI397.jpg

wKiom1MMWFWgzRckAAE2AWXPMoY842.jpg

wKioL1MMVsuxQ5GlAAG5cFFzzBM970.jpg

wKioL1MMVleBuxrGAAK1iAQrFNY867.jpg

wKiom1MMVn3ByFMQAAJ0KLF1nUI513.jpg

wKiom1MMVn6iUxjNAALh4Bn2knU781.jpg

wKioL1MMVlmgjpwDAAO9VHw9GVc137.jpg

wKioL1MMVluRsaK9AAPBj3sY-9s074.jpg

wKiom1MMVoDw8XPFAAC1bzHLGAg442.jpg

wKioL1MMVlzwGLY9AAM8C-FR41w424.jpg

wKiom1MMVoOQxhXDAAND0N-YR6k495.jpg

wKioL1MMVl_yGp9MAAS7IY-DPCE023.jpg

---sqlplus一些小特写

1 sqlplus工具特有的COPY功能

SQL*Plus Copy 命令的语法:

COPY {FROM database | TO database | FROM database TO database} {APPEND|CREATE|INSERT|REPLACE} destination_table [(column, column, column, ...)]

USING query

Append - 向已有的目标表中追加记录,如果目标表不存在,自动创建,这种情况下和Create等效。

Create - 创建目标表并且向其中追加记录,如果目标表已经存在,则会返回错误。

Insert - 向已有的目标表中插入记录,与Append不同的是,如果目标表不存在,不自动创建而是返回错误。

Replace - 用查询出来的数据覆盖已有的目标表中的数据,如果目标表不存在,自动创建。

根据最近使用的经验来看,我认为好处有如下:

1、直接在不同数据库中进行拷贝动作,比传统方法需建DBLINK更方便易用多了。

2、DBLINK一旦建立,如果出于安全考虑,很可能要删除掉,否则会留下安全隐患(想着想着多想了一个理由)。

3、CREATE TABLE XXX AS SELECT * FROM XXX@dblink或

inser into table select *from xxx@dblink的方法必须要保证目标表没有该表或者已经有该表。 而COPY APPEND,REPLACE不存在自动创建,有存在则自动插入,灵活的多。(如果要判断了选择CRDATE,INSERT,可让我们有选择的余地)

4、在已经有数据的情况下,SQLPLUS的APPEND命令追加,比INSERT INTO SELECT 高效

5、如果不考虑性能,比如只是实时同步两库的参数配置小表,那在SHELL中批量写COPY+REPLACE语句,CRONTAB定时同步,就可以保证两库配置表是基本一致的,这个在大表不实用,在小表就一定大有用武之地!(这个是在自己多次反复同步配置表后,无意想到的)

此外我整了几个注意点:

1、这些都是直接路径读,所以COPY+APPEND,INSERT也是直接提交成功的,所有的动作操作后都无法回滚。

2、虽然主要适用于不同库之间,但是在同一库不同用户也使用,甚至同一库同一用户也一样(同用户表名要不一样),就是FROM TO写好则可。

3、写法习惯要注意,COPY+CREATE 后面不要增加TABLE的关键字,经常收到ORACLE语法误导,会多写了这个。

实验:

本机笔记本上10G环境测试可以连到测试环境9I数据库

1
2
3
4
5
Oracle Database 10g Enterprise Edition Release10.2.0.1.0- Production
With the Partitioning, OLAP and Data Mining options
C:Documents and Settingsfujitsu>tnsping dev_db
TNS Ping Utilityfor32-bit Windows: Version10.2.0.1.0- Production on15-11月-200910:43:26
Copyright (c)1997,2005, Oracle. All rights reserved.

已使用的参数文件:

C:oracleproduct10.2.0db_1 etworkadminsqlnet.ora

已使用 TNSNAMES 适配器来解析别名

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.29.102)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = fjpta)))OK (580 毫秒)

下面实验直接COPY命令

1
2
C:Documents and Settingsfujitsu>sqlplus ljb/ljb
SQL> copy from ljb/ljb@rqrq to vajs/vajs@dev_db create ljb_test using select * from ljb_test;

数组提取/绑定大小为 15。(数组大小为 15)

将在完成时提交。(提交的副本为 0)

最大 long 大小为 80。(long 为 80)

表 LJB_TEST 已创建。

267 行选自 ljb@rqrq。

267 行已插入 LJB_TEST。

267 行已提交至 LJB_TEST (位于 vajs@dev_db)。

--这里注意,create ljb_test 我老是会根据ORACLE语法习惯写成create table ljb_test,忘记了SQLPLUS语法中没有这个TABLE关键字,这就是思维习惯了,呵呵。

这个等效的方法在ORACLE中如何实现,大家都知道,应该是 CREATE TABLE LJB_TEST AS SELECT * FROM LJB_TEST@DBLINK WHERE XXX条件,这个时候就一定要建DBLINK,多了一个步骤,而且大家一定有过没有权限建DBLINK或者是忘记DBLINK语法的经历,如此COPY命令就省事多了(此外我还想到另一种情况,就是DBLINK一旦建立了,就有可能被人使用,如果出于安全不想让人用,建立了还要立即删除了,如果用COPY命令,这个安全问题就无需考虑了)。

当我们要继续新插入数据该如何写呢?

1
SQL> copy from ljb/ljb@rqrq to vajs/vajs@dev_db append vajs.ljb_test using select * from ljb.ljb_test

数组提取/绑定大小为 15。(数组大小为 15)

将在完成时提交。(提交的副本为 0)

最大 long 大小为 80。(long 为 80)

267 行选自 ljb@rqrq。

267 行已插入 VAJS.LJB_TEST。

267 行已提交至 VAJS.LJB_TEST (位于 vajs@dev_db)。

查查看数据,本地10G环境ljb_test表记录267条

1
2
3
4
5
6
Connected to Oracle Database 10g Enterprise Edition Release10.2.0.1.0
Connectedasljb
SQL> SELECT COUNT(*) FROM ljb_test;
COUNT(*)
----------
267

9I测试环境ljb_test表记录534条,看来确实是APPEND进去了。

1
2
3
4
5
6
Connected to Oracle9i Enterprise Edition Release9.2.0.7.0
Connectedasvajs
SQL> SELECT COUNT(*) FROM ljb_test;
COUNT(*)
----------
534

再看看LJB_TEST存在情况下,COPY +INSERT如何?

发现插入OK,记录增加到801,为了篇幅,步骤不贴!

那DROP 掉vajs 用户下的ljb_test表后呢?

1
SQL> copy from ljb/ljb@rqrq to vajs/vajs@dev_db insert vajs.ljb_test using select * from ljb.ljb_test

数组提取/绑定大小为 15。(数组大小为 15)

将在完成时提交。(提交的副本为 0)

最大 long 大小为 80。(long 为 80)

ERROR:

ORA-00942: table or view does not exist

看出来这个INSERT 是一定需要有表存在的。不像APPEND,可以追加。

最后实验一下REPLACE(前面说过了,想依赖这个来实时同步两库的小记录配置表)

1
SQL> copy from ljb/ljb@rqrq to vajs/vajs@dev_db replace vajs.ljb_test using select * from ljb.ljb_test

数组提取/绑定大小为 15。(数组大小为 15)

将在完成时提交。(提交的副本为 0)

最大 long 大小为 80。(long 为 80)

表 VAJS.LJB_TEST 已创建。

267 行选自 ljb@rqrq。

267 行已插入 VAJS.LJB_TEST。

267 行已提交至 VAJS.LJB_TEST (位于 vajs@dev_db)。

发现VAJS用户下被DROP的表被建立了,记录为267

1
2
3
4
5
6
Connected to Oracle9i Enterprise Edition Release9.2.0.7.0
Connectedasvajs
SQL> SELECT COUNT(*) FROM vajs.ljb_test;
COUNT(*)
----------
267

--再执行一次!

1
SQL> copy from ljb/ljb@rqrq to vajs/vajs@dev_db replace vajs.ljb_test using select * from ljb.ljb_test

数组提取/绑定大小为 15。(数组大小为 15)

将在完成时提交。(提交的副本为 0)

最大 long 大小为 80。(long 为 80)

表 VAJS.LJB_TEST 已删除。 ----呵呵,有表后的玄机就在这,不过是先删除表再插入表而已!

表 VAJS.LJB_TEST 已创建。

267 行选自 ljb@rqrq。

267 行已插入 VAJS.LJB_TEST。

267 行已提交至 VAJS.LJB_TEST (位于 vajs@dev_db)。

发现9I数据库的VAJS的ljb_test表记录保持不变,看来用来做同步,还真好用:)

1
2
3
4
5
6
Connected to Oracle9i Enterprise Edition Release9.2.0.7.0
Connectedasvajs
SQL> SELECT COUNT(*) FROM vajs.ljb_test;
COUNT(*)
----------
267

最后,经过测试,发现传统CREATE TABLE XXX AS SELECT * FROM XXX@dblink 所花费的REDO最少

但是INSERT INTO XXX SELECT * FROM XXX@DBLINK却不如COPY +APPEND所花费的REDO少。

通过这个了解到,如果考虑新增数据,甚至COPY+APPND还有性能上的优势。

这个如何测试呢?我是测过了,但是考虑到文章的简洁,限于篇幅,贴出来又删除了。

请借鉴大家关注我的系列实验的第一贴,呵呵,整理还是会有派场的:)

2 利用SQLPLUS的自动PRINT功能+REF CURSOR可以实现SQL SERVER中的过程中写SELECT语句的写法

这个小节源于同事提出的问题,经大牛NEWKID兄指点后,正好整理出来,作为SQLPLUS的一个功能补充

接触过SQL SERVER的人都知道,在SQL SERVER中可以直接在过程中写如下:

1
2
3
BEGIN
SELECT * FROM TEST where rownum=1;
end;

而这样写法在ORACLE的过程里是行不通的,一定会报“中缺少 INTO 子句”这样的错误,我最早接触的数据库是SQL SERVER,后来接触到ORACLE后,立即就对这个差异产生了困惑,那我们如果要这样实现,咋办呢?

其实想想,这样的需求还真是有的:

1、以前我最早使用SQL SERVER的时候,喜欢把非常非常复杂逻辑的SQL查询语句整到过程中去,为啥,因为到时候执行查询的时候就不要复制粘贴一大段,如果名字起的好记些,我背都背住了,然后执行一下过程名就把我要的东西查询出来了,写什么上线操作步骤,文章也可精炼多了!

2、如果是前台展现语句能捕获输出的结果集,直接展现就OK了,否则还要插入到某表中,然后再展现某表,这个比较麻烦,(此外如果展现结果是动态的,字段在变化,岂不是要建立N张表去展现了?)

实验:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
SQL> drop table ljb_test;
Table dropped
SQL> create table ljb_test (id1int,id2int);
Table created
SQL> insert into ljb_test select rownum,rownum+2from dual connect by rownum<=5;
5rows inserted
SQL> commit;
Commit complete
SQL> select * from ljb_test;
ID1 ID2
--------------------------------------- ---------------------------------------
13
24
35
46
57
SQL> CREATE OR REPLACE PROCEDURE p_test ( p_mininnumber,p_maxinnumber,p_ref OUT SYS_REFCURSOR)
2AS
3BEGIN
4OPEN p_refforSELECT * from ljb_test where id1>=p_min and id1<=p_max;
5END p_test;
6/
过程已创建。
SQL>
SQL> SET AUTOPRINT ON
SQL> VAR p_ref REFCURSOR;
SQL> EXEC p_test(1,2,:p_ref);
PL/SQL 过程已成功完成。
ID1 ID2
---------- ----------
13
24

此外大家一定对select * from table(dbms_xplan.display)这个写法不陌生,很多人一看就明白,这个是查看执行计划的语句(是在EXPLAIN PLAN FOR SQL语句后紧接着执行的命令),由此也可以得到启发,但是这样的查询出

来的结果集是由SELECT语句触发的,而非命令执行的。

table()典型例子如下:

1
2
3
4
5
SQL> CREATE or replace TYPE t_test AS OBJECT (
2id1 NUMBER
3,id2 NUMBER
4)
5/

类型已创建。

1
2
SQL> CREATE TYPE tb_test AS TABLE OF t_test
2/

类型已创建。

1
2
3
4
5
6
7
8
9
10
11
SQL> CREATE OR REPLACE FUNCTION f_test RETURN tb_test
2AS
3v_ret tb_test:=tb_test();
4BEGIN
5FOR i IN1..2LOOP
6v_ret.EXTEND;
7v_ret(i) := t_test(i,i+2);
8END LOOP;
9RETURN v_ret;
10END f_test;
11/

函数已创建。

1
2
3
4
5
SQL> select * from table(f_test);
ID1 ID2
---------- ----------
13
24

TABLE()的方法就得先定义嵌套表,然后从表里用SELECT BULK COLLECT INTO取得数据(把table()典型子中那个循环改为SELECT取数据),再返回这个嵌套表,就能实现这个select * from ljb_test表的输出了,不过相对而言,当前需求用这个方法相比“SQLPLUS的自动PRINT功能+REF CURSOR”的方法有些不适当,因为非常繁琐!

如果一定要用select * from table()来处理,具体如下(t_test 和 tb_test 的type就不再重复建立了)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SQL> CREATE OR REPLACE FUNCTION f_test(p_min IN NUMBER,p_max IN NUMBER) RETURN tb_test
2AS
3v_ret tb_test:=tb_test();
4BEGIN
5SELECT t_test(id1,id2)
6BULK COLLECT INTO v_ret
7FROM ljb_TEST WHERE id1>=p_min AND id1<=p_max;
8
9RETURN v_ret;
10END f_test;
11/
Function created
SQL> select * from table(f_test(1,2));
ID1 ID2
---------- ----------
13
24

3 SQLPLUS SPOOL 功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SQL> select count(*) from dba_tables where owner='YXL';
COUNT(*)
----------
4
SQL> SPOOL c:drop_table.sql
SQL> SELECT'DROP TABLE '|| table_name ||';'FROM dba_tables where owner='YXL';
'DROPTABLE'||TABLE_NAME||';'
--------------------------------------------------------------------------------
DROP TABLE TEST_YXL;
DROP TABLE TEST_YXL1;
DROP TABLE YXL_TEST;
DROP TABLE YXL_TEST1;
SQL> SPOOL OFF
SQL> show user
USER 为"YXL"
SQL> @c:drop_table.sql
SP2-0734: 未知的命令开头"SQL> SELEC..."- 忽略了剩余的行。
SP2-0734: 未知的命令开头"'DROPTABLE..."- 忽略了剩余的行。
表已删除。
表已删除。
表已删除。
表已删除。
SP2-0734: 未知的命令开头"SQL> SPOOL..."- 忽略了剩余的行。

以上spool+@执行命令脚本可以写进SHELL中,轻松实现定时批量对数据库进程操作的任务。

注:大家可能注意到执行过程中有一点错误提示,虽然不影响最终的正确结果,但是却甚为不美观。原因在于

1
SQL> edit c:drop_table.sql

会发现drop_table.sql中的记录如下:

1
2
3
4
5
6
7
8
SQL> SELECT'DROP TABLE '|| table_name ||';'dba_tables where owner='YXL';
'DROPTABLE'||TABLE_NAME||';'
--------------------------------------------------------------------------------
DROP TABLE TEST_YXL;
DROP TABLE TEST_YXL1;
DROP TABLE YXL_TEST;
DROP TABLE YXL_TEST1;
SQL> SPOOL OFF

其实实际上,我们只要有如下的结果就足矣了:

1
2
3
4
DROP TABLE TEST_YXL;
DROP TABLE TEST_YXL1;
DROP TABLE YXL_TEST;
DROP TABLE YXL_TEST1;

现在这个是批量删除命令,出错无非就不执行,还好,要是进行与sqlldr进程结合的操作,那出错sqlldr就

会出错了。咋办呢,继续看下面

4 其他相关参数实验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
setecho off
setfeedback off
setnewpage none
setpagesize5000
setlinesize500
setverify off
setpagesize0
setterm off
settrims on
setlinesize600
setheading off
settiming off
setverify off
setnumwidth38
SPOOL c:delete_table.sql
SELECT'DELETE '|| table_name ||';'from dba_tables where owner='LJB'and rownum<=3;
SPOOL OFF

查看

1
2
3
4
5
SQL> SELECT'DELETE '|| table_name ||';'from dba_tables where owner='LJB'and rownum<=3;
DELETE TEST_ABCD;
DELETE TEST222;
DELETE TEST111;
SQL> SPOOL OFF

看上去好像还有点小问题,咋有这个SQL>的东东头尾两个啊,呵呵,用上sqlplus -s 参数进sqlplus后,再操作就消失了,最终结果就变成是很清爽的如下了

1
2
3
DELETE TEST_ABCD;
DELETE TEST222;
DELETE TEST111;

参数重点说明几个,其他就不实验了,一一罗列出简单在附录中说明

1、sqlplus 的s 参数(大小写不区分)

大家平时可能没有注意到使用这个参数,这个参数是干什么用的呢,原来-s的这个含义表示silent,将交互动作的提示符给隐藏了。

下面做个实验一看便知。

1
2
3
4
5
6
7
8
9
C:Documents and Settingsfujitsu>sqlplus -s ljb/ljb
select * from ljb_test;
ID1 ID2
---------- ----------
13
exit
C:Documents and Settingsfujitsu>sqlplus ljb/ljb
SQL*Plus: Release10.2.0.1.0- Production on 星期日111514:03:262009
Copyright (c)1982,2005, Oracle. All rights reserved.

连接到:

1
2
3
4
5
6
Oracle Database 10g Enterprise Edition Release10.2.0.1.0- Production
With the Partitioning, OLAP and Data Mining options
SQL> select * from ljb_test;
ID1 ID2
---------- ----------
13

2、set heading off可以将列名去掉

1
2
3
4
C:Documents and Settingsfujitsu>sqlplus -s ljb/ljb
setheading off
select * from ljb_test;
13

具体其他详细参数设置说明,这里我就不一一实验了,理解上面脚本的其他参数设置可以去相关文档搜索。此外还有其他各类参数,有兴趣也可一并研究。

5:edit命令

使用sqlplus重新edit上一次输入的命令时,没反应,可以随便输入东西,退不出来。可是临时文件已经生成了。咋办 ?

edit后默认编辑器是ed,可用def命令查看;退出ed用

1
2
3
.
w
q

改变编辑器:

(1)在 sqlplus 中输入:
DEFINE _EDITOR=vi
缺点是每次进 sqlplus 都得改,比较麻烦。
(2)如果你所用的用户对 $ORACLE_HOME 下的文件有修改权限,可修改 $ORACLE_HOME/sqlplus/admin/glogin.sql ,在最后一行也是加上DEFINE _EDITOR=vi即可,这样 vi 就变成默认编辑器了。

6:sqlplus环境配置

在看Thomas Kyte大师的《Oracle Database 9i/10g/11g编程艺术》的配置环境一节有一个login.sql脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
define _editor=vi
setserveroutput on size1000000
settrimspool on
setlong5000
setlinesize100
setpagesize9999
column plan_plus_exp format a80
column global_name new_value gname
settermout off
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 );
setsqlprompt'&gname> '
settermout on
这样sqlplus的提示符就会显示 用户名@tns服务名>,且做了一些环境的初始设置,书上很明显的意思是应当每次执行sqlplus的时候都会执行这个脚本,但我却没想明白是怎么才会去自动执行这个脚本的,所以每次我都还是手动的带全路径去执行这个login.sql脚本。
今天无意在网上看到了相关内容,一下就明白了

sqlplus 每次启动前,会读login.sql(若有的话) ,glogin.sql

login.sql只对某特定用户生效,它的优先级高于glogin.sql,glogin.sql是全局设置。

所以,同一个环境变量,比如linesize ,glogin.sql 和login.sql 都有设置,则login.sql 中的设置起作用。

glogin.sql 的文件位置固定,在$ORACLE_HOME/sqlplus/admin 下面

login.sql的位置不固定,一般将login.sql放在运行sqlplus 的当前目录(用pwd查看当前目录),即:/home/oralce

于是在glogin.sql中加入了那段脚本,直接在命令行用sqlplus连接数据库,果然自动执行了那段代码,然后将glogin.sql还原,又将login.sql拷贝到cmd窗口的当前目录,直接在命令行用sqlplus连接数据库,果然自动执行了login.sql脚本,再回来看Thomas Kyte大师对这个脚本的描述,终于是彻底明白了。

这样每次登录sqlplus后都会进行一些初始设置,从提示符也能很方便的知道当前连接的是哪个用户,而且连接不同的用户登录后这个提示符还能动态的变,而手动执行这个脚本的话没这个效果,应当是每次登录都会重新读取login.sql这个脚本,所以才会刷新提示符。

参考:

敬彬实验<四> SQLPLUS探讨:

http://blog.sina.com.cn/s/blog_62e437c40100g2jt.html

在linux下使SQLPLUS历史回调功能

http://blog.itpub.net/1708925/viewspace-628494

http://leoguan.blog.51cto.com/816378/632488

sqlplus命令使用大全:

http://sysadm.blog.51cto.com/180447/30802

行云无名:http://blog.csdn.net/buffoon/article/details/422372

大牛博客:http://www.cnblogs.com/lds85930/archive/2008/07/07/1237526.html

david dai(常用命令总结) :http://blog.csdn.net/tianlesoftware/article/details/5040984

还不算晕(sqlplus常用命令):http://blog.csdn.net/haibusuanyun/article/details/11180137

网站:

http://www.sql-plus.com/

http://ss64.com/ora/syntax-sqlplus.html

图书:

Oracle_SQLPlus_The_Definitive_Guide_2nd_Edition

Oracle官方文档:

http://docs.oracle.com/cd/E11882_01/server.112/e16604/toc.htm

http://www.orafaq.com/wiki/SQL*Plus

SQL*Plus User's Guide and Reference

本文出自 “从运维到ETL” 博客,请务必保留此出处http://fuwenchao.blog.51cto.com/6008712/1363400

免责声明:文章转载自《转:sqlplus使用总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇docker配置修改阿里云镜像仓库天猫魔盒TMB100C短接刷机教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

带你由浅入深探索webpack4(一)

 相信你或多或少也听说过webpack、gulp等这些前端构建工具。近年来webpack越来越火,可以说成为了前端开发者必备的工具。如果你有接触过vue或者react项目,我想你应该对它有所了解。 这几天我重新整理了一下webpack中知识点,把一些常用到的总结出来,希望能帮助到大家以及加深自己对webpack的理解。 (由于我在写这篇文章的时候webpa...

快速抽取Oracle数据到Mongo

以下是本人从oralce抽取数据到Mongol的方法,也没来得及整理,基本使用方法都是复制其他博主的,希望对大家有用。 step1 利用sqluldr2快速导出CSV格式数据 Oracle使用sqluldr2原创乘风晓栈 最后发布于2018-11-01 15:55:01 阅读数 9260 收藏展开分三部分: 1 . sqluldr2简介与使用 2 . sq...

SQL 存储过程入门(事务)(四)

SQL 存储过程入门(事务)(四)  本篇我们来讲一下事务处理技术。 为什么要使用事务呢,事务有什么用呢,举个例子。 假设我们现在有个业务,当做成功某件事情的时候要向2张表中插入数据,A表,B表,我们插入的顺序是先插入A,再插入B表,如果都顺利插入成功了,当然没有问题,如果任意一张表插入失败了,而另一张表插入成功了,插入成功的表就是垃圾数据了。我们要判断...

EF里一对一、一对多、多对多关系的配置和级联删除

原文:EF里一对一、一对多、多对多关系的配置和级联删除 本章节开始了解EF的各种关系。如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解。 I.实体间一对一的关系 添加一个PersonPhoto类,表示用户照片类 /// <summary> ///用户照片类 /// </summary>...

Webpack的使用

webpack的使用 在项目中安装和配置webpack 1、运行npm install webpack webpack-cli -D命令 安装webpack相关的包 2、在项目的根目录中,创建webpack.config.js的webpack 配置文件 3、在webpack 的配置文件中初始化如下基本配置  module.exports={     mod...

B14-iOS开发中的几种存储方式

一、NSUserDefault(偏好设置,Preference) 小规模数据,弱业务相关数据使用。例:某个UISwitch的状态。 二、File(文件存储) 文件存储包括了Plist、archive、Stream等方式,一般结构化的数据或者需要方便查询的数据,都会以Plist的方式去持久化。 Archive方式适合存储平时不太经常使用但很大量的数据,或者读...