基于Oracle的国土资源基础数据组织方法

时间:2023-02-21 03:57:33 作者:Kaspar 综合材料 收藏本文 下载本文

【导语】“Kaspar”通过精心收集,向本站投稿了8篇基于Oracle的国土资源基础数据组织方法,以下是小编精心整理后的基于Oracle的国土资源基础数据组织方法,供大家阅读参考。

篇1:基于Oracle的国土资源基础数据组织方法

基于Oracle的国土资源基础数据组织方法

Oracle数据库管理系统已成为我国国家级和省级国土资源基础数据库建设的主流技术平台.该文就国家级和省级数据库的建设,提出了在Oracle数据库技术环境下,如何在物理上合理组织和布局各种类型的数据,如何设置和管理各衍生数据,如何实施数据完整性要求,其目的是实现国土资源基础数据的'高效管理和可持续更新支持,更好地满足国土资源基础数据库之上各业务应用系统运转的要求.

作 者:史辉 冯永玉 张妍 张洪林 SHI Hui FENG Yong-yu ZHANG Yan ZHANG Hong-lin  作者单位:山东省国土资源信息中心,山东,济南,250014 刊 名:山东国土资源 英文刊名:LAND AND RESOURCES IN SHANGDONG PROVINCE 年,卷(期):2009 25(2) 分类号:P208 关键词:数据库物理设计   数据分区   国土资源管理  

篇2:国土资源基础数据体系建设初探

国土资源基础数据体系建设初探

随着国土资源信息化程度提高,国土资源数据库建设和应用的过程中出现了各种具体的问题,如数据库应用集成整合难度大、数据共享困难等,因此,需要对国土资源数据库建设进行统筹规划,建立完善的'国土资源数据体系.本文通过分析各类国土资源数据之间的关系和对数据进行系统分类,提出国土资源数据体系建设的基本架构和主要内容.

作 者:郭利华  作者单位:湖南省国土资源信息中心,湖南,长沙,410004 刊 名:国土资源导刊 英文刊名:LAND & RESOURCES HERALD 年,卷(期):2009 6(8) 分类号:P2 关键词:数据体系   标准体系   应用体系   数据中心   关键技术  

篇3:Python导入oracle数据的方法

作者:Sephiroth 字体:[增加 减小] 类型:转载

import cx_Oracle dns_tns=cx_Oracle.makedsn(“192.168.0.288”,1521,“skynet”) print dns_tns con = cx_Oracle.connect(‘alibaba‘, ‘zhimakamen‘, dns_tns) cur=con.cursor for index,line in enumerate(file(“f2.csv”)): sql=“”“insert into iq_data_B011F8286A1B2000A (field1,field2,field3,field4) values (”“” for fields in (line.split(“,”)): sql=sql+“‘”+fields+“‘,” cur.execute(sql[:-1]+“)”) con.commit() con.close()

希望本文所述对大家的Python程序设计有所帮助,

篇4:Oracle大批量删除数据方法数据库

批量删除海量数据通常都是很复杂及缓慢的,方法也很多,但是通常的概念是:分批删除,逐次提交, 下面是删除过程,数据表可以通过主键删除, 测试 过Delete和For all两种方法,for all在这里并没有带来 性能 提高,所以仍然选择了批量直接删除。 首先创建一下

批量删除海量数据通常都是很复杂及缓慢的,方法也很多,但是通常的概念是:分批删除,逐次提交。

下面是删除过程,数据表可以通过主键删除,测试过Delete和For all两种方法,for all在这里并没有带来性能提高,所以仍然选择了批量直接删除。

首先创建一下过程,使用自制事务进行处理:

create or replace procedure delBigTab

(

p_TableName in varchar2,

p_Condition in varchar2,

p_Count in varchar2

)

as

pragma autonomous_transaction;

n_delete number:=0;

begin

while 1=1 loop

EXECUTE IMMEDIATE

'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn'

USING p_Count;

if SQL%NOTFOUND then

exit;

else

n_delete:=n_delete + SQL%ROWCOUNT;

end if;

commit;

end loop;

commit;

DBMS_OUTPUT.PUT_LINE('Finished!');

DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!');

end;

以下是删除过程及时间:

SQL>create or replace procedure delBigTab

2 (

3 p_TableName in varchar2,

4 p_Condition in varchar2,

5 p_Count in varchar2

6 )

7 as

8 pragma autonomous_transaction;

9 n_delete number:=0;

10 begin

11 while 1=1 loop

12 EXECUTE IMMEDIATE

13 'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn'

14 USING p_Count;

15 if SQL%NOTFOUND then

16 exit;

17 else

18 n_delete:=n_delete + SQL%ROWCOUNT;

19 end if;

20 commit;

21 end loop;

22 commit;

23 DBMS_OUTPUT.PUT_LINE('Finished!');

24 DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!');

25 end;

26 /

Procedure created.

SQL>set timing on

SQL>select min(NUMDLFLOGGUID) from HS_DLF_DOWNLOG_HISTORY;

MIN(NUMDLFLOGGUID)

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

11000000

Elapsed: 00:00:00.23

SQL>exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11100000','10000');

PL/SQL procedure suclearcase/“ target=”_blank“ >ccessfully completed.

Elapsed: 00:00:18.54

SQL>select min(NUMDLFLOGGUID) from HS_DLF_DOWNLOG_HISTORY;

MIN(NUMDLFLOGGUID)

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

11100000

Elapsed: 00:00:00.18

SQL>set serveroutput on

SQL>exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11200000','10000');

Finished!

Totally 96936 records deleted!

PL/SQL procedure successfully completed.

Elapsed: 00:00:18.61

10万记录大约19s

SQL>exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11300000','10000');

Finished!

Totally 100000 records deleted!

PL/SQL procedure successfully completed.

Elapsed: 00:00:18.62

SQL>exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11400000','10000');

Finished!

Totally 100000 records deleted!

PL/SQL procedure successfully completed.

Elapsed: 00:00:18.85

SQL>

SQL>exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 13000000','10000');

Finished!

Totally 1000000 records deleted!

PL/SQL procedure successfully completed.

Elapsed: 00:03:13.87

100万记录大约3分钟

SQL>exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 20000000','10000');

Finished!

Totally 6999977 records deleted!

PL/SQL procedure successfully completed.

Elapsed: 00:27:24.69

700万大约27分钟

以上过程仅供参考.

原文转自:www.ltesting.net

篇5:基础地理信息数据更新技术方法

基础地理信息数据更新技术方法

总结了作者所在单位多年来数据生产经验,并结合目前GPS测量技术在数据采集方面的应用,概括了四种更新技术方法及其相应生产流程,总结了各种方法的.特点及适用范围,为基础地理信息数据更新生产技术方法的选取提供参考.

作 者:任娟 周旭斌 陈泽鹏 REN Juan ZHOU Xu-bing CHEN Ze-peng  作者单位:广东省国土资源信息中心,广东,广州,510075 刊 名:北京测绘 英文刊名:BEIJING SURVEYING AND MAPPING 年,卷(期):2009 ”“(1) 分类号:P208 关键词:基础地理信息   数据更新   数字测图   正射影像   缩编   GPS  

篇6:简介Oracle的数据字典

首先,Oracle的字典表和视图基本上可以分为三个层次,

1.1 X$表

这一部分表是Oracle数据库的运行基础,在数据库启动时由Oracle应用程序动态创建。

这部分表对数据库来说至关重要,所以Oracle不允许SYSDBA之外的用户直接访问,显示授权不被允许。

如果显示授权你会收到如下错误:

SQL>grant select on x$ksppi to eygle;grant select on x$ksppi to eygle*ERROR at line 1:ORA-02030: can only select from fixed tables/views

1.2 GV$和V$视图

从Oracle8开始,GV$视图开始被引入,其含义为Global V$.

除了一些特例以外,每个V$视图都有一个对应的GV$视图存在。

GV$视图的产生是为了满足OPS环境的需要,在OPS环境中,查询GV$视图返回所有实例信息,而每个V$视图基于GV$视图,增加了INST_ID列判断后建立,只包含当前连接实例信息。

注意,每个V$视图都包含类似语句:

where inst_id = USERENV(’Instance’)

用于限制返回当前实例信息。

我们从GV$FIXED_TABLE和V$FIXED_TABLE开始

SQL>select view_definition from v_$fixed_view_definition

where view_name=’V$FIXED_TABLE’;

VIEW_DEFINITION

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

select NAME , OBJECT_ID , TYPE , TABLE_NUM from GV$FIXED_TABLE

where inst_id = USERENV(’Instance’)

这里我们看到V$FIXED_TABLE基于GV$FIXED_TABLE创建。

SQL>select view_definition from v_$fixed_view_definition

where view_name=’GV$FIXED_TABLE’;

VIEW_DEFINITION

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

select inst_id,kqftanam, kqftaobj, ’TABLE’, indx from x$kqfta

union all

select inst_id,kqfvinam, kqfviobj, ’VIEW’, 65537 from x$kqfvi

union all

select inst_id,kqfdtnam, kqfdtobj, ’TABLE’, 65537 from x$kqfdt

这样我们找到了GV$FIXED_TABLE视图的创建语句,该视图基于X$表创建。

1.3 GV_$,V_$视图和V$,GV$同义词

这些视图是通过catalog.ql创建,

当catalog.sql运行时:

create or replace view v_$fixed_table as select * from v$fixed_table;

create or replace public synonym v$fixed_table for v_$fixed_table;

create or replace view gv_$fixed_table as select * from gv$fixed_table;

create or replace public synonym gv$fixed_table for gv_$fixed_table;

我们注意到,第一个视图V_$和GV_$首先被创建,v_$和gv_$两个视图。

然后基于V_$视图的同义词被创建。

所以,实际上通常我们访问的V$视图,其实是指向V_$视图的同义词。

而V_$视图是基于真正的V$视图(这个视图是基于X$表建立的)。

而v$fixed_view_definition视图是我们研究Oracle对象关系的一个入口,仔细理解Oracle的数据字典机制,有助于深入了解和学习Oracle数据库知识。

1.4 再进一步

1.4.1 X$表

关于X$表,其创建信息我们也可以从数据字典中一窥究竟。

首先我们考察bootstrap$表,该表中记录了数据库启动的基本及驱动信息。

