HelloDBA [English]
搜索Internet 搜索 HelloDBABA
  Oracle技术站。email: fuyuncat@gmail.com  MSN: fuyuncat@hotmail.com   acoug  acoug 

Oracle 10g新特性——SQL*Plus

[English]

作者: fuyuncat

来源: www.HelloDBA.com

日期: 2006-04-07 14:47:07

分享到  新浪微博 腾讯微博 人人网 i贴吧 开心网 豆瓣 淘宝 推特 Facebook GMail Blogger Orkut Google Bookmarks

Oracle 10G中,SQL Plus这一小小而又强大的DBA工具已经得到了显著的改进,包十分有用的提示和高级文件操作。

SQLPlus的改进

哪个工具是DBA每天最常用的?除了很多DBA使用图形界面的工具外,使用最多的就是SQL Plus这个命令行方式的工具了。

尽管在oracle 10G中由于企业管理器的大大增强可能使SQL Plus的地位有所改变,但这个普遍使用的小工具仍然被保留下来了——它对于初学者和有经验的DBA都适用。我们下面将会探讨一下SQL*Plus 10.1.0.2中一些有用的新特性。但是你必须要有随Oracle 10G软件安装的SQL Plus,而不能使用9i客户端连接10G服务器的9iSQL Plus

提示

我当前是以哪个用户登录的?当前身份是什么?在长时间使用9isqlplus后,很多DBA会犯这种“迷糊”。你需要通过查询语句来解决这些迷惑。在10gsqlplus中,你可以通过设置在SQL>提示标识中增加这些信息了:

SQL> set sqlprompt "_user _privilege> "

通过以上设置,你的sqlplus提示标识就成了以下格式了:

SYS AS SYSDBA>

这就表明当前的登录帐号SYS,身份是SYSDBA。请注意在上面语句中使用了两个特殊的预定义道德变量:_user_privilege,分别定义了当前用户和这个用户的登录

身份(权限)。现在我们再增加一些其他内容。比如我除了想知道以上信息外,还想知道当前的登录时间:

SQL> set sqlprompt "_user _privilege on _date>"

SYS AS SYSDBA on 31-8 -05>

再增加一个连接信息看,这样就可以指出你登录的是哪个服务器的:

SQL>set sqlprompt "_user on _date at _connect_identifier>"

SYS on 31-8 -05 at teng>

但是前面的当前时间信息只有日期,如果需要精确到当前的确切时间呢:

SYS on 31-8 -05 at teng>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

会话已更改。

SYS on 2005-08-31 16:20:15 at teng>

你只要将上面的内容存在$ORACLE_HOME/sqlplus/glogin.sql中,那每次登录的提示信息都是你所需要的了。

不再需要双引号

自从internal的登录方式在9i当中不再被支持后,很多DBA就抱怨:如何可以不输入sys用户的密码来维护系统的安全?答案就是在操作系统提示符下用双引号的方法进入:

$sqlplus “/as sysdba

需要多输一对双引号也引起了不少抱怨。而在10g当中你就无需再输入双引号了:

$sqlplus / as sysdba

增强的文件管理性

9i中,当你在sqlplus进行操作时,你会希望将一些有用的语句存下来以便以后使用,这时你可以使用save命令。Save命令会将从最后一次执行save开始以后的所有脚本存下来,这样就会将你执行过的脚本存成分散的文件。如:

SQL> select 1 ...

SQL> save 1

Created file 1.sql

SQL> select 2 ...

SQL> save 2

Created file 2.sql

SQL> select 3 ...

SQL> save 3

Created file 3.sql

这样存下来1.sql2.sql3.slq三个脚本,三个脚本的内容分别为select 1 …、select 2 …、select 3 …。这样的话你就需要手工将他们再合成一个脚本以便以后使用。

sqlplus 10.1.0.2中,就不需要这么费劲了,你可以用添加的方式存储:

SQL> select 1 ...

SQL> save myscript

Created file myscript.sql

SQL> select 2 ...

SQL> save myscript append

Append file myscript sql

SQL> select 3 ...

SQL> save myscript append

Append file myscript.sql

这样,所有的脚本都被存储在myscript.sql这个脚本中了。

这一特性对于spool同样适用。在9i中,输入spool res后,如果当前目录下不存在res.lst这个文件,就会创建它,如果已经存在,就会直接覆盖(不会给任何提示),然后将以后直到spool off的所有sqlplus上的信息存储在res.lst中。这样的话,如果原先有一个很重要的res.lst文件可能就无法恢复了。

10g中,spool命令可以向已经存在的文件中添加内容:

SQL> spool res append

如果忽略掉append子句就和9i中一样,会将已有文件覆盖,或者将append换为replace也会覆盖。而如果使用create子句就会先检查文件是否存在,如果存在,就会报错:

SYS on 2005-08-31 17:25:46 at teng>spool abc create

SP2-0771: 文件 "abc.LST" 已存在。

请使用其它名称或 "SPOOL filename[.ext] REPLACE"

Login.sql

每次登录sqlplus时,会先执行$ORACLE_HOME/sqlplus/glogin.sql或者当前目录的login.sql脚本。但是,会存在各种各样的限制。在9i或以下版本里,假如你的脚本里有如下内容:

set sqlprompt "_connect_identifier >"

当第一次启动并连接到数据库DB1时,提示信息为:

DB1>

然后再连接到另外一个数据库上:

DB1> connect scott/tiger@db2

connected

DB1>

尽管连到了DB2,但提示信息还是DB1。说明这个提示有问题。其实原因很简单,login.sql只是在第一次启动sqlplus时执行,而在每次重新连接时不会执行。所以提示信息没有变。

10g中,这种限制没有了。脚本不仅在启动sqlplus时执行,还会在每次连接数据库时也会执行:

DB1> connect scott/tiger@db2

connected

DB2>

这样信息就是正确了。

使用原先版本的sqlplus

如果你出于某些原因不想使用这种增强过的sqlplus该怎么办呢?很简单,只要在运行sqlplus时加上-c的选项就可以了:

sqlplus –c 9.2

这样sqlplus的环境就和9.2版本的是一样的了。

轻松使用dual

有多少人经常使用例如以下的语句:

select USER into <some variable> from DUAL

也许有很多。每次调用DUAL都会产生逻辑IO,而这些逻辑IO都可以被数据库避免的。在一些情况下,调用DUAL是为了能达到像“<somevariable> := USER”这样的效果。因为Oracle代码将DUAL看作一张特殊的表,因此一些用于优化普通表的方法可能对它无效。

10g中,这些担心都不存在了。因为DUAL是一张特殊的表,通过设定10046跟踪事件,consistent gets在相当程度上被降低了,查询计划也不一样了。

9i中:

Rows     Execution Plan

-------  ---------------------------------------------------

      0  SELECT STATEMENT   GOAL: CHOOSE

      1   TABLE ACCESS (FULL) OF 'DUAL'

10G中:

Rows     Execution Plan

-------  ---------------------------------------------------

      0  SELECT STATEMENT   MODE: ALL_ROWS

      0   FAST DUAL

请注意10g中这个新的查询计划:“FAST DUAL”,与9i中的“TABLE ACCESS (FULL) OF 'DUAL'”完全相反。这一改进显著的降低了“consistent reads”,使频繁用到了DUAL表的应用效率更高。

 

Top

Copyright ©2005,HelloDBA.Com 保留一切权利

申明
by fuyuncat