现在的位置: 首页 > 综合 > 正文

SQL*PLUS使用总结

2018年05月11日 ⁄ 综合 ⁄ 共 7244字 ⁄ 字号 评论关闭

sqlplus {<username>[/<password>][@<connect_identifier>] | / } [AS {SYSDBA | SYSOPER | SYSASM}] [EDITION=value]
- 直接输入sqlplus并回车就是启动SQL*PLUS,输入user及password将使用户登陆到缺省的数据库。
- 运行sqlplus user/password@SERVICE_NAME 将连接到指定的数据库。远程登录:sqlplus
user/password@host:1521/service_name

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

使用SQL*PLUS登陆时,SQL*PLUS会按照如下的顺序读取并执行脚本:
· $oracle_home/sqlplus/admin/glogin.sql
· 当前目录下的login.sql,或者设置一个环境变量SQLPATH(Windows下面通过注册表)来指定一个目录
http://blog.csdn.net/fw0124/article/details/6898649


1.在sql*plus中连接到指定的数据库
CONNECT user_name/password[@connect_identifier]

2.察看帮助 help [topic]
tony@ORA11GR2> help column

3.察看对象定义 DESC
tony@ORA11GR2> desc emp;
tony@ORA11GR2> desc dbms_output

4.将屏幕显示的内容输出到指定文件 SPOOL [OFF]
tony@ORA11GR2> spool emp
tony@ORA11GR2> select * from emp where rownum < 2;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- ------------ ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
tony@ORA11GR2> spool off
在屏幕上的所有内容都输出到文件emp.lst中。
只有关闭spool输出,才会在输出文件中看到输出的内容。

5.执行一个存储过程 EXECUTE procedure_name

6.执行一个脚本 start 或者 @
tony@ORA11GR2> @test.sql
tony@ORA11GR2> start test.sql
*@在最前面代表运行sql脚本。
*@在中间代表$ORACLE_SID
*?代表$ORACLE_HOME, 例如:@?\RDBMS\ADMIN\awrrpt.sql

7.SET命令设置系统变量 SET system_variable value
1)设置当前session是否自动提交 SET AUTO[COMMIT] {OFF|ON|IMM[EDIATE]|n}

2)是否显示DBMS_OUTPUT.PUT_LINE输出的信息 SET SERVEROUT[PUT] {ON|OFF}
默认为OFF。

3)执行sql脚本时是否显示脚本中正在执行的SQL语句 SET ECHO {OFF|ON}

4)是否显示当前sql语句查询或修改的行数 SET FEED[BACK] {6|n|ON|OFF}
默认只有结果大于6行时才显示结果的行数。
如果设为1 ,则不管查询到多少行都返回。

5)是否显示列标题 HEA[DING] {ON|OFF}

6)设置一行可以容纳的字符数 LIN[ESIZE] {80|n}

7)一行输出大于LINESIZE时显示是是否截取 WRA[P] {ON|OFF}
设置为ON时,超出LINESIZE的字符会另起一行显示,否则,会将输出行的多于字符切除,不予显示。

8)设置一页有多少行数 PAGES[IZE] {24|n}
如果设为0,则所有的输出内容为一页并且不显示列标题

9)设置页与页之间的空行 NEWP[AGE] {1|n|NONE}
默认为1行。设置为NONE时,会在页和页之间没有任何间隔。

10)显示时用text代替NULL值 NULL text

11)是否在屏幕上显示输出的内容 TERM[OUT] {ON|OFF}
和SPOOL结合使用。使用SPOOL命令的时候,默认SQL的执行结果也会输出到屏幕上。
如果设置为OFF,输出的内容只会保存在输出文件中。

12)将输出中每行后面多余的空格去掉 TRIM[OUT] {ON|OFF}

13)将SPOOL输出中每行后面多余的空格去掉 TRIMS[POOL] {OFF|ON}

14)显示每个sql语句花费的执行时间 TIMING {ON|OFF}

15)设置列的分隔符SET COLSEP { ” ” | text}

8.设置每个报表的顶部标题 TTI[TLE] [printspec [text|variable] ...] | [OFF|ON]
设置每个报表的尾部标题 BTI[TLE] [printspec [text|variable] ...] | [OFF|ON]

9.显示系统变量的值 SHO[W] option
1) show all 显示所有环境变量的值
2) show error 显示当前在创建函数、存储过程、触发器、包等对象的错误信息
3) show PARAMETERS [parameter_name] 显示初始化参数的值
4) show REL[EASE]  显示数据库的版本
5) show user 显示当前的用户名
6) show colsep 显示列的分隔符