SQL>select * from bootstrap$;LINE# OBJ# SQL_TEXT-------------------------------------------------------------------1 -1 8.0.0.0.00 0 CREATE ROLLBACK SEGMENT SYSTEM STORAGE ( INITIAL 112K NEXT 1024K MINEXTENTS 1 M8 8 CREATE CLUSTER C_FILE#_BLOCK#(”TS#“ NUMBER,”SEGFILE#“ NUMBER,”SEGBLOCK#“ NUMBER)9 9 CREATE INDEX I_FILE#_BLOCK# ON CLUSTER C_FILE#_BLOCK# PCTFREE 10 INITRANS 2 MAXT14 14 CREATE TABLE SEG$(”FILE#“ NUMBER NOT NULL,”BLOCK#“ NUMBER NOT NULL,”TYPE#“ NUMBE5 5 CREATE TABLE CLU$(”OBJ#“ NUMBER NOT NULL,”DATAOBJ#“ NUMBER,”TS#“ NUMBER NOT NULL6 6 CREATE CLUSTER C_TS#(”TS#“ NUMBER) PCTFREE 10 PCTUSED 40 INITRANS 2 MAXTRANS 2557 7 CREATE INDEX I_TS# ON CLUSTER C_TS# PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE (....

这部分信息,在数据库启动时最先被加载,跟踪数据库的启动过程,我们发现数据库启动的第一个动作就是:

create table bootstrap$ ( line# number not null, obj# number not null, sql_text varchar2(4000) not null) storage (initial 50K objno 56 extents(file 1 block 377))

这部分代码是写在Oracle应用程序中的,在内存中创建了bootstrap$以后,Oracle就可以从file 1,block 377上读取其他信息,创建重要的数据库对象。从而根据这一部分信息启动数据库,这就实现了数据库的引导,类似于操作系统的初始化。 这部分你可以参考biti_rainy的文章。

篇7:ORACLE认证基础:ORACLE系统概述

oracle公司自86年推出版本5开始,系统具有分布数据库处理功能.88年推出版本6,oracle rdbms(v6.0)可带事务处理选项(tpo),提高了事务处理的速度.1992年推出了版本7,在oracle rdbms中可带过程数据库选项(procedural database option)和并行服务器选项(parallel server option),称为oracle7数据库管理系统,它释放了开放的关系型系统的真正潜力。oracle7的协同开发环境提供了新一代集成的软件生命周期开发环境,可用以实现高生产率、大型事务处理及客户/服务器结构的应用系统。协同开发环境具有可移植性,支持多种数据来源、多种图形用户界面及多媒体、多民族语言、case等协同应用系统。

一、 oracle系统

1.oracle产品结构及组成

oracle系统是由以rdbms为核心的一批软件产品构成.

2. oracle系统特点

oracle公司于1979年,首先推出基于sql标准的关系数据库产品,可在100多种硬件平台上运行(所括微机、工作站、小型机、中型机和大型机),支持很多种操作系统。用户的oracle应用可方便地从一种计算机配置移至另一种计算机配置上。oracle的分布式结构可将数据和应用驻留在多台计算机上,而相互间的通信是透明的。1992年6月oracle公司推出的oracle7协同服务器数据库,使关系数据库技术迈上了新台阶。根据idg(国际数据集团)1992年全球unix数据库市场报告,oracle占市场销售量50%。它之所以倍受用户喜爱是因为它有以下突出的特点:

支持大数据库、多用户的高性能的事务处理。oracle支持最大数据库,其大小可到几百千兆,可充分利用硬件设备。支持大量用户同时在同一数据上执行各种数据应用,并使数据争用最小,保证数据一致性。系统维护具有高的性能,oracle每天可连续24小时工作,正常的系统操作(后备或个别计算机系统故障)不会中断数据库的使用。可控制数据库数据的可用性,可在数据库级或在子数据库级上控制。

oracle遵守数据存取语言、操作系统、用户接口和网络通信协议的工业标准。所以它是一个开放系统,保护了用户的投资。美国标准化和技术研究所(nist)对oracle7 server进行检验,100%地与ansi/iso sql89标准的二级相兼容。

实施安全性控制和完整性控制。oracle为限制各监控数据存取提供系统可靠的安全性。oracle实施数据完整性,为可接受的数据指定标准。

支持分布式数据库和分布处理。oracle为了充分利用计算机系统和网络,允许将处理分为数据库服务器和客户应用程序,所有共享的数据管理由数据库管理系统的计算机处理,而运行数据库应用的工作站集中于解释和显示数据。通过网络连接的计算机环境,oracle将存放在多台计算机上的数据组合成一个逻辑数据库,可被全部网络用户存取。分布式系统像集中式数据库一样具有透明性和数据一致性。

具有可移植性、可兼容性和可连接性。由于oracle软件可在许多不同的操作系统上运行,以致oracle上所开发的应用可移植到任何操作系统,只需很少修改或不需修改。oracle软件同工业标准相兼容,包括许多工业标准的操作系统,所开发应用系统可在任何操作系统上运行。可连接性是指oralce允许不同类型的计算机和操作系统通过网络可共享信息。

二、 oracle数据库系统的体系结构

oracle数据库系统为具有管理oracle数据库功能的计算机系统。每一个运行的oracle数据库与一个oracle实例(instance)相联系。一个oracle实例为存取和控制一数据库的软件机制。每一次在数据库服务器上启动一数据库时,称为系统全局区(system global area)的一内存区(简称sga)被分配,有一个或多个oracle进程被启动。该sga 和 oracle进程的结合称为一个oracle数据库实例。一个实例的sga和进程为管理数据库数据、为该数据库一个或多个用户服务而工作。

在oracle系统中,首先是实例启动,然后由实例装配(mount)一数据库。在松耦合系统中,在具有oracle parallel server 选项时,单个数据库可被多个实例装配,即多个实例共享同一物理数据库。

1. oracle实例的进程结构和内存结构

1) 进程结构

进程是操作系统中的一种机制,它可执行一系列的操作步。在有些操作系统中使用作业(job)或任务(task)的术语。一个进程通常有它自己的专用存储区。oracle进程的体系结构设计使性能最大。

oracle实例有两种类型:单进程实例和多进程实例。

单进程oracle(又称单用户oracle)是一种数据库系统,一个进程执行全部oracle代码。由于oracle部分和客户应用程序不能分别以进程执行,所以oracle的代码和用户的数据库应用是单个进程执行。

在单进程环境下的oracle 实例,仅允许一个用户可存取。例如在ms-dos上运行oracle 。

多进程oracle实例(又称多用户oracle)使用多个进程来执行oracle的不同部分,对于每一个连接的用户都有一个进程。

在多进程系统中,进程分为两类:用户进程和oracle进程。当一用户运行一应用程序,如pro*c程序或一个oracle工具(如sql*plus),为用户运行的应用建立一个用户进程。oracle进程又分为两类:服务器进程和后台进程。服务器进程用于处理连接到该实例的用户进程的请求。当应用和oracele是在同一台机器上运行,而不再通过网络,一般将用户进程和它相应的服务器进程组合成单个的进程,可降低系统开销。然而,当应用和oracle运行在不同的机器上时,用户进程经过一个分离服务器进程与oracle通信。它可执行下列任务:

对应用所发出的sql语句进行语法分析和执行。

从磁盘(数据文件)中读入必要的数据块到sga的共享数据库缓冲区(该块不在缓冲区时)。

将结果返回给应用程序处理。

系统为了使性能最好和协调多个用户,在多进程系统中使用一些附加进程,称为后台进程。在许多操作系统中,后台进程是在实例启动时自动地建立。一个oracle实例可以有许多后台进程,但它们不是一直存在。后台进程的名字为:

dbwr  数据库写入程序

lgwr 日志写入程序

ckpt 检查点

smon 系统监控

pmon  进程监控

arch 归档

reco 恢复

lckn 封锁

dnnn 调度进程

snnn 服务器

每个后台进程与oracle数据库的不同部分交互。

下面对后台进程的功能作简单介绍:

dbwr进程:该进程执行将缓冲区写入数据文件,是负责缓冲存储区管理的一个oracle后台进程。当缓冲区中的一缓冲区被修改,它被标志为“弄脏”,dbwr的主要任务是将“弄脏”的缓冲区写入磁盘,使缓冲区保持“干净”。由于缓冲存储区的缓冲区填入数据库或被用户进程弄脏,未用的缓冲区的数目减少。当未用的缓冲区下降到很少,以致用户进程要从磁盘读入块到内存存储区时无法找到未用的缓冲区时,dbwr将管理缓冲存储区,使用户进程总可得到未用的缓冲区。

oracle采用lru(least recently used)算法(最近最少使用算法)保持内存中的数据块是最近使用的,使i/o最小。在下列情况预示dbwr 要将弄脏的缓冲区写入磁盘:

当一个服务器进程将一缓冲区移入“弄脏”表,该弄脏表达到临界长度时,该服务进程将通知dbwr进行写。该临界长度是为参数db-block-write-batch的值的一半。

当一个服务器进程在lru表中查找db-block-max-scan-cnt缓冲区时,没有查到未用的缓冲区,它停止查找并通知dbwr进行写。

出现超时(每次3秒),dbwr 将通知本身。

当出现检查点时,lgwr将通知dbwr

在前两种情况下,dbwr将弄脏表中的块写入磁盘,每次可写的块数由初始化参数db-block-write-batch所指定。如果弄脏表中没有该参数指定块数的缓冲区,dbwr从lur表中查找另外一个弄脏缓冲区。

如果dbwr在三秒内未活动,则出现超时。在这种情况下dbwr对lru表查找指定数目的缓冲区,将所找到任何弄脏缓冲区写入磁盘。每当出现超时,dbwr查找一个新的缓冲区组。每次由dbwr查找的缓冲区的数目是为寝化参数db-block-write-batch的值的二倍。如果数据库空运转,dbwr最终将全部缓冲区存储区写入磁盘。

在出现检查点时,lgwr指定一修改缓冲区表必须写入到磁盘。dbwr将指定的缓冲区写入磁盘。

在有些平台上,一个实例可有多个dbwr。在这样的实例中,一些块可写入一磁盘,另一些块可写入其它磁盘。参数db-writers控制dbwr进程个数。

