 |
|
 |
|
 |
| Oracle 10G 新特性——SQL*PLUS的改进(2) |
来源: www.ixdba.net 
作者: IXDBA.NET官方
时间:2006-09-28 阅读:20
|
|
本文章共3303字,分3页,当前第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命令可以向已经存在的文件中添加内容: IXDBA.NET技术社区
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
------- ---------------------------------------------------
阅读更多内容:<<上一页 · 1 · 2 · 3 · 下一页>>
|
|
|
|
| |
|
|
|
| | |
|