10. 格式化列的显示 COL[UMN] [{ column|expr} [ option ...]]
1)改变列的显示宽度 FOR[MAT] format
tony@ORA11GR2> column ENAME format a40

2)格式化NUMBER类型列的显示
tony@ORA11GR2> column SAL format $9999.99
tony@ORA11GR2> select SAL from emp where rownum < 2;
SAL
---------
$800.00

3)改变列标题 COLUMN column_name HEADING column_heading
tony@ORA11GR2> column ENAME heading 'EMPLOYEE NAME'
tony@ORA11GR2> column ENAME heading 'EMPLOYEE|NAME'
(EMPLOYEE和Name显示到2行上)

4)设置列标题的对齐方式 JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
NUMBER类型的列,缺省右对齐,其它类型缺省左对齐
SQL> col ename justify center

5)控制列是否显示 NOPRI[NT]|PRI[NT]
tony@ORA11GR2> column ENAME noprint
tony@ORA11GR2> column ENAME print

6)列为NULL,替代显示值  NUL[L] text
tony@ORA11GR2> column COMM null 'UNKOWN'

7)设置列的回绕方式 WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
缺省为WRAPPED。
tony@ORA11GR2> column TEXT format a5
tony@ORA11GR2> select 'AAA BBB CCC' text from dual;
TEXT
-----
AAA B
BB CC
C
tony@ORA11GR2> column TEXT WORD_WRAPPED
tony@ORA11GR2> select 'AAA BBB CCC' text from dual;
TEXT
-----
AAA
BBB
CCC
tony@ORA11GR2> column TEXT TRUNCATED
tony@ORA11GR2> select 'AAA BBB CCC' text from dual;
TEXT
-----
AAA B

8)显示列的当前所有的显示属性设置 COLUMN column_name

9)将所有列的显示属性设为缺省值 CLEAR COLUMNS

11. 重新运行SQL Buffer中的内容 run或者/
tony@ORA11GR2> /

12. 对SQL Buffer进行编辑
1)打开编辑器进行编辑
tony@ORA11GR2> define _editor=vi
tony@ORA11GR2> edit
2)显示SQL Buffer中的sql语句 L[IST]
   LIST n显示第n行并使第n行成为当前行。或者直接输入n。
3)修改当前行中第一个出现的字符串 C[HANGE] /old_value/new_value
4)在当前行下面加一行或多行 I[NPUT]
5)将指定的文本加到当前行后面 A[PPEND]
6)将SQL Buffer中的语句保存到一个文件中 SAVE file_name
7)从文件中导入语句到SQL Buffer中 GET file_name

13.执行操作系统命令 HOST command
可以使用!命令暂时退出SQL*PLUS,到操作系统命令提示符下执行命令,最后用exit命令返回到SQL*PLUS中。

14.在脚本中添加注释 REMARK [text]

15.将指定的信息或一个空行输出到屏幕上 PROMPT [text]

16.暂停等待用户回车后继续执行 PAUSE [text]

17.使用Query语句将一个数据库中的一些数据拷贝到另外一个数据库的一个表格中
COPY {FROM database | TO database | FROM database TO database}
           {APPEND|CREATE|INSERT|REPLACE} destination_table
           [(column, column, column, ...)] USING query

18.WHENEVER语句
sqlplus -S /nolog <<EOF 1>>${LOGFILE} 2>&1
    WHENEVER SQLERROR EXIT SQL.SQLCODE
    conn user/password
    ...
EOF
echo $?

19.替换变量
使用替换变量可以和用户交互,在运行SQL命令时提示用户输入替换数据,然后按输入数据运行SQL命令。
1)&variable
生命周期为单次引用中,不需要声明,如果替换字符或日期类型,最好用单引号扩起,例如
tony@ORA11GR2> select * from emp where ename='&1';
输入 1 的值: JONES
原值 1: select * from emp where ename='&1'
新值 1: select * from emp where ename='JONES'

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- ---------- ---------- -------------- ---------- ---------- ----------
7566 JONES MANAGER 7839 02-4月 -81 2975 20

2)SET VER[IFY] {ON|OFF}
打开/关闭变量替换确认。
如果设置为OFF,就不会上面的原值,新值两行。

3)&&variable
生命周期为整个会话,不需要声明。例如
tony@ORA11GR2> set verify off
tony@ORA11GR2> select * from emp where ename='&&employee_name';
输入 employee_name 的值: JONES

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- ---------- ---------- -------------- ---------- ---------- ----------
7566 JONES MANAGER 7839 02-4月 -81 2975 20

tony@ORA11GR2> select count(*) from emp where ename='&&employee_name';

COUNT(*)
----------
1