lgwr进程:该进程将日志缓冲区写入磁盘上的一个日志文件,它是负责管理日志缓冲区的一个oracle后台进程。lgwr进程将自上次写入磁盘以来的全部日志项输出,lgwr输出:

当用户进程提交一事务时写入一个提交记录。

每三秒将日志缓冲区输出。

当日志缓冲区的1/3已满时将日志缓冲区输出。

当dbwr将修改缓冲区写入磁盘时则将日志缓冲区输出。

lgwr进程同步地写入到活动的镜象在线日志文件组。如果组中一个文件被删除或不可用,lgwr 可继续地写入该组的其它文件。

日志缓冲区是一个循环缓冲区。当lgwr将日志缓冲区的日志项写入日志文件后,服务器进程可将新的日志项写入到该日志缓冲区。lgwr 通常写得很快,可确保日志缓冲区总有空间可写入新的日志项。

注意:有时候当需要更多的日志缓冲区时,lwgr在一个事务提交前就将日志项写出,而这些日志项仅当在以后事务提交后才永久化。

oracle使用快速提交机制,当用户发出commit语句时,一个commit记录立即放入日志缓冲区,但相应的数据缓冲区改变是被延迟,直到在更有效时才将它们写入数据文件。当一事务提交时,被赋给一个系统修改号(scn),它同事务日志项一起记录在日志中。由于scn记录在日志中,以致在并行服务器选项配置情况下,恢复操作可以同步。

ckpt进程:该进程在检查点出现时,对全部数据文件的标题进行修改,指示该检查点。在通常的情况下,该任务由lgwr执行。然而,如果检查点明显地降低系统性能时,可使ckpt进程运行,将原来由lgwr进程执行的检查点的工作分离出来,由ckpt进程实现。对于许多应用情况,ckpt进程是不必要的。只有当数据库有许多数据文件,lgwr在检查点时明显地降低性能才使ckpt运行。ckpt进程不将块写入磁盘,该工作是由dbwr完成的。

初始化参数checkpoint-process控制ckpt进程的使能或使不能。缺省时为false,即为使不能。

smon进程:该进程实例启动时执行实例恢复,还负责清理不再使用的临时段。在具有并行服务器选项的环境下,smon对有故障cpu或实例进行实例恢复。smon进程有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。

pmon进程:该进程在用户进程出现故障时执行进程恢复,负责清理内存储区和释放该进程所使用的资源。例:它要重置活动事务表的状态,释放封锁,将该故障的进程的id从活动进程表中移去。pmon还周期地检查调度进程(dispatcher)和服务器进程的状态,如果已死,则重新启动(不包括有意删除的进程)。

pmon有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。

reco进程:该进程是在具有分布式选项时所使用的一个进程,自动地解决在分布式事务中的故障。一个结点reco后台进程自动地连接到包含有悬而未决的分布式事务的其它数据库中,reco自动地解决所有的悬而不决的事务。任何相应于已处理的悬而不决的事务的行将从每一个数据库的悬挂事务表中删去。

当一数据库服务器的reco后台进程试图建立同一远程服务器的通信,如果远程服务器是不可用或者网络连接不能建立时,reco自动地在一个时间间隔之后再次连接。

reco后台进程仅当在允许分布式事务的系统中出现,而且distributed – transactions参数是大于0。

arch进程:该进程将已填满的在线日志文件拷贝到指定的存储设备。当日志是为archivelog使用方式、并可自动地归档时arch进程才存在。

lckn进程:是在具有并行服务器选件环境下使用,可多至10个进程(lck0,lck1……,lck9),用于实例间的封锁。

dnnn进程(调度进程):该进程允许用户进程共享有限的服务器进程(server process)。没有调度进程时,每个用户进程需要一个专用服务进程(dedicatedserver process)。对于多线索服务器(multi-threaded server)可支持多个用户进程。如果在系统中具有大量用户,多线索服务器可支持大量用户,尤其在客户_服务器环境中。

在一个数据库实例中可建立多个调度进程。对每种网络协议至少建立一个调度进程。数据库管理员根据操作系统中每个进程可连接数目的限制决定启动的调度程序的最优数,在实例运行时可增加或删除调度进程。多线索服务器需要sql*net版本2或更后的版本。在多线索服务器的配置下,一个网络接收器进程等待客户应用连接请求,并将每一个发送到一个调度进程。如果不能将客户应用连接到一调度进程时,网络接收器进程将启动一个专用服务器进程。该网络接收器进程不是oracle实例的组成部分,它是处理与oracle有关的网络进程的组成部分。在实例启动时,该网络接收器被打开,为用户连接到oracle建立一通信路径,然后每一个调度进程把连接请求的调度进程的地址给予于它的接收器。当一个用户进程作连接请求时,网络接收器进程分析请求并决定该用户是否可使用一调度进程。如果是,该网络接收器进程返回该调度进程的地址,之后用户进程直接连接到该调度进程。有些用户进程不能调度进程通信(如果使用sql*net以前的版本的用户),网络接收器进程不能将如此用户连接到一调度进程。在这种情况下,网络接收器建立一个专用服务器进程,建立一种合适的连接。

2)、oracle内存结构

oracle在内存存储下列信息:

执行的程序代码。

连接的会话信息

程序执行期间所需数据和共享的信息

存储在外存储上的缓冲信息。

oracle具有下列基本的内存结构:

软件代码区

系统全局区,包括数据库缓冲存储区、日志缓冲区和共享池.

程序全局区,包括栈区和数据区.

排序区

软件代码区

用于存储正在执行的或可以执行的程序代码。

软件区是只读,可安装成共享或非共享。oracle系统程序是可共享的,以致多个oracle用户可存取它,而不需要在内存有多个副本。用户程序可以共享也可以不共享。

系统全局区

为一组由oracle分配的共享的内存结构,可包含一个数据库实例的数据或控制信息。如果多个用户同时连接到同一实例时,在实例的sga中数据可为多个用户所共享,所以又称为共享全局区。当实例起动时,sga的存储自动地被分配;当实例关闭时,该存储被回收。所有连接到多进程数据库实例的全部用户可自动地被分配;当实例关闭时,该存储被回收。所有连接到多进程数据库实例的全部用户可使用其sga中的信息,但仅仅有几个进程可写入信息。在sga中存储信息将内存划分成几个区:数据库缓冲存储区、日志缓冲区、共享池、请求和响应队列、数据字典存储区和其它各种信息。

程序全局区

pga是一个内存区,包含单个进程的数据和控制信息,所以又称为进程全局区(process global area)。

排序区

排序需要内存空间,oracle利用该内存排序数据,这部分空间称为排序区。排序区存在于请求排序的用户进程的内存中,该空间的大小为适就排序数据量的大小,可增长,但受初始化参数sort-area-sizer所限制。

2. oracle的配置方案

所有连接到oracle的用户必须执行两个代码模块可存取一个oracle数据库实例:

应用或oracle工具:一数据库用户执行一数据库应用或一个oracle工具,可向oracle数据库发出sql语句。

oracle服务器程序:负责解释和处理应用中的sql语句。

在多进程实例中,连接用户的代码可按下列三种方案之一配置:

对于每一个用户,其数据库应用程序和服务器程序组合成单个用户进程

对于每一个用户,其数据库应用是由用户进程所运行,并有一个专用服务器进程。执行oracle服务器的代码。这样的配置称为专用服务器体系结构

执行数据库应用的进程不同于执行oracle服务器代码的进程,而且每一个服务器进程(执行oracle服务器代码)可服务于多个用户进程,这样的配置称为多线索服务器体系结构。

1) user/server进程相结合的结构

在这种配置下,数据库应用和oracle服务器程序是在同一个进程中运行,该进程称为用户进程。

这种oracle配置有时称为单任务oracle(single_task oracle),该配置适用于这样的操作系统,它可在同一进程中的数据库应用和oracle代码之间维护一个隔离,该隔离是为数据安全性和完整性所需。其中程序接口(program interface)是负责oracle服务器代码的隔离和保护,在数据库应用和oracle用户程序之间传送数据。

2) 使用专用服务器进程的系统结构

使用专用服务器进程的oracle系统在两台计算机上运行。在这种系统中,在一计算机上用户进程执行数据库应用,而在另一台计算机上的服务器进程执行相应的oracle服务器代码,这两个进程是分离的。为每个用户进程建立的不同的服务器进程称为专用服务器进程,因为该服务器进程仅对相连的用户进程起作用。这种配置又称为两任务oracle。每一个连接到oracle的用户进程有一个相应的专用服务进程。这种系统结构允许客户应用是有工作站上执行,通过网络与运行oracle的计算机通信。当客户应用和oracle服务器代码是在同一台计算机上执行时,这种结构也可用。

3) 多线索服务器的系统结构

多线索服务器配置允许许多用户进程共享很少服务器进程。在没有多线索服务器的配置中,每一个用户进程需要自己的专用服务器进程。在具有多线索服务器的配置中,许多用户进程连接到调度进程,由调度进程将客户请求发送到一个共享服务器进程。多线索服务器配置的优点是降低系统开销,增加用户个数。

该系统中需要下列类型的进程:

网络接收器进程,将用户进程连接到调度进程和专用服务器进程。

一个或多个调度进程

一个或多个共享服务器进程

其中网络接收器进程等待新来的连接请求,决定每一用户进程能否用共享服务器进程。如果可以使用,接收器进程将一调度进程的地址返回给用户进程。如果用户进程请求一专用服务器,该接收器进程将建立一个专用服务器进程,将用户进程连接到该专用服务器进程。对于数据库客户机所使用的每种网络协议至少配置一个调度进程,并启动它。

当用户作一次调用时,调度进程将请求放置在sga的请求队列中,由可用的共享服务器进程获取。共享服务器进程为完成每一个用户进程的请求作所有必要的数据库调用。当服务器完成请求时,将结果返回到调度进程的队列,然后由调度进程将完成的请求返回给用户进程。

共享服务器进程:除共享服务器进程不是连接指定的用户进程外,共享服务器进程和专用服务器进程提供相同的功能,一个共享服务器进程在多线索服务器的配置中可为任何客户请求服务。一个共享服务器进程的sga不包含有与用户相关的数据,其信息可为所有共享服务器进程存取,它仅包含栈空间、进程指定变量。所有与会话有关的信息是包含有sga中。每一个共享服务器进程可存取全部会话的数据空间,以致任何服务进程可处理任何会话的请求。对于每一个会话的数据空间是在sga中分配空间。

