王朝网络
分享
 
 
 

Oracle 10g 中关于 SQL*Plus 的改进

王朝oracle·作者佚名  2008-05-31
宽屏版  字体: |||超大  

随着 Oracle Database 10g的发布,这个小而强大的 DBA 工具有了一些引人注目的变化,包括有用的提示符和高级文件处理

数据库治理员天天用得最多的工具是哪一个?对于许多象我一样在 GUI 革命之前的数据库治理员而言,一定是 SQL*Plus 命令行选件。

虽然随着强大和功能丰富的 Enterprise Manager 10g 的引入,SQL*Plus 在 Oracle Database 10g 中已经发生了一些变化,但这个普遍存在的小工具仍将继续作为 Oracle 原有系统的一部分 — 对初学者和经验丰富的数据库治理员同样适用。

在本部分中,我们将研究对 SQL*Plus 10.1.0.2 所作的一些非常有用的改进。切记,要继续下面的操作,您将需要 Oracle Database 10g 软件的 sqlplus 可执行程序,而不是运行在 10g 数据库上的 Oracle9i Database sqlpuls。

为粗心用户提供的提示符

我在哪里,或我是谁?不,这不是对您精神的拷问;这是关于用户在 SQL*Plus 环境的上下文中位于何处的问题。SQL*Plus 中的默认提示符 — 简单的 SQL — 不指出用户是谁,以及用户作为什么连接。在早期的版本中,您必须进行一些麻烦的编码来获取变量,但现在不再需要这样了。在 SQL*Plus 10.1.0.2 中,您可以使用:

set sqlprompt "_user _privilege "

SQL*Plus 提示符显示为

SYS AS SYSDBA

当然,假定用户 SYS 是作为 SYSDBA 登录的。注重两个预先定义的非凡变量 — _user 和 _privilege — 的使用,它们定义了当前的用户和登录的权限。

让我们再增加一些其它的功能:现在还想显示今天的日期。我们需要做的就是用下面这些命令来使提示符显示想得到的信息。

SQL set sqlprompt "_user _privilege 'on' _date "

SYS AS SYSDBA on 06-JAN-04

再增加数据库连接标识符怎么样?您想知道您在“什么样”(在生产或开发中)的情况下,这种方法的确非常有帮助。

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

ANANDA on 06-JAN-04 at SMILEY

到目前为止还不错;但我们可能想要以一种更具体的方式来显示当前的日期(带小时和分钟),以更加有用。

ANANDA on 06-JAN-04 at SMILEY alter session set nls_date_format = 'mm/dd/yyyy hh24:mi:ss';

Session altered.

ANANDA on 01/06/2004 13:03:51 at SMILEY

问题解决了:输入几行命令就得到了能够提供丰富信息的 SQL 提示符。将它保存在 glogin.sql 文件中,您就始终拥有这些特性。

必须使用引号吗?为什么,不!

在 Oracle9i 中取消了对内部登录的支持之后,全世界许多 DBA 表示反对:他们应当如何在命令行上输入 SYS 的口令并保持安全性?嗯,答案是在操作系统提示符中使用引号:

sqlplus "/ as sysdba"

引号的使用令人遗憾,但还是被大家所接受(虽然有些怨言)。在 Oracle Database 10g 中不需要这样了。现在您可以在 OS 命令提示符下,输入以下命令,不需要引号

sqlplus / as sysdba

作为 SYSDBA 登录。这种改进不仅意味着您少输了两个字符,还有一些额外的好处,例如在 Unix 之类的操作系统中不需要 escape 字符。

改进的文件处理

假设您在处理一个问题,并使用了一些自由格式的即席 SQL 语句。很明显,它们很有用,您想把它们保存起来,以便将来使用。您会怎么做?您就可以把它们保存在各个文件中,如下所示:

select something1 ....

save 1

select something else ....

save 2

select yet another thing ....

save 3

等等。一段时间以后,您需要收集所有保存的文件,以便将来使用。多麻烦!SQL*Plus 10.1.0.2 答应您将语句添加到文件中,进行保存。在前一个例子中,您可以使用:

select something1 ....

save myscripts

select something else ....

save myscripts append

select yet another thing ....

save myscripts append

等等。

所有的语句将添加到文件 myscripts.sql 中,从而不再需要保存在单独的文件中,然后把它们连接成单个文件。