4)DEF[INE] [variable] | [variable = text]
生命周期为整个会话,预先声明,使用时用&variable来引用声明的变量。
输入DEFINE查看当前会话中所有的替换变量的值,包括上面使用&&声明的变量。
输入DEFINE variable查看替换变量variable的值。
UNDEF[INE] variable命令可以清除变量。
例如,
tony@ORA11GR2> define department_no=20
tony@ORA11GR2> select count(*) from emp where deptno=&department_no;

COUNT(*)
----------
5

5) ACCEPT variable
ACC[EPT] variable [NUM[BER] | CHAR | DATE | BINARY_FLOAT | BINARY_DOUBLE]
[FOR[MAT] format] [DEF[AULT] default] [PROMPT text | NOPR[OMPT]] [HIDE]
生命周期为整个会话,预先声明,使用时用&引用声明的变量。
FORMAT:指定格式
DEFAULT:默认值,如果用户直接回车则使用此默认值
PROMPT:输出提示信息
HIDE选项:隐藏用户的输入,例如输入密码
例如,创建test.sql脚本,内容如下

set serveroutput on
set verify off
set feedback off
set echo off
accept salary number format 9999.99 default 1000.00 prompt 'Please enter the salary[1000.00]:'

declare
	cnt int;
begin
	select count(*) into cnt from emp where sal < &salary;
	dbms_output.put_line(cnt);
end;
/

然后执行
tony@ORA11GR2> @test.sql
Please enter the salary[1000.00]:1200
3
tony@ORA11GR2>

*结合使用spool输出,在SQL脚本开始可以添加如下语句
set echo off
set feedback off
set pagesize 9999
set linesize 9999
set trimspool on
set trimout on
set verify off
set timing off
set autotrace off
set termout off

20.启动/关闭数据库

STARTUP
1) STARTUP NOMOUNT
仅仅通过初始化文件,分配出SGA区,启动数据库后台进程,
没有打开控制文件和数据文件,不能任何访问数据库。
在以下几种情况下需要用到这种模式:
A:数据库的控制文件全部损害
B:需要创建数据库的控制文件和创建一个新的数据库时。

2) STARTUP MOUNT
MOUNT数据库,仅仅给DBA进行管理操作,不允许数据库的用户访问。
仅仅只是当前实例的控制文件被打开,确认数据文件和联机日志文件的位置,
但此时不对数据文件和日志文件进行一致性,正确性等校验检查,数据文件未打开。
这种方式启动下可执行:
数据库日志归档、
数据库介质恢复、
使数据文件联机或脱机,
重新定位数据文件、重做日志文件。

3) STARTUP OPEN
STARTUP缺省的参数就是OPEN,OPEN可以省略。
打开数据库,允许数据库的访问。
当前实例的控制文件中所描述的所有文件都已经打开。
等于以下三个命令:
startup nomount;
alter database mount;
alter database open;

4) STARTUP PFILE='filename'
以filename为初始化文件启动数据库,不是采用缺省初始化SPFILE。

5) STARTUP FORCE
中止当前数据库的运行,并开始重新正常的启动数据库。
等同于shutdown abort + startup

6) STARTUP RESTRICT
启动数据库,但是只允许具有RESTRICTED SESSION权限的用户(如sys用户)访问数据库。

7) STARTUP RECOVER
数据库启动,并开始介质恢复。

*如果一台server上安装了多个实例,startup的时候可以按照以下步骤启动指定实例。
1) set ORACLE_SID=<SID>(unix下export ORACLE_SSID=<SID>)
2) sqlplus / as sysdba登陆到一个空闲实例。
3) startup

SHUTDOWN
1) SHUTDOWN NORMAL
缺省不带任何参数时表示是NORMAL。
不允许新的连接、等待会话结束、等待事务结束、做一个检查点并关闭数据文件。
启动时不需要实例恢复。

2) SHUTDOWN TRANSACTIONAL
不允许新的连接、不等待会话结束、等待事务结束、做一个检查点并关闭数据文件。
启动时不需要实例恢复。

3) SHUTDOWN IMMEDIATE
不允许新的连接、不等待会话结束、不等待事务结束、做一个检查点并关闭数据文件。
没有结束的事务是自动rollback的。启动时不需要实例恢复。

4) SHUTDOWN ABORT
不允许新的连接、不等待会话结束、不等待事务结束、不做检查点且没有关闭数据文件。
启动时自动进行实例恢复。

21. 切换当前schema
alter session set current_schema=userxxx

22. 回退键无效
敲回退键后显示^H或者^?
先退出sqlplus,执行如下命令后重新连接
bash-3.00$ stty erase ^?
bash-3.00$ sqlplus / as sysdba

抱歉!评论已关闭.