oracle根据请求队列的长度可动态地调整共享服务器进程。可建立的共享服务器进程将请求放到请求队列。一个用户请求是对数据库的一次程序接口调用,为sql语句。在sga中请求队列对实例的全部调度进程是公用的。服务器进程为新请求检查公用请求队列,按先进先出的原则从队列检出一个请求,然后为完成该请求对数据库作必要的调用。共享服务器进程将响应放在调度进程的响应队列。每一个调度进程在sga中有自己的响应队列,每个调度进程负责将完成的请求回送给相应的用户进程。

3.oracle运行

1) 使用专用服务进程的oracle的运行

在这种配置下,oracle运行过程如下:

(1) 数据库服务器计算机当前正在运行oracle(后台进程)。

(2) 在一客户工作站运行一个数据库应用(为用户进程),如sql*plus。客户应用使用sql*net driver建立对服务器的连接。

(3) 数据库服务器计算机当前正运行合适的sql*net driver,该机上接收器进程检出客户数据库应用的连接请求,并在该机上为用户进程建立专用服务器进程。

(4) 用户发出单个sql语句。

(5) 专用服务器进程接收该语句,在此处有两种方法处理sql语句:

如果在共享池一共享sql区中包含有相同sql语句时,该服务器进程可利用已存在的共享sql区执行客户的sql语句。

?如果在共享池中没有一个sql区包含有相同的sql语句时,在共享池中为该语句分配一新的共享sql区。

在每一种情况,在会话的pga中建立一个专用sql区,专用服务器进程检查用户对查询数据的存取权限。

(6) 如果需要,服务器进程从数据文件中检索数据块,或者可使用已存储在实例sga中的缓冲存储区的数据块。

(7) 服务器进程执行存储在共享sql区中的sql语句。数据首先在sga中修改,由dbwr进程在最有效时将它写入磁盘。lgwr进程在在线日志文件中记录用户提交请求的事务。

(8)如果请求成功,服务器将通过网络发送一信息。如果请求不成功,将发送相应的错误信息。

(9)在整个过程中,其它的后台进程是运行的,同时注意需要干预的条件。另外,oracle管理其它事务,防止不同事务之间请求同一数据的竞争。

2) 使用多线索服务器的oracle的运行

在这种配置下,oracle运行过程如下:

(1) 一数据库服务器计算机运行使用多线索服务器配置的oracle。

(2) 在一客户工作站运行一数据库应用(在一用户进程中)。客户应用合适的sql*net驱动器试图建立到数据库服务器计算机的连接。

(3) 数据库服务器计算机当前运行合适的sql*net驱动器,它的网络接收器进程检出用户进程的连接请求,并决定用户进程如何连接。如果用户是使用sql*net版本2,该网络接收器通知用户进程使用一个可用的调度进程的地址重新连接。

(4) 用户发出单个sql语句

(5) 调度进程将用户进程的请求放入请求队列,该队列位于sga中,可为所有调度进程共享。

(6) 一个可用共享服务器检验公用调度进程请求队列,并从队列中检出下一个sql语句。然后处理该sql语句,同前一(5),(6)和(7)。注意:会话的专用sql区是建立在sga中。

(7) 一当共享服务器进程完成sql处理,该进程将结果放置发入该请求的调度进程的响应队列。

(8) 调度进程检查它的响应队列,并将完成的请求送回请求的用户进程。

4.数据库结构和空间管理

一个oracle数据库是数据的集合,被处理成一个单位。一个oracle数据库有一个物理结构和一个逻辑结构。

物理数据库结构(physical database structure)是由构成数据库的操作系统文件所决定。每一个oracle数据库是由三种类型的文件组成:数据文件、日志文件和控制文件。数据库的文件为数据库信息提供真正的物理存储。

逻辑数据库结构是用户所涉及的数据库结构。一个oracle数据库的逻辑结构由下列因素决定:

一个或多个表空间

数据库模式对象(即表、视图、索引、聚集、序列、存储过程)

逻辑存储结构如表空间(dataspace)、段(segment)和范围将支配一个数据库的物理空间如何使用。模式对象(schema object)用它们之间的联系组成了一个数据库的关系设计。

1) 物理结构

(1) 数据文件

每一个oracle数据库有一个或多个物理的数据文件(data file)。一个数据库的数据文件包含全部数据库数据。逻辑数据库结构(如表、索引)的数据物理地存储在数据库的数据文件中。数据文件有下列特征:

一个数据文件仅与一个数据库联系。

一旦建立,数据文件不能改变大小

一个表空间(数据库存储的逻辑单位)由一个或多个数据文件组成。

数据文件中的数据在需要时可以读取并存储在oracle内存储区中。例如:用户要存取数据库一表的某些数据,如果请求信息不在数据库的内存存储区内,则从相应的数据文件中读取并存储在内存。当修改和插入新数据时,不必立刻写入数据文件。为了减少磁盘输出的总数,提高性能,数据存储在内存,然后由oracle后台进程dbwr决定如何将其写入到相应的数据文件。

(2) 日志文件

每一个数据库有两个或多个日志文件(redo log file)的组,每一个日志文件组用于收集数据库日志。日志的主要功能是记录对数据所作的修改,所以对数据库作的全部修改是记录在日志中。在出现故障时,如果不能将修改数据永久地写入数据文件,则可利用日志得到该修改,所以从不会丢失已有操作成果。

日志文件主要是保护数据库以防止故障。为了防止日志文件本身的故障,oracle允许镜象日志(mirrored redo log),以致可在不同磁盘上维护两个或多个日志副本。

日志文件中的信息仅在系统故障或介质故障恢复数据库时使用,这些故障阻止将数据库数据写入到数据库的数据文件。然而任何丢失的数据在下一次数据库打开时,oracle自动地应用日志文件中的信息来恢复数据库数据文件。

(3) 控制文件

每一oracle数据库有一个控制文件(control file),它记录数据库的物理结构,包含下列信息类型:

数据库名;

数据库数据文件和日志文件的名字和位置;

? 数据库建立日期。

为了安全起见,允许控制文件被镜象。

每一次oracle数据库的实例启动时,它的控制文件用于标识数据库和日志文件,当着手数据库操作时它们必须被打开。当数据库的物理组成更改时,oracle自动更改该数据库的控制文件。数据恢复时,也要使用控制文件。

2) 逻辑结构

数据库逻辑结构包含表空间、段、范围(extent)、数据块和模式对象。

(1) 表空间

一个数据库划分为一个或多个逻辑单位,该逻辑单位称为表空间(tablespace)。一个表空间可将相关的逻辑结构组合在一起。dba可利用表空间作下列工作:

控制数据库数据的磁盘分配。

将确定的空间份额分配给数据库用户。

通过使单个表空间在线或离线,控制数据的可用性。

执行部分数据库后备或恢复操作。

为提高性能,跨越设备分配数据存储。

数据库、表空间和数据文件之间的关系如下图所示:

database

dtatafile1

(2mb)              datafile2

(2mb)              datafile3

(2mb)

driver1               driver2

每个数据库可逻辑划分为一个或多个表空间

每一个表空间是由一个或多个数据文件组成,该表空间物理地存储表空间中全部逻辑结构的数据。dba可以建立新的表空间,可为表空间增加数据文件或可删除数据文件,设置或更改缺省的段存储位置。

每一个oracle数据库包含有一个名为system的表空间,在数据库建立是自动建立。在该表空间中总包含有整个数据库的数据字典表。最小的数据库可只需要system表空间。该表空间必须总是在线。表和存储的pl/sql程序单元(过程、函数、包和触发器)的全部存储数据是存储在system表空间中。如果这些pl/sql对象是为数据库建的,dba在system表空间中需要规划这些对象所需要的空间。

表空间利用增加数据文件扩大表空间,表空间的大小为组成该表空间的数据文件大小的和。

dba可以使oracle数据库中任何表空间(除system表空间外)在线(online)或离线(offline)。表空间通常是在线,以致它所包含的数据对数据库用户是可用的。当表空间为离线时,其数据不可使用。在下列情况下,dba可以使其离线。

使部分数据不可用,而剩余的部分允许正常存取

执行离线的表空间后备

为了修改或维护一应用,使它和它的一组表临时不可用。

包含有正在活动的回滚段的表空间不能被离线,仅当回滚段不正在使用时,该表空间才可离线。

在数据字典中记录表空间的状态,在线还是离线。如果在数据库关闭时一表空间为离线,那么在下次数据库装配和重新打开后,它仍然保持离线。

当出现某些错误时,一个表空间可自动地由在线改变为离线。通过使用多个表空间,将不同类型的数据分开,更方便dba来管理数据库。

oracle数据库中一表空间是由一个或多个物理数据文件组成,一个数据文件只可与一个表空间想联系。当为一表空间建立一数据文件时,oracle建立该文件,分配指定的磁盘空间容量。在数据文件初时建立后,所分配的磁盘不包含任何数据。表空间可以在线或离线。在oracle中还允许单独数据文件在线或离线。

(2) 段、范围和数据块

oracle通过段、范围和数据块逻辑数据结构可更细地控制磁盘空间的使用。

段(segment)包含表空间中一种指定类型的逻辑存储结构,是由一组范围组成。在oracle数据库中有几种类型的段:数据段、牵引段、回滚段和临时段。

数据段:对于每一个非聚集的表有一数据段,表的所有数据存放在该段。每一聚集有一个数据段,聚集中每一个表的数据存储在该段中。

索引段:每一个索引有一索引段,存储索引数据。

回滚段:是由dba建立,用于临时存储要撤消的信息,这些信息用于生成读一致性数据库信息、在数据库恢复时使用、回滚未提交的事务。

临时段:当一个sql语句需要临时工作区时,由oracle建立。当语句执行完毕,临时段的范围退回给系统。

oracle对所有段的空间分配,以范围为单位。

范围

一个范围(extent)是数据库存储空间分配的一个逻辑单位,它由连续数据块所组成。每一个段是由一个或多个范围组成。当一段中间所有空间已完全使用时,oracle为该段分配一个新的范围。