这种方法还适用于假脱机。在以前的版本中,命令 SPOOL RESULT.LST 将创建文件 result.lst (假如该文件不存在);但假如该文件已存在,则将覆盖它,而没有提示。这种行为经常(非凡在复杂环境下)可能导致不希望的边缘效应,例如重要的输出文件被覆盖。在 10g 中,spool 命令可以使文件内容附加在一个现有的文件后面:

spool result.lst append

假如您想覆盖它,那么该怎么做?简单地省略 append 子句,或使用默认值 REPLACE。以下命令将在写操作之前检查文件是否存在。

spool result.lst create

Use another name or "SPOOL filename[.ext] REPLACE"

这种方法防止覆盖文件 result.lst。

Login.sql 是用于登录的,是吗?

记得文件 login.sql 和 glogin.sql 吗?本来在任何时候当调用 SQL*Plus 时,都将运行当前目录中的 login.sql 文件。但是,有一个严重的局限。在 Oracle9i 和更低版本中,假定在文件中有下面这一行。

set sqlprompt "_connect_identifier "

当您首先启动 SQL*Plus 与数据库 DB1 连接时,提示符显示:

DB1

现在,假如您从提示符中与另一个数据库 DB2 连接:

DB1 connect scott/tiger@db2

Connected

DB1

注重提示符。虽然您现在和 DB2 连接在一起,但提示符仍是 DB1,。很明显,提示符是不正确的。原因很简单:在连接时没有执行 login.sql 文件,只在 SQL*Plus 启动时执行了该文件。后来的连接没有重新执行该文件,使得提示符没有改变。

在 Oracle Database 10g 中,消除了该局限。文件 login.sql 不仅在 SQL*Plus 启动时执行,而且在连接时也执行。因此在 10g 中,假如您当前与数据库 DB1 连接,后来改变了连接,则提示符将改变。

SCOTT at DB1 connect scott/tiger@db2

SCOTT at DB2 connect john/meow@db3

JOHN at DB3

假如由于某些原因,您不想使用这些增强的 SQL*Plus,那该怎么办?很简单,用 -c 选项来调用它:

sqlplus -c 9.2

SQL*Plus 环境将和旧的 9.2 版一样运转。

自由地使用 DUAL

您认为有多少开发人员(还有 DBA)经常使用这条命令?

select USER intofrom DUAL

可能非常多。对 DUAL 的每次调用创建逻辑 I/O — 数据库没有逻辑 I/O 也可以工作。在某些情况下必须调用 DUAL,如在行 := USER 中。因为 Oracle 代码将 DUAL 当作一个专用的表,所以调整表的某些想法可能不适用或不贴切。

Oracle Database 10g 使得所有这些担心完全消失了:因为 DUAL 是一个专用的表,所以持续获得显著地减少了,并且与从事件 10046 跟踪中看到的优化计划不同。

在 Oracle9i 中

Rows Execution Plan

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

0SELECT STATEMENT GOAL:CHOOSE

1 TABLE Access (FULL) OF 'DUAL'

在 10g 中

Rows Execution Plan

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

0SELECT STATEMENT MODE:ALL_ROWS

0 FAST DUAL

注重新的 FAST DUAL 优化计划的使用,与 Oracle9i 中的 DUAL 的 FULL TABLE SCAN 相反。这一改进显著地减少了持续读取,从而为频繁使用 DUAL 表的应用程序带来好处。

注重:从技术角度看,这些 DUAL 改进是在 SQL 优化器中实施的,但是,对许多用户而言,SQL*Plus 是用于处理 SQL 的主要工具。

其它有用的信息

其它的 SQL*Plus 增强在本系列的其它地方进行了说明。例如,我在第 5 周关于闪回表的内容中说明了 RECYCLEBIN 的概念。

与一些流传甚广的传言相反,COPY 命令仍然可用,虽然将在以后的版本中废除。(嗯……,我们不是在 Oracle9i 中就听到这个消息了吗?)假如您有使用这条命令编写的脚本,别沮丧,它不仅可用而且仍被支持。实际上,只错误消息报告方面作了一点改进。假如表有一个 LONG 列,则 COPY 是您创建表的备份的唯一方式,常见的 Create Table As Select 将不能处理带 long 数据类型的列的表。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有