为了维护的目的,在数据库的每一段含有段标题块(segment header block)说明段的特征以及该段中的范围目录。

数据块

数据块(data block)是oracle管理数据文件中存储空间的单位,为数据库使用的i/o的最小单位,其大小可不同于操作系统的标准i/o块大小。

数据块的格式:

公用的变长标题

表目录

行目录

未用空间

行数据

(3) 模式和模式对象

一个模式(schema)为模式对象(scehma object)的一个集合,每一个数据库用户对应一个模式。模式对象为直接引用数据库数据的逻辑结构,模式对象包含如表、视图、索引、聚集、序列、同义词、数据库链、过程和包等结构。模式对象是逻辑数据存储结构,每一种模式对象在磁盘上没有一个相应文件存储其信息。一个模式对象逻辑地存储在数据库的一个表空间中,每一个对象的数据物理地包含在表空间的一个或多个数据文件中。

表(table)为数据库中数据存储的基本单位,其数据按行、列存储。每个表具有一表名和列的集合。每一列有一个列名、数据类型、宽度或精度、比例。一行是对应单个记录的列信息的集合。

视图

一个视图(view)是由一个或多个表(或其他视图)中的数据的一种定制的表示,是用一个查询定义,所以可认为是一个存储的查询(stored query)或是一个虚表(virtual table)。视图可在使用表的许多地方使用。

由于视图是由表导出的,视图和表存在许多类似,视图象表最多可定义254列。视图可以被查询,而在修改、插入或删除时具有一定的限制,在视图上执行的全部操作真正地影响视图的基本表中的数据,受到基本表的完整性约束和触发器的限制。

视图与表不同,一个视图不分配任何存储空间,视图不真正地包含数据。由查询定义的视图相应于视图引用表中的数据。视图只在数据字典中存储其定义。

引入视图有下列好处:

。通过限制对表的行预定义集合的存取,为表提供附加的安全性

。隐藏数据复杂性。

。为用户简化命令

。为基本表的数据提供另一种观点。

。可将应用隔离基本表定义的修改

。用于不用视图无法表示的查询。

。可用于保存复杂查询。

聚集

聚集(cluster)是存储表数据的可选择的方法。一个聚集是一组表,将具有同一公共列值的行存储在一起,并且它们经常一起使用。这些公共列构成聚集码。例如:emp表各dept表共享deptno列,所以emp表和dept表可聚集在一起,聚集码的列为deptno列,该聚集将每个部门的全部职工行各该部门的行物理地存储在同一数据块中。

索引

索引(index)是与表和聚集相关的一种选择结构。索引是为提高数据检索的性能而建立,利用它可快速地确定指定的信息。oracle索引为表数据提供快速存取路径。索引适用于一范围的行查询或指定行的查询。

索引可建立在一表的一列或多列上,一旦建立,由oracle自动维护和使用,对用户是完全透明的。索引是逻辑地和物理地独立于数据,它们的建立或删除对表没有影响,应用可继续处理。索引数据的检索性能几乎保持常数,而当一表上存在许多索引时,修改、删除和插入操作的性能会下降。

索引有唯一索引各非唯一索引。唯一索引保证表中没有两行在定义索引的列上具有重复值。oracle在唯一码上自动地定义唯一索引实施unique完整性约束。

组合索引是在表的某个列上所建立的一索引。组全索引可加快select语句的检索速度,在其where子句中可引用组合索引的全部或主要部分 。所以在定义中给出列的次序,将经常存取的或选择最多的列放在首位。

在建立索引时,将在表空间自动地建立一索引段,索引段空间分配和保留空间的使用受下列方式控制:

索引段范围的分配常驻该索引段的存储参数控制。

其数据块中未用空间可受该段的pctfree参数设置所控制。

序列生成器

序列生成器(sequence generator)产生序列号。在多用户环境下该序列生成器特别有用,可生成各返回序列号而不需要磁盘i/o或事务封锁。

序列号为oracle整数,最多可有38个数字。一个序列定义指出一般信息:序列的名字、上升或下降、序列号之间间距和其它信息。对所有序列的确的定义以行存储在system表空间中的数据字典表中,所以所有序列定义总是可用。由引用序列号的sql语句使用序列号,可生成一个新的序列号或使用当前序列号。一旦在用户会话中的sql语句生成一序列号,该序列号仅为该会话可用。序列号生成是独立于表,所以同一序列生成器可用于一个和多个表。所生成序列号可用于生成唯一的主码。

同义词

一个同义词(synonym)为任何表、视图、快照、序列、过程、函数或包的别名,其定义存储在数据字典中。同义词因安全性和方便原因而经常使用,可用于:

可屏蔽对象的名字及其持有者。

为分布式数据库的远程对象提供位置透明性。

为用户简化sql语句。

有两种同义词:公用和专用。一个公用同义词为命名为public特殊用户组所持有,可为数据库中每一个用户所存取。一个专用同义词是包含在指定用户的模式中,仅为该用户和授权的用户所使用。

杂凑

杂凑(hashing)是存储表数据一种可选择的方法,用以改进数据检索的性能。要使用杂凑,就要建立杂凑聚集,将表装入到该聚集。在骠凑聚集中的表行根据杂凑函数的结果进行物理学存储和检索。杂凑函数用于生成一个数值的分布,该数值称为杂凑值,它是基于指定的聚集码值。

程序单元

程序单元(program unit)是指存储过程、函数和包(package)。一个过程和函数,是由sql语句和pl/sql语句组合在一起,为执行某一个任务的一个可执行单位。一个过程或函数可被建立,在数据库中存储其编译形式,可由用户或数据库应用所执行。过程和函数差别在函数总返回单个值给调用者,而过程没有值返回给调用者。

包提供相关的过程、函数、变量和其它包结构封装起来并存贮在一起的一种方法,允许管理者和应用开发者利用该方法组织如此的程序(routine),来提供更多的功能和提高性能。

数据库链

数据库链是一个命名的对象,说明从一数据库到另一数据库的一路径(path)。在分布式数据库中,对全局对象名引用时,数据库链隐式地使用。

三、数据库和实例的启动和关闭

一个oracle数据库没有必要对所有用户总是可用,数据库管理员可启动数据库,以致它被打开。在数据库打开情况下,用户可存取数据库中的信息。当数据库不使用时,dba可关闭它,关闭后的数据库,用户不能存取其信息。

数据库的启动和关闭是非常重要的管理功能,通过以internal连接到oracle的能力来保护。以internal 连接到oracle需要有下列先决条件:

该用户的操作系统账号具有使用internal连接的操作系统特权。

对internal数据库有一口令,该用户知道其口令。

另外:当用户以internal连接时,可连接到专用服务器,而且是安全连接。

1. 数据库启动

启动数据库并使它可用有三步操作:

启动一个实例;

装配数据库

打开数据库

1) 启动一个实例

启动一实例的处理包含分配一个sga(数据库信息使用的内存共享区)和后台进程的建立。实例起动的执行先于该实例装配一数据库。如果仅启动实例,则没有数据库与内存储结构和进程相联系。

2) 装配一数据库

装配数据库是将一数据库与已启动的实例相联。当实例安装一数据库之后,该数据库保持关闭,仅dba可存取。

3) 打开一数据库

打开一数据库是使数据库可以进行正常数据库操作的处理。当一数据库打开所有用户可连接到该数据库用存取其信息。在数据库打开时,在线数据文件和在线日志文件也被打开。如果一表空间在上一次数据库关闭时为离线,在数据库再次打开时,该表空间与它所相联的数据文件还是离线的。

2. 数据库和实例的关闭

关闭一实例以及它所连接的数据库也有三步操作:

1) 关闭数据库

数据库停止的第一步是关闭数据库。当数据库关闭后,所有在sga中的数据库数据和恢复数据相应地写入到数据文件和日志文件。在这操作之后,所有联机数据文件和联机的日志文件也被关闭,任何离线表空间中数据文件夹是已关闭的。在数据库关闭后但还安装时,控制文件仍保持打开。

2) 卸下数据库

停止数据库的第二步是从实例卸下数据库。在数据库卸下后,在计算机内存中仅保留实例。在数据库卸下后,数据库的控制文件也被关闭。

3) 停止实例

停止数据库的最后一步是停止实例。当实例停止后,sag是从内存中撤消,后台进程被中止。

3. 初始化参数文件

在启动一个实例时,oracle必须读入一初始化参数文件(initialization parameter file),该参数文件是一个文本文件,包含有实例配置参数。这些参数置成特殊值,用于初始oracle实例的许多内存和进程设置,该参数文件包含:

一个实例所启动的数据库名字

在sga中存储结构使用多少内存;

在填满在线日志文件后作什么;

数据库控制文件的名字和位置;

在数据库中专用回滚段的名字。

四、数据字典的使用

数据字典是oracle数据库的最重要的部分之一,是由一组只读的表及其视图所组成。它提供有关该数据库的信息,可提供的信息如下:

oracle用户的名字;

每一个用户所授的特权和角色;

模式对象的名字(表、视图、快照、索引、聚集、同义词、序列、过程、函数、包及触发器等);

关于完整性约束的信息;

列的缺省值;

有关数据库中对象的空间分布及当前使用情况;

审计信息(如谁存取或修改各种对象);

其它一般的数据库信息。

可用sql存取数据字典,由于数据字典为只读,允许查询。

1. 数据字典的结构

数据库数据字典是由基本表和用户可存取的视图组成。

基本表:数据字典的基础是一组基本表组成,存储相关的数据库的信息。这些信息仅由oracle读和写,它们很少被oracle用户直接存取。

用户可存取视图:数据字典包含用户可存取视图,可概括地方便地显示数据字典的基本表的信息。视图将基本表中信息解码成可用信息。

2. 数据字典的使用

当数据库打开时,数据字典总是可用,它驻留在system表空间中。数据字典包含视图集,在许多情况下,每一视图集有三种视图包含有类似信息,彼此以 前缀 相区别,前缀 user、all和dba。

?前缀为user的视图,为用 视图,是在用户的模式内。

?前缀为all的视图,为扩展的用户视图(为用户可存取的视图)。

?前缀为dba的视图为dba的视图(为全部用户可存取的视图)。

在数据库中oracle还维护了一组虚表记录当前数据库的活动,这些表称为动态性能表。动态性能表不是真正的表,许多用户不能存取,dba可查询这些表,可以建立视图,给其它用户授予存取视图权。

五、事务管理

1. 事务

一个事务为工作的一个逻辑单位,由一个或多个sql语句组成。一个事务是一个原子单位,构成事务的全部sql语句的结果可被全部提交或者全部回滚。一个事务由第一个可执行sql语句开始,以提交或回滚结束,可以是显式的,也可是隐式的(执行ddl语句)。

在执行一个sql语句出现错误时,该语句所有影响被回滚,好像该语句没有被执行一样,但它不会引起当前事务先前的工作的丢失。

2. oracle的事务管理

在oracle中一个事务是由一个可执行的sql语句开始,一个可执行sql语句产生对实例的调用。在事务开始时,被赋给一个可用回滚段,记录该事务的回滚项。一个事务以下列任何一个出现而结束。

当commit或rollback(没有savepoint子句)语句发出。

一个ddl语句被执行。在ddl语句执行前、后都隐式地提交。

用户撤消对oracle的连接(当前事务提交)。

用户进程异常中止(当前事务回滚)。

1) 提交事务

提交一事务,即将在事务中由sql语句所执行的改变永久化。在提交前,oracle已有下列情况:

在sga的回滚段缓冲区已生成回滚段记录,回滚信息包含有所修改值的老值。

在sga的日志缓冲区已生成日志项。这些改变在事务提交前可进入磁盘。

对sga的数据库缓冲区已作修改,这些修改在事务真正提交之前可进入磁盘。

在事务提交之后,有下列情况:

对于与回滚段相关的内部事务表记录提交事务,并赋给一个相应的唯一系统修改号(scn),记录在表中。

在sga的日志缓冲区中日志项由lgwr进程写入到在线日志文件, 这是构成提交事务的原子事务。

在行上和表上的封锁被释放。

该事务标志为完成 。

注意:对于提交事务的数据修改不必由dbwr后台进程立即写入数据文件,可继续存储在sga的数据库缓冲区中,在最有效时将其写入数据文件。

2) 回滚事务

回滚事务的含义是撤消未提交事务中的sql语句所作的对数据修改。oralce允许撤消未提交的整个事务,也允许撤消部分。

在回滚整个事务(没有引用保留点)时,有下列情况:

在事务中所有sql语句作的全部修改,利用相应的回滚段被撤消。

所有数据的事务封锁被释放。

事务结束。

当事务回滚到一保留点(具有savepoint)时,有下列情况:

仅在该保留点之后执行的语句被撤消。

该指定的保留点仍然被保留,该保留点之后所建立的保留点被删除。

自该保留点之后所获取的全部表封锁和行封锁被释放,但指定的保留点以前所获取的全部数据封锁继续保持。

该事务仍可继续。

3) 保留点

保留点(savepoint)是在一事务范围内的中间标志,经常用于将一个长的事务划分为小的部分。保留点可标志长事务中的任何点,允许可回滚该点之后的工作。在应用程序中经常使用保留点;例如一过程包含几个函数,在每个函数前可建立一个保留点,如果函数失败,很容易返回到每一个函数开始的情况。在回滚到一个保留点之后,该保持点之后所获得的数据封锁被释放。

六、数据库触发器

1. 触发器介绍

数据库触发器(database trigger)是存储在数据库中的过程,当表被修改时它隐式地被激发(执行)。在oracle中允许在对表发出insert、update或delete语句时隐式地执行所定义的过程,这些过程称为数据库触发器。触发器存储在数据库中,并与所相关表分别存储。触发器仅可在表上定义。在许多情况中触发器用于提供很高级的专用数据库管理系统,来补充oracle的标准功能。触发器一般用于:

自动地生成导出的列值;

防止无效的事务;

实施更复杂的安全性检查

在分布式数据库中实施跨越结点的引用完整性;

实施复杂的事务规则;

提供透明事件日志;

提供高级的审计;

维护同步表复制;

收集关于存取表的统计。

注意:数据库触发器与sql*forms触发器之间的差别。数据库触发器是定义在表上,存储在数据库中,当对表执行insert、update或delete语句时被激发,不管是谁或哪一应用发出。而sql*forms触发器是sql*form应用的部分,仅当在指定sql*forms应用中执行一个指定触发器点时才被激发。

触发器和说明性完整性约束都可用于约束数据的输入,但它们之间有一定区别:

说明性完整性约束是关于数据库总是为“真”的语句。一个完整性约束应用于表中已有数据和操纵表的任何语句。

而触发器约束事务不可应用于在定义触发器前已装入的数据,所以它不能保证表中全部数据服从该触发器的规则。触发器实施瞬时约束,即在数据改变时实施一约束。

2. 触发器的组成:

一个触发器有三个基本部件:触发事件或语句、触发器的限制、触发器动作。

触发事件或语句:为引起触发器激发的sql语句,是对指定表insert、update或delete语句。

触发器限制:为一布尔表达式,当触发器激发时该条件必须为true。触发器的限制是用when子句来指定。

触发器的动作:为一个pl/sql块(过程),由sql语句和pl/sql语句组成。当触发语句发出,触发器的限制计算得true时,它被执行。在触发器动作的语句中,可使用触发器的处理的当前行的列值(新值、老值),使用形式为:

new.列名                         引用新值

ole.列名                         引用老值

在定义触发器时可指定触发器动作执行次数:受触发语句影响每一行执行一次或是对触发语句执行一次。

对每一触发语句可有四种类型触发器:

行触发器:对受触发语句所影响的每一行,行触发器激发一次。

语句触发器:该类型触发器对触发语句执行一次,不管其受影响行数。

定义触发器可以指定触发时间,指定激发器动作的执行相对于触发语句执行之后或之前。

before触发器:该触发器执行触发器动作是在触发语句执行之前。

after触发器:该触发器执行触发器动作是在触发语句执行之后。

一个触发器可处于两种不同的方式:使能触发器和使不能触发器。

使能触发器:只要当触发语句发出,触发器限制计算为true,这种类型的触发器执行其触发动作。

使不能触发器:这种触发器即使其触发语句被发出,触发器限制计算为true,也不执行触发器动作。

触发器的源代码存储在数据库中,在第一次执行时,触发器的源代码被编译,存储在共享池中。如果触发器从共享池中挤了,再使用时必须再重新编译。

七、分布处理和分布式数据库

1. 简介

一个分布式数据库在用户面前为单个逻辑数据库,但实际上是由存储在多台计算机上的一组数据库组成。在几台计算机 上的数据库通过网络可同时修改和存取,每一数据库受它的局部的dbms控制。分布式数据库中每一个数据库服务器合作地维护全局数据库的一致性。

在系统中的每一台计算机称为结点。如果一结点具有管理数据库 软件,该结点称为数据库服务器。如果一个结点为请求服务器的信息的一应用,该结点称为客户。在oracle客户,执行数据库应用,可存取数据信息和与用户交互。在服务器,执行oracle软件,处理对oracle数据库并发、共享数据存取。oracle允许上述两部分在同一台计算机上,但当客户部分和服务器部分是由网连接的不同计算机上时,更有效。

分布处理是由多台处理机分担单个任务的处理。在oracle数据库系统中分布处理的例子如:

客户和服务器是位于网络连接的不同计算机上。

单台计算机上有多个处理器,不同处理器分别执行客户应用。

sql*net是oracle网络接口,允许运行在网络工作站的oracle工具和服务器上,可存取、修改、共享和存储在其它服务器上的数据。saql*net可被认为是网络通信的程序接口。sql*net利用通信协议和应用程序接口(api)为oarcle提供一个分布式数据库和分布处理。

sql*net驱动器为在数据库服务器上运行的oracle进程与oracle工具的用户进程之间提供一个接口。

参与分布式数据库的每一服务器是分别地独立地管理数据库,好 像每一数据库不是网络化的数据库。每一个数据库独立地被管理,称为场地自治性。场地自治性有下列好处:

系统的结点可反映公司的逻辑组织。

由局部数据库管理员控制局部数据,这样每一个数据库管理员责任域要小一些,可更好管理。

只要一个数据库和网络是可用,那么全局数据库可部分可用。不会因一个数据库的故障而停止全部操作或引起性能瓶颈。

故障恢复通常在单个结点上进行。

每个局部数据库存在一个数据字典。

结点可独立地升级软件。

可从分布式数据库的所有结点存取模式对象,因此正像非分布的局部的dbms,必须提供一种机制,可在局部数据库中引用一个对象。分布式dbms必须提供一种命名模式,以致分布式数据库中一个对象可在应用中唯一标识和引用。一般彩在层次结构的每一层实施唯一性。分布式dvms简单地扩充层次命名模型,实施在网络上唯一数据库命名。因此一个对象的全局对象名保证在分布式数据库内是唯一。

oracle允许在sql语句中使用佤对象名引用分布式数据库中的模式对象(表、视图和过程)。在oracle中,一个模式对象的全局名由三部分组成:包含对象的模式名、对象名、数据库名、其形式如:

其中scott为模式名,emp为表名,@符号之后为数据库名.

一个远程查询为一查询,是从一个或多个远程表中选择信息,这些表驻留在同一个远程结点.

一个分布式查询可从两个或多个结点检索数据.一个分布式更新可修改两个或两个以上结点的数据.

一个远程事务为一个事务,包含一人或多个远程语句,它所引用的全部是在同一个远程结点上.一个分布式事务中一个事务,包含一个或多个语句修改分布式数据库的两个或多个不同结点的数据.

在分布式数据库中,事务控制必须在网络上直辖市,保证数据一致性.两阶段提交机制保证参与分布式事务的全部数据库服务器是全部提交或全部回滚事务中的语句.

oracle分布式数据库系统结构可由oracle数据库管理员为终端用户和应用提供位置透明性,利用视图、同义词、过程可提供oracle分布式数据库系统中的位置透明性.

oracle允许在select(查询)、insert、update、delete、select…for update和lock table语句中引用远程数据。对于查询,包含有连接、聚合、子查询和select …for  update,可引用本地的、远程的表和视图。对于update、insert、delete和lock table语句可引用本地的和远程的表。注意在引用long和long raw列、序列、修改表和封锁表时,必须位于同一个结点。oracle不允许作远程ddl语句。

在单场地或分布式数据库中,所有事务都是用commit或rollback语句中止。oracle提供两种机制实现分布式数据库中表重复的透明性:表快照提供异步的表重复;触发器实现同步的表的重复。在两种情况下,都实现了对表重复的透明性。

2. 分布式数据库全局名与数据库链

1) 分布式数据库全局名:每一个数据库有一个唯一的全局名,由两部分组成:数据库名(小于等于8字符)和网络域。全局数据库名的网络域成分必须服从标准互联网规范。域名中的层次 由符号“.”分开,域名的次序由叶至根,从左至右。

2) 数据库链:为对过程数据库定义的一路径。数据库链对分布式数据库的用户是透明的,数据库链的名字与链所指向的数据库的全局名相同。其由二部分组成:远程账号和数据库串。例建立数据库链的形式:

creat public datebase link sale。division3。acme。com

connect to guest identified by password

using‘db串’;

其中:sales。divisin3。acme。com为定义的链名;guest/password 为远程数据库的用户账号和口令;db串用于远程连接。由账号和db串构成完全路径。如果只有一个则为部分路径。

有三种数据库链可用于决定用户对全部对象名的引用:

专用数据库链:为一指定用户建立。专用数据库链仅链的主人可使用。在sql语句中用于指定一全局对象名或者在持有者的视图过程定义中使用。

公用数据库链:为特殊的用户组public建立。公用数据库链可为任何用户使用,在sql语句中用于指定一个全局对象名或对象定义。

网络数据链:由网络域服务器建立和管理,可为网络中的任何数据库的任何用户使用,可在sql语句中指定全局对象名或对象定义中使用。注意:当前网络域服务器对oracle不能用,所以网络数据库链不可用。

3. 表快照

oracle的表快照特征允许一个主表在分布式数据库的其它结点进行复制。只允许修改主表,而复制只可读。主表达式每一个复制称为一个快照。快照异步的刷新,反映主表的一个最近事务一致状态。

一个快照可为表的完全拷贝或者为表的一个子集,由引用一个或多个主表、视图或其它快照的分布式查询所定义。包含主表的数据库称为主数据库。

快照有简单快照和复杂快照。简单快照的每行是基于单个远程表中的一行。所以定义简单快照的查询中不能有groub by或connect by子句,或子查询、连接或集合操作。如果在快照定义的查询中包含有上述子句或操作,这种快照称为复杂快照。

在快照建立时,oracle在快照的模式中建立几种内部对象:

在快照结点,oracle建立一基表用于存储由快照定义的查询所检索的行,然后为该表建立一个只读的视图,并为远程主表建立一视图,该视图用于新快照。

一个快照周期地被刷新,反映它的主表的当前情况。为了刷新一快照,快照定义查询是被发出,其查询结果想在存储在快照中,代替以前的快照数据。

当快照为简单快照时,可以由快照日志来刷新,这样可加快刷新处理。快照日志是在主表数据库中的一表,与主表相关。oracle使用快照日志跟踪主表中已修改的行。当基于主表的简单快照刷新时,仅需要快照日志的相应行来刷新快照,这种刷新称为快速刷新。

篇8:Oracle PL/SQL语言基础

pl/sql是oracle对标准数据库语言的扩展,oracle公司已经将pl/sql整合到oracle 服务器和其他工具中了,近几年中更多的开发人员和dba开始使用pl/sql,本文将讲述pl/sql基础语法,结构和组件、以及如何设计并执行一个pl/sql程序。

pl/sql的优点

从版本6开始pl/sql就被可靠的整合到oracle中了,一旦掌握pl/sql的优点以及其独有的数据管理的便利性,那么你很难想象oracle缺了pl/sql的情形。pl/sql 不是一个独立的产品,他是一个整合到oracle服务器和oracle工具中的技术,可以把pl/sql看作oracle服务器内的一个引擎,sql语句执行者处理单个的sql语句,pl/sql引擎处理pl/sql程序块。当pl/sql程序块在pl/sql引擎处理时,oracle服务器中的sql语句执行器处理pl/sql程序块中的sql语句。

pl/sql的优点如下:

. pl/sql是一种高性能的基于事务处理的语言,能运行在任何oracle环境中,支持所有数据处理命令。通过使用pl/sql程序单元处理sql的数据定义和数据控制元素。

. pl/sql支持所有sql数据类型和所有sql函数,同时支持所有oracle对象类型

. pl/sql块可以被命名和存储在oracle服务器中,同时也能被其他的pl/sql程序或sql命令调用,任何客户/服务器工具都能访问pl/sql程序,具有很好的可重用性。

. 可以使用oracle数据工具管理存储在服务器中的pl/sql程序的安全性。可以授权或撤销数据库其他用户访问pl/sql程序的能力。

. pl/sql代码可以使用任何ascii文本编辑器编写,所以对任何oracle能够运行的操作系统都是非常便利的

. 对于sql,oracle必须在同一时间处理每一条sql语句,在网络环境下这就意味作每一个独立的调用都必须被oracle服务器处理,这就占用大量的服务器时间,同时导致网络拥挤。而pl/sql是以整个语句块发给服务器,这就降低了网络拥挤。

pl/sql块结构

pl/sql是一种块结构的语言,组成pl/sql程序的单元是逻辑块,一个pl/sql 程序包含了一个或多个逻辑块,每个块都可以划分为三个部分。与其他语言相同,变量在使用之前必须声明,pl/sql提供了独立的专门用于处理异常的部分,下面描述了pl/sql块的不同部分:

声明部分(declaration section)

声明部分包含了变量和常量的数据类型和初始值。这个部分是由关键字declare开始,如果不需要声明变量或常量,那么可以忽略这一部分;需要说明的是游标的声明也在这一部分。

执行部分(executable section)

执行部分是pl/sql块中的指令部分,由关键字begin开始,所有的可执行语句都放在这一部分,其他的pl/sql块也可以放在这一部分。

异常处理部分(exception section)

这一部分是可选的,在这一部分中处理异常或错误,对异常处理的详细讨论我们在后面进行。

pl/sql块语法

[declare]

---declaration statements

begin

---executable statements

[exception]

---exception statements

end

pl/sql块中的每一条语句都必须以分号结束,sql语句可以使多行的,但分号表示该语句的结束。一行中可以有多条sql语句,他们之间以分号分隔。每一个pl/sql块由begin或declare开始,以end结束。注释由--标示。

pl/sql块的命名和匿名

pl/sql程序块可以是一个命名的程序块也可以是一个匿名程序块。匿名程序块可以用在服务器端也可以用在客户端。

命名程序块可以出现在其他pl/sql程序块的声明部分,这方面比较明显的是子程序,子程序可以在执行部分引用,也可以在异常处理部分引用。

pl/sql程序块可背独立编译并存储在数据库中,任何与数据库相连接的应用程序都可以访问这些存储的pl/sql程序块。oracle提供了四种类型的可存储的程序:

. 函数

. 过程

. 包

. 触发器

函数

函数是命名了的、存储在数据库中的pl/sql程序块。函数接受零个或多个输入参数,有一个返回值,返回值的数据类型在创建函数时定义。定义函数的语法如下:

function name [{parameter[,parameter,...])] return datatypes is

[local declarations]

begin

execute statements

[exception

exception handlers]

end [name]

过程

存储过程是一个pl/sql程序块,接受零个或多个参数作为输入(input)或输出(output)、或既作输入又作输出(inout),与函数不同,存储过程没有返回值,存储过程不能由sql语句直接使用,只能通过execut命令或pl/sql程序块内部调用,定义存储过程的语法如下:

procedure name [(parameter[,parameter,...])] is

[local declarations]

begin

execute statements

[exception

exception handlers ]

end [name]

包(package)

包其实就是被组合在一起的相关对象的集合,当包中任何函数或存储过程被调用,包就被加载入内存中,包中的任何函数或存储过程的子程序访问速度将大大加快。

包由两个部分组成:规范和包主体(body),规范描述变量、常量、游标、和子程序,包体完全定义子程序和游标。

触发器(trigger)

触发器与一个表或数据库事件联系在一起的,当一个触发器事件发生时,定义在表上的触发器被触发。

变量和常量

变量存放在内存中以获得值,能被pl/sql块引用。你可以把变量想象成一个可储藏东西的容器,容器内的东西是可以改变的。

声明变量

变量一般都在pl/sql块的声明部分声明,pl/sql是一种强壮的类型语言,这就是说在引用变量前必须首先声明,要在执行或异常处理部分使用变量,那么变量必须首先在声明部分进行声明。

声明变量的语法如下:

variable_name [constant] databyte [not null][:=|default expression]

注意:可以在声明变量的同时给变量强制性的加上not null约束条件,此时变量在初始化时必须赋值。

给变量赋值

给变量赋值有两种方式:

. 直接给变量赋值

x:=200;

y=y+(x*20);

. 通过sql select into 或fetch into给变量赋值

select sum(salary),sum(salary*0.1)

into total_salary,tatal_commission

from employee

where dept=10;

常量

常量与变量相似,但常量的值在程序内部不能改变,常量的值在定义时赋予,,他的声明方式与变量相似,但必须包括关键字constant。常量和变量都可被定义为sql和用户定义的数据类型。

zero_value constant number:=0;

这个语句定了一个名叫zero_value、数据类型是number、值为0的常量。

标量(scalar)数据类型

标量(scalar)数据类型没有内部组件,他们大致可分为以下四类:

. number

. character

. date/time

. boolean

表1显示了数字数据类型;表2显示了字符数据类型;表3显示了日期和布尔数据类型。

表1 scalar types:numeric

datatype

range

subtypes

description

binary_integer

-214748-2147483647

natural

natural

npositive

positiven

signtype

用于存储单字节整数。

要求存储长度低于number值。

用于限制范围的子类型(subtype):

natural:用于非负数

positive:只用于正数

naturaln:只用于非负数和非null值

positiven:只用于正数,不能用于null值

signtype:只有值:-1、0或1.

number

1.0e-130-9.99e125

dec

decimal

double

precision

float

integeric

int

numeric

real

smallint

存储数字值,包括整数和浮点数。可以选择精度和刻度方式,语法:

number[([,])]。

缺省的精度是38,scale是0.

pls_integer

-2147483647-2147483647

与binary_integer基本相同,但采用机器运算时,pls_integer提供更好的性能 。

表2 字符数据类型

datatype

rang

subtype

description

char

最大长度32767字节

character

存储定长字符串,如果长度没有确定,缺省是1

long

最大长度2147483647字节

存储可变长度字符串

raw

最大长度32767字节

用于存储二进制数据和字节字符串,当在两个数据库之间进行传递时,raw数据不在字符集之间进行转换。

longraw

最大长度2147483647

与long数据类型相似,同样他也不能在字符集之间进行转换。

rowid

18个字节

与数据库rowid伪列类型相同,能够存储一个行标示符,可以将行标示符看作数据库中每一行的唯一键值。

varchar2

最大长度32767字节

stringvarchar

与varchar数据类型相似,存储可变长度的字符串。声明方法与varchar相同

表3 date和boolean

datatype

range

description

boolean

true/false

存储逻辑值true或false,无参数

date

01/01/4712 bc

存储固定长的日期和时间值,日期值中包含时间

lob数据类型

lob(大对象,large object) 数据类型用于存储类似图像,声音这样的大型数据对象,lob数据对象可以是二进制数据也可以是字符数据,其最大长度不超过4g。lob数据类型支持任意访问方式,long只支持顺序访问方式。lob存储在一个单独的位置上,同时一个”lob定位符“(lob locator)存储在原始的表中,该定位符是一个指向实际数据的指针。在pl/sql中操作lob数据对象使用oracle提供的包dbms_lob.lob数据类型可分为以下四类:

. bfile

. blob

. clob

. nclob

操作符

与其他程序设计语言相同,pl/sql有一系列操作符。操作符分为下面几类:

. 算术操作符

. 关系操作符

. 比较操作符

. 逻辑操作符

算术操作符如表4所示

operator

operation

+  加

-  减

/  除

*  乘

** 乘方

关系操作符主要用于条件判断语句或用于where子串中,关系操作符检查条件和结果是否为true或false,表5是pl/sql中的关系操作符

operator

operation

<

小于操作符

<=

小于或等于操作符

>

大于操作符

>=

大于或等于操作符

=

等于操作符

!=

不等于操作符

不等于操作符

:=

赋值操作符

表6 显示的是比较操作符

operator

operation

is null

如果操作数为null返回true

like

比较字符串值

between

验证值是否在范围之内

in

验证操作数在设定的一系列值中

表7.8显示的是逻辑操作符

operator

operation

and

两个条件都必须满足

or

只要满足两个条件中的一个

not

取反

执行部分

执行部分包含了所有的语句和表达式,执行部分以关键字begin开始,以关键字exception结束,如果exception不存在,那么将以关键字end结束。分号分隔每一条语句,使用赋值操作符:=或select into或fetch into给每个变量赋值,执行部分的错误将在异常处理部分解决,在执行部分中可以使用另一个pl/sql程序块,这种程序块被称为嵌套块

所有的sql数据操作语句都可以用于执行部分,pl/sql块不能再屏幕上显示select语句的输出。select语句必须包括一个into子串或者是游标的一部分,执行部分使用的变量和常量必须首先在声明部分声明,执行部分必须至少包括一条可执行语句,null是一条合法的可执行语句,事物控制语句commit和rollback可以在执行部分使用,数据定义语言(data definition language)不能在执行部分中使用,ddl语句与execute immediate一起使用或者是dbms_sql调用。

执行一个pl/sql块

sql*plus中匿名的pl/sql块的执行是在pl/sql块后输入/来执行,如下面的例子所示:

declare

v_comm_percent constant number:=10;

begin

update emp

set comm=sal*v_comm_percent

where deptno=10;

end

sql>/

pl/sql procedure successfully completed.

sql>

命名的程序与匿名程序的执行不同,执行命名的程序块必须使用execute关键字:

create or replace procedure update_commission

(v_dept in number,v_pervent in number default 10) is

begin

update emp

set comm=sal*v_percent

where deptno=v_dept;

end

sql>/

procedure created

sql>execute update_commission(10,15);

pl/sql procedure successfully completed.

sql>

如果在另一个命名程序块或匿名程序块中执行这个程序,那么就不需要execute关进字。

declare

v_dept number;

begin

select a.deptno

into v_dept

from emp a

where job='president'

update_commission(v_dept);

end

sql>/

pl/sql procedure successfully completed

sql>

控制结构

控制结构控制pl/sql程序流程的代码行,pl/sql支持条件控制和循环控制结构。

语法和用途

if..then

语法:

if condition then

statements 1;

statements 2;

....

end if

if语句判断条件condition是否为true,如果是,则执行then后面的语句,如果condition为false或null则跳过then到end if之间的语句,执行end if后面的语句。

if..then...else

语法:

if condition then

statements 1;

statements 2;

....

else

statements 1;

statements 2;

....

end if

如果条件condition为true,则执行then到else之间的语句,否则执行else到end if之间的语句。

if 可以嵌套,可以在if 或if ..else语句中使用if或if..else语句。

if (a>b) and (a>c) then

g:=a;

else

g:=b;

if c>g then

g:=c;

end if

end if

if..then..elsif

语法:

if condition1 then

statement1;

elsif condition2 then

statement2;

elsif condition3 then

statement3;

else

statement4;

end if;

statement5;

如果条件condition1为true则执行statement1,然后执行statement5,否则判断condition2是否为true,若为true则执行statement2,然后执行statement5,对于condition3也是相同的,如果condition1,condition2,condition3都不成立,那么将执行statement4,然后执行statement5。

循环控制

循环控制的基本形式是loop语句,loop和end loop之间的语句将无限次的执行。loop语句的语法如下:

loop

statements;

end loop

loop和end loop之间的语句无限次的执行显然是不行的,那么在使用loop语句时必须使用exit语句,强制循环结束,例如:

x:=100;

loop

x:=x+10;

if x>1000 then

exit;

end if

end loop;

y:=x;

此时y的值是1010.

exit when语句将结束循环,如果条件为true,则结束循环。

x:=100;

loop

x:=x+10;

exit when x>1000;

x:=x+10;

end loop;

y:=x;

while..loop

while..loop有一个条件与循环相联系,如果条件为true,则执行循环体内的语句,如果结果为false,则结束循环。

x:=100;

while x<=1000 loop

x:=x+10;

end loop;

y=x;

for...loop

语法:

for counter in [reverse] start_range....end_range loop

statements;

end loop;

loop和while循环的循环次数都是不确定的,for循环的循环次数是固定的,counter是一个隐式声明的变量,他的初始值是start_range,第二个值是start_range+1,直到end_range,如果start_range等于end _range,那么循环将执行一次。如果使用了reverse关键字,那么范围将是一个降序。

x:=100;

for v_counter in 1..10 loop

x:=x+10;

end loop

y:=x;

如果要退出for循环可以使用exit语句。

标签

用户可以使用标签使程序获得更好的可读性。程序块或循环都可以被标记。标签的形式是。

标记程序块

[declare]

... ... ...

begin

........

[exception]

.......

end label_name

标记循环

loop

.........

loop

..........

loop

....

exit outer_loop when v_condition=0;

end loop innermost_loop;

..........

end loop inner_loop;

end loop outer_loop;

goto语句

语法:

goto label;

执行goto语句时,控制会立即转到由标签标记的语句。pl/sql中对goto语句有一些限制,对于块、循环、if语句而言,从外层跳转到内层是非法的。

x :=100;

for v_counter in 1..10 loop

if v_counter =4 then

goto end_of_loop

end if

x:=x+10;

null

end loop

y:=x;

注意:null是一个合法的可执行语句。

嵌套

程序块的内部可以有另一个程序块这种情况称为嵌套。嵌套要注意的是变量,定义在最外部程序块中的变量可以在所有子块中使用,如果在子块中定义了与外部程序块变量相同的变量名,在执行子块时将使用子块中定义的变量。子块中定义的变量不能被父块引用。同样goto语句不能由父块跳转道子块中,反之则是合法的。

《outer block》

declare

a_number integer;

b_number integer;

begin

--a_number and b_number are available here

declare

c_number integer

b_number number(20)

begin

c_number:=a_number;

c_number=outer_block.b_number;

end sub_block;

end out_block;

小结

我们在这篇文章中介绍了pl/sql的基础语法以及如何使用pl/sql语言设计和运行pl/sql程序块,并将pl/sql程序整合到oracle服务器中,虽然pl/sql程序作为功能块嵌入oracle数据库中,但pl/sql与oracle数据库的紧密结合使得越来越多的oracle数据库管理员和开发人员开始使用pl/sql。

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

oracle常用script

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

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

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

char,varchar,varchar2类型的区别与使用

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

区别:

1.char的长度是固定的,而varchar2的长度是可以变化的, 比如,存储字符串”abc\",对于char (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的varchar2 (20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时,按实际长度存储。

2.char的效率比varchar2的效率稍高。

3.目前varchar是varchar2的同义词。工业标准的varchar类型可以存储空字符串,但是oracle不这样做,尽管它保留以后这样做的权利。oracle自己开发了一个数据类型varchar2,这个类型不是一个标准的varchar,它将在数据库中varchar列可以存储空字符串的特性改为存储null值。如果你想有向后兼容的能力,oracle建议使用varchar2而不是varchar。

何时该用char,何时该用varchar2?

char与varchar2是一对矛盾的统一体,两者是互补的关系.

varchar2比char节省空间,在效率上比char会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率'。

varchar2虽然比char节省空间,但是如果一个varchar2列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移'(row migration)现象,而这造成多余的i/o,是数据库设计和调整中要尽力避免的,在这种情况下用char代替varchar2会更好一些。

保持Oracle数据优良性能的若干诀窍

大数据的基础安全保障论文

如何掌握 Oracle 中的时间间隔型数据数据库教程

零基础自学英语方法

小学语文基础答题方法

优化Oracle库表设计的若干方法数据库教程

护肤方法:基础护肤的7个步骤

高三地理零基础怎么学的方法

Redis中统计各种数据大小的方法

飞机实时监控数据挖掘方法研究

基于Oracle的国土资源基础数据组织方法(整理8篇)

欢迎下载DOC格式的基于Oracle的国土资源基础数据组织方法,但愿能给您带来参考作用!
推荐度: 推荐 推荐 推荐 推荐 推荐
点击下载文档 文档为doc格式
点击下载本文文档