oracle子程序和包
- 格式:doc
- 大小:23.50 KB
- 文档页数:5
ORACLE 数据库管理系统介绍的特点:可移植性 ORACLE采用C语言开发而成,故产品与硬件和操作系统具有很强的独立性.从大型机到微机上都可运行ORACLE的产品.可在UNIX、DOS、Windows等操作系统上运行.可兼容性由于采用了国际标准的数据查询语言SQL,与IBM 的SQL/DS、DB2等均兼容.并提供读取其它数据库文件的间接方法.可联结性对于不同通信协议,不同机型及不同操作系统组成的网络也可以运行ORAˉCLE数据库产品.的总体结构1ORACLE的文件结构一个ORACLE数据库系统包括以下5类文件:ORACLE RDBMS的代码文件.数据文件一个数据库可有一个或多个数据文件,每个数据文件可以存有一个或多个表、视图、索引等信息.日志文件须有两个或两个以上,用来记录所有数据库的变化,用于数据库的恢复.控制文件可以有备份,采用多个备份控制文件是为了防止控制文件的损坏.参数文件含有数据库例程起时所需的配置参数.2ORACLE的内存结构一个ORACLE例程拥有一个系统全程区SGA和一组程序全程区PGA.SGASystem Global Area包括数据库缓冲区、日志缓冲区及共享区域.PGAProgram Global Area是每一个Server进程有一个.一个Server进程起动时,就为其分配一个PGA区,以存放数据及控制信息.3ORACLE的进程结构ORACLE包括三类进程:①用户进程用来执行用户应用程序的.②服务进程处理与之相连的一组用户进程的请求.③后台进程 ORACLE为每一个数据库例程创建一组后台进程,它为所有的用户进程服务,其中包括:DBWRDatabase Writer进程,负责把已修改的数据块从数据库缓冲区写到数据库中.LGWRLog Writer进程,负责把日志从SGA中的缓冲区中写到日志文件中.SMONSystem Moniter进程,该进程有规律地扫描SAG进程信息,注销失败的数据库例程,回收不再使用的内存空间.PMONProcess Moniter进程,当一用户进程异常结束时,该进程负责恢复未完成的事务,注销失败的用户进程,释放用户进程占用的资源.ARCHARCHIVER进程.每当联机日志文件写满时,该进程将其拷贝到归档存储设备上.另外还包括分布式DB中事务恢复进程RECO和对服务进程与用户进程进行匹配的Dnnn进程等.的逻辑结构构成ORACLE的数据库的逻辑结构包括:1表空间25种类型的段segment①数据段;②索引段;③回滚rollbock段;④临时段;⑤自举bootstrap段.段的分配单位叫范围Extent表空间Tablespace 一个数据库划分成的若干逻辑部分称为表空间.一个数据库可以有一个或多个表空间,初始的表空间命名为SYSTEM,每一个逻辑表空间对应于一个或多个物理文件.DBA使用表空间做以下工作:控制数据库对象,如表、索引和临时段的空间分配.为数据库用户设置空间配额.利用个别表空间的在线或离线,控制数据的可用性.后备或恢复数据.通过分配空间,以改进性能.在每个数据库中都存在SYSTEM表空间,它在建立数据库时自动建立.在该表空间中,包含数据库的数据字典,其中存储全部数据库对象的名字和位置.SYSTEM表空间总是在线的,像其它表空间一样,可以通过增加新的数据库文件来扩大.一个表空间可包含许多表和索引.但一个表和索引不能跨越表空间,可跨越组成表空间的文件.在DB的打开的情况下,DBA利用ALTER TABLESPACE 语句,可以实施表空间的在线或离线.SYSTEM表空间必须在线.表空间离线有下列原因:一般为了使部分数据库不能使用,而允许正常存取数据库其余部分.执行表空间离线备份.一个离线的表空间,不能被应用用户读或编辑.可以增加数据文件扩大已有的表空间,也可增加新的表空间使数据库容量增大,或分配空间给某个应用.使用ALFER TABLESPACE ADD FILE语句将另一个数据文件加入到已存在表空间中.使用CREATE TABLESPACE语句可建立一个新的表空间.段segment 表空间中的全部数据存储在以段划分的数据库空间中.一个段是分配给数据库用于数据存储的范围的集合.数据可以是表、索引或RDBMS所需要的临时数据.段是表空间的下一个逻辑存储的级别.一个段不能跨越一个表空间,但可跨越表空间内的文件.一个数据库最多需要五种段类型:数据段一个包含一个表或聚集的全部数据,一个表或聚集总有一个单个数据段.索引段一个索引段包含对一个表或聚集建立的一个索引的全部索引数据.一个表可以有一个、多个或者没有索引段,取决于它所拥有的索引个数.一个聚集必须至少有一个索引段,即在聚集码上建立聚集索引.回滚段每个DB有一个或多个回滚段.一个回滚段是DB 的一部分,它记录在某一情况下被撤消的动作.回滚段用于事务控制和恢复.临时段在处理查询时,ORACLE需要临时工作空间,用于存储语句处理的中间结果,这个区称为临时段.自举段自举段在SYSTEM表空间中,在数据库建立时建立.它包括数据字典定义,在数据库打开时装入.4.用户数据库对象由用户建立的对象驻留在表空间中,含有真正的数据.数据库对象有表、视图、聚集、索引、伪列和序号生成器.1聚集Cluster 聚集是存储数据的一种可选择的方法.聚集包括存储在一起的一组表,它们共享公共列并经常一起使用.由于内容相关并且物理地存储在一起,存取时间得到改进,存储空间可以减少.聚集是一种优化措施.聚集对性能的改进,依赖于数据的分布和SQL操作的内容.特别是使用聚集对连接非常有利.可以明显地提高连接的速度.建立聚集命令的基本格式:SQL>CREATE CLUSTER〈聚集名〉列定义,…;利用聚集建立表命令基本格式:SQL>CREATE TABLE〈新表名〉列定义,…CLUSTER〈聚集名〉聚集列;在聚集码上必须建立一个聚集索引,对于每一数据块上每个聚集码值有一索引项.这个索引必须在DML语句对聚集表操作前建立.建立索引的语句是:CREATE INDEX索引名ON CLUSTER聚集名;2序号生成器序号SEQUENCE生成器为表中的单列或多列生成顺序号.利用序号可自动地生成唯一主码.使用SQL语句定义序号,给出一些信息如序号名、是升序或降序、每个序号间的间隔和其它信息.所有序号存储在数据字典表中.所有序号定义存储在数据字典的SEQUENCE表中.用户可以通过字典视图USER-SE-QUENCES、ALL-SEQUENCES和DBA-SEQUENCES查询和存取.建立序号生成器的语句是: CREATE SEQUENCE序号生成器名其它选项.一旦序号生成器S被定义.可用来引用S序号生成器的当前值.用产生下一个新的序号并加以引用.3伪列伪列的行为像表的一列,但不真正存在于表中,在查询时可引用伪列,但伪列不能插入、删除或修改.5.数据字典数据字典ORACLE RDBMS最重要的部分之一.数据字典含有一组系统定义的表,只能读,是数据库的引用指南.它可提供以下信息:ORACLE用户的用户名;每个用户被授予的权限和角色;实体的名字和定义;完整性约束为数据库实体分配的空间;通用的数据库结构;审计信息;触发子程序等的存储.数据字典是以表和视图构成的,像其它数据库数据一样,可用SQL语言查询数据字典.数据字典在DB建立时建立.每当DB进入操作,数据字典就由ORACLE RDBMS负责修改.数据库建立时有两个默认DBA 用户:SYS、SYSTEM.SYS持有基本表中的数据.数据字典包含一组基表和相关的视图,可分为以下几类: 类描述DBA-×××只有DBA可存取的视图,给出数据库中定义的任何实体的信息USER-×××对任何用户可用的视图,给出他们自己的实体的信息ALL-×××对任何用户可用的视图,给出用户可存取的所有实体的信息其中×××代表表名或视图名下面列出的是一些常用的表或视图的名称.1DTAB 描述了组或数据字典的所有表.2TAB 用户建的所有基本表、视图和同义词.3COL 用户创建基本表的所有列的信息.4SYNONYMS 用户可存取的同义名词、专用名和公用名.5CATALOG 用户可存取的表、视图、同义词、序列.6CONSTRAINTS 用户可存取的约束.7INDEXES 用户可存取的表和聚集的序列.8OBJECTS 用户可存取的对象.9TABLES 用户可存取的表.10USERS 查看当前全部用户.11VIEWS 查看用户可存取的视图.12SYSTABAUTH 用户对数据对象的使用权限.可以用SQL>SELECTFROM〈字典表名或视图名〉WHERE〈条件〉来读取有关信息.可以用SQL>DESCRIBE〈表名〉来查看表的结构定义.但是数据库字典的结构不可改.用DESCRIBE命令还可以查看视图及过程的定义.的SQL、PL/SQL与SQLPLUS作为ORACLE数据库核心的SQL语言是ANSI和ISO的标准SQL的扩充.用来存储、检索和维护数据库中的信息,并控制对数据库的存取事务.由于RDBMS执行SQL语句时,是一次只执行一条语句,它是非过程化的.这就使得单条的SQL语句使用方便,功能强大.用户只需说明操作目的,不必关心具体操作的实现方法.但在实际数据库应用开发中,往往要依据前一步对数据库操作的结果或上一个事务提交的情况来确定下一步的操作.故ORACLE推出了一种PL/SQL工具,它扩充了SQL语句,使之具有可进行过程化编程的能力,如循环、分支功能.PL/SQL可支持变量和常量的使用.例如在SELECT查询语句的where子句中可以使用变量来书写条件表达式.SQLPLUS是ORACLE用来存储、查询、操纵、控制和报告数据库中信息的一个交互式工具.它是一种集编辑、调试、运行于一体的开发环境.在SQLPLUS的这种运行环境下,既可以使用SQL命令、PL/SQL语句、及SQLPLUS自己提供的命令,又可以运行由上述三类命令或语句编辑而成的命令文件.SQLPLUS提供的附加命令主要用来编辑、运行上述三类命令及命令文件和对查询结果进行格式化输出等功能.7.数据库系统的管理ORACLE作为一个大型的数据系统,通常包含很多用户的数据.在应用开发过程中,有许许多多的各类人员进行开发和应用.所以必须要求有人对数据库系统进行临时管理,并进行数据的备份等工作.这种人被称为数据库管理员Data Base Administrator.他们必须理解数据库系统管理,清楚数据库包含的数据内容、运行状况等.一般说来,DBA不是指具体的人,而是指对数据库可以行使DBA特权的用户.DBA具有如下责任:1ORACLE服务器和客户工作站软件的安装和升级;2创建基本的数据库存储结构表空间;3创建基本的数据库客体表、视图、索引;4修改数据库结构;5给用户授权,维护系统安全;6控制和管理用户对数据库的访问;7监视和优化数据库的性能;8计算数据库信息的后备和恢复;9后备和恢复数据库;10构造ORACLE服务器,如创建数据库链、客体同义词等.而应用开发人员须完成:1应用程序设计;2应用的数据库结构设计和修改;3为DBA提供必要的信息;4完成应用程序的开发.接下来就DBA的具体工作及所使用的工具、命令作一下介绍.8.数据库的安装安装ORACLE之前,必须首先要确定拟安装ORACLE DBMS 的计算机系统是否已满足了该机型、版本的ORACLE核心所要求的硬件、软件及网络协议条件.确保有足够的外存空间和RAM空间.比如在SUN工作站,Solaris操作系统,一般有16M内存空间,200~300MB外存空间就可装载ORACLE核心及各种字符或图形开发工具,并可满足今后用户对资源的需求.ORACLE的安装分三步进行:①安装前准备工作,准备外存空间,建立ORACLE用户及用户组,创建修改必要的系统文本文件;②安装使用ORACLE 安装程序进行安装,回答安装程序提出的问题,选择特定ORACLE产品;③安装后参数调整和测试.9.启停数据库1初始的ORACLE数据库:初始的ORACLE数据库命令为ORACLE,由两个表空间构成:①SYSTEM表空间,存放数据字典的所有表和视图;②USERS表空间,存放所有自动生成的样本表,如EMP、DEPT等等.ORACLE初始数据库应有下列文件;①、,为SYSTEM表空间的数据库文件;②、,为USERS表空间的数据文件;③、,为数据库的重做日志Redo Log文件;④,为数据库的控制文件.初始数据库自动生成四个用户名:①用户名为SYS,口令为CHNGE-ON-INSTALL;SYS拥有数据字典中的所有基本表和视图.为维护数据字典的完整性,SYS的表既不能修改,也不能创建.SYS是有DBA权限的用户.②用户名为SYSTEM,口令为MANAGER,是DBA权限的用户.③SCOTT,具有CONNECT和RESOURCE权限,使用USERS表空间,口令为TIGER,拥有所有样本表.④PUBLIC,用于对表和视图的公共存取.当用户为一数据库客体授权给用户PUBLIC时,则任意用户都能访问该客体的数据.2初始化和构造文件:在ORACLE数据库中,存在两个重要文件:①初始化文件,当数据库启动时用于对ORACLE服务器进行初始设置,该文件存于执行SQLDBA的机器上;②配置文件,在许多场合由客户机上的工具使用,如用于建立与ORACLE服务器的正确连接.该文件存于执行客户工具的机器上.在ORACLE服务器上也有CONˉ,也相当有用,如正确标识特定程序文件所在子目录.3SQLDBA的进入和退出进入SQLDBA的过程随系统不同而不同,也依赖于在哪进入SQLDBA,细节参见有关手册.一旦进入了SQLDBA,则屏幕显示SQLDBA的提示符:SQLDBA〈CR〉SQLDBA〉它提示你健入SQLDBA的命令.它可接收SQL语句及数据库管理命令,前者必须以“;”结束,后者不需后缀“;”.要退出SQLDBA则键入EXIT命令:SQLDBA>EXIT〈CR〉4数据库的启动和停止只有在数据库被启动以后,用户才可以访问数据库.用户要正常结束对数据库的操作也必须执行停止数据库命令,以便正确保存缓冲区中的数据.非正常结束可能造成数据丢失.启动ORACLE数据库,需要完成启动数据库例程、安装数据库和打开数据库三个任务.停止数据库是逆序的三个任务,即关闭数据库、卸载数据库和停止数据库例程.启动的步骤为:进入SQLDBA,这在上面已介绍过.以internal身份连到数据库上,以便对数据库进行起、停操作.SQLDBA>CONNECT INTERNAL↓SQLDBA>STARTUP↓至于执行带参数的STARTUP可用于数据库备份.停止数据库命令为:SQLDBA>SHUTDOWNABORTIMMEDIATENORMAL其中:使用ABORT参数,则立即停止数据库;使用IMMEDIATE则回滚未完成事务,停止数据库;使用NORMAL则直到所有数据库用户都撤去在数据库上的登录之后,再停止数据库.10.数据库的管理ORACLE核心在安装过程中,已经建一个数据库,DBA也可以再建立其它数据库或修改已有的数据库定义.1创建数据库数据库的创建就是准备若干个操作系统文件,使其能够作为一个ORACLE数据库运转,用于数据存储.然而,对于一个数据库系统来说,无论其数据库由多少个数据库文件组成或被多少个例程所存取,数据库需要被创建一次.针对一个现存的数据库进行创建工作,将毁坏先前数据库文件中已经存在的任何数据.2修改数据库配置ORACLE数据库能够处于三种不同的状态,决定了其可用性:①卸载状态数据库当前不与任何例程相联系,DBA用户和普通用户均不能存取.②装载且关闭状态数据库当前已与一个例程相联系,仅DBA用户能够存取进行系统维护.③装载且打开状态数据库当前能够用于正常的数据库操作,DBA用户和普通用户均能够存取.DBA能够利用SQLDBA命令将数据库置成其中的任何一种状态,然后利用SQL语句的ALTER DATABASE改变数据库的状态.DBA能够修改数据库配置的几种方式是:①按共享或排斥方式装载或卸载数据库;②打开或关闭数据库;③添加或取消重做日志文件;④重新命名重做日志文件或数据库文件;⑤设置重做日志文件使用模式.11.表空间的管理ORACLE数据库是一个或多个表空间Tablespace逻辑地组成的,表空间又是若干空间区段逻辑地组成的,而空间区段则是若干连续地址的ORACLE块组成ORACLE块的大小依赖于操作系统.表空间是数据库的逻辑划分,从其物理形式来看,对应着一个或多个操作系统文件.这些操作系统文件可以分布在系统的任何外部存储设备上,ORACLE则管理着这些数据库文件的存储空间,而操作系统对数据库存储空间的分配不作任何干预.表空间容纳着许多数据库实体,诸如表、视图、索引、聚簇、滚回段和临时段等.当用户创建某种数据库实体时,ORACLE RDBMS按ORACLE命令所给出的“存储配置参数”分配相应的存储空间.12.安全管理数据库的安全管理是为了保护数据库以防止非法使用数据库而造成数据的泄露和破坏.ORACLE通过检查用户权力来限制各类用户对数据库的操作权力;再通过对用户某一数据库实体操作权限的验证来保证每一个数据库实体不被非法访问或修改.1建立用户命令可以在SQLPLUS下用SQL命令来建立数据库用户,命令要各式如下:SQL>CREATE USER用户名IDENTIFIED BY口令;2用户权力一个新用户被建立,不意味着他就可以存取数据库中的数据,必须由DBA对它进行授权.对数据库的操作有三种权力,下面就介绍一下用户权力及其含义:CONNECT权力用户为访问ORACLE数据库和任何实用程序,都需要具有CONNECT权力,具有CONNECT权力的用户具有唯一的用户名称和口令.具有CONNECT权力的用户可以做如下工作:①访问ORACLE;②查询SELECT别的用户建立的表或视图,前提是表或视图的所有者别的用户已授与该用户对该表进行SELECT的权力;③建立视图和同义词RESOURCE权力若同时具有CONNECT及RESOURE权力,除具有CONNECT中的权力外还有:①建立CREATE表、索引、聚集;②您对自己拥有的客体或其他用户授予您对其客体所拥有的权力必须具有传递权可以授与GRANT别的用户或收回REVOKE这些权力,即有传递与收回权.DBA通过ORACLE的SQLPlus的GRANT语句来为用户授权,其格式为:SQL>GRANT{CONNECT|RESOURCE|DBA|TO<用户名>INENTIFIEDBY口令;SQL>REVOKE{CONNECT|RESOURCE|DBA}FROM<用户名>;当用户被取消了DBA权力,还拥有RESTORE和CONNECT 权力.取消了RESTORE权力,还拥有CONNECT权力.取消了CONNECT权力,用户对数据库不能进行任何操作.如果一个用户已被取消了CONNECT权力,但属于这个用户的表继续存在,当它重新获得数据库访问权时,可以重新使用这些表.3数据库实体的授权当一个用户用ORACLE命令创建了一个实体,即表、视图或序号生成器以后,他就成为该实体的所有者,可以就该实体向其他用户授权,以便其他用户也可对该实体进行授权所允许的操作.4通过查看数据字典表SYSTABAUTH可以了解有关表的权限.SQL>SELECTfrom systabauth;5ORACLE还提供了一种审计机制,来记录对数据库的操作,以便监视用户对数据库施加的动作.利用审计功能,DBA 可以:①监视成功或失败的注册或注销;②监视GRANT和REVOKE;③禁止或允许写入审计追踪表;④为数据库设置缺省审计选择项.例如:DBA可以审计:①存取数据库不成功的企图;②存取未授权表的各种企图;③任何用户GRANT和REVOKE语句的使用情况.13.完整性约束数据库的完整性是指数据的正确性和相容性.DBMS必须提供一种机制来保证数据库中数据的完整性,这种功能称为完整性检查.数据的完整性是为了防止数据库存在不符合语义的数据,防止错误信息输入和输出.一般数据库系统通过定义完整性约束条件来规定数据的完整性.数据的约束条件是语义的体现,这些完整性约束将作为模式的一部分存到数据字典中.的实用程序ORACLE产品的核心,包括数据管理核心模块及帮助数据库管理员DBA和用户维护、监视、数据输入和输出实用程序,主要的有:Imp/Exp数据备份及恢复工具、ODL将外部文件转换成ORACLE数据库数据的工具及SQLDBA管理ORACLE服务器及其上数据库的交互式工具.。
oracle 收集统计信息语句在Oracle数据库中,收集统计信息是一项重要的管理任务,它可以帮助优化查询性能、确定索引使用和更新数据库统计信息。
收集统计信息是通过执行统计分析来实现的,Oracle提供了一些语句和工具来完成这项任务。
1. DBMS_STATS包Oracle提供了DBMS_STATS包,它包含了一些程序单元(也称为子程序或函数),用于收集数据库对象的统计信息。
1.1 收集表统计信息使用DBMS_STATS包的GATHER_TABLE_STATS子程序可以收集表的统计信息。
该子程序可以指定需要收集统计信息的表的名字、模式和分区标识等。
```SQLEXECDBMS_STATS.GATHER_TABLE_STATS(ownname=>'SCOTT', tabname=>'EMP', cascade=>TRUE);```1.2 收集索引统计信息使用DBMS_STATS包的GATHER_INDEX_STATS子程序可以收集索引的统计信息。
该子程序可以指定需要收集统计信息的索引的名字、模式和分区标识等。
```SQLEXECDBMS_STATS.GATHER_INDEX_STATS(ownname=>'SCOTT', indname=>'EMP_IDX', cascade=>TRUE);```1.3 收集列统计信息使用DBMS_STATS包的GATHER_COLUMN_STATS子程序可以收集列的统计信息。
该子程序可以指定需要收集统计信息的列所在的表的名字、模式和分区标识等。
```SQLEXECDBMS_STATS.GATHER_COLUMN_STATS(ownname=>'SCOTT', tabname=>'EMP', colname=>'EMP_NAME', cascade=>TRUE);```2. ANALYZE语句除了使用DBMS_STATS包来收集统计信息,Oracle还提供了ANALYZE语句用于收集统计信息。
Oracle笔试题库附参考答案1.下列不属于ORACLE的逻辑结构的是(C)1. 区2. 段3. 数据⽂件4. 表空间2. 下⾯哪个⽤户不是ORACLE缺省安装后就存在的⽤户(A)A . SYSDBAB. SYSTEMC. SCOTTD. SYS3 下⾯哪个操作会导致⽤户连接到ORACLE数据库,但不能创建表(A)1. 授予了CONNECT的⾓⾊,但没有授予RESOURCE的⾓⾊2. 没有授予⽤户系统管理员的⾓⾊3. 数据库实例没有启动4. 数据库监听没有启动1. ( )函数通常⽤来计算累计排名,移动平均数和报表聚合。
A . 汇总B. 分析C 分组、D 单⾏1. 带有(B)字句的SELECT语句可以在表的⼀⾏或多⾏放置排他锁。
A . FOR INSERTB. FOR UPDATEC. FOR DELETED. FOR REFRESH1. 在Oracle中,你以SYSDBA登录,CUSTOMER表位于Mary⽤户⽅案中,下⾯哪条语句为数据库中的所有⽤户创建CUSTOMER表的同义词(B)。
1. CREATE PUBLIC SYNONYM cust ON mary.customer;2. CREATE PUBLIC SYNONYM cust FOR mary.customer;3. CREATE SYNONYM cust ON mary.customer FOR PUBLIC;4. 不能创建CUSTOMER的公⽤同义词。
5.7. 在Oracle中,当FETCH语句从游标获得数据时,下⾯叙述正确的是(C)。
1. 游标打开2. 游标关闭3. 当前记录的数据加载到变量中4. 创建变量保存当前记录的数据8. 在Oracle中,下⾯关于函数描述正确的是(AD)。
1. SYSDATE函数返回Oracle服务器的⽇期和时间2. ROUND数字函数按四舍五⼊原则返回指定⼗进制数最靠近的整数3. ADD_MONTHS⽇期函数返回指定两个⽉份天数的和4. SUBSTR函数从字符串指定的位置返回指定长度的⼦串9. 阅读下⾯的PL/SQL程序块:BEGININSERT INTO employee(salary,last_name,first_name)VALUES(35000,’Wang’,'Fred’);SAVEPOINT save_a;INSERT INTO employee(salary,last_name,first_name)VALUES(40000,’Woo’,'David’);SAVEPOINT save_b;DELETE FROM employee WHERE dept_no=10;SAVEPOINT save_c;INSERT INTO employee(salary,last_name,first_name)VALUES(25000,’Lee’,'Bert’);ROLLBACK TO SAVEPOINT save_c;VALUES(32000,’Chung’,'Mike’);ROLLBACK TO SAVEPOINT save_b;COMMIT;END;运⾏上⾯的程序,哪两个更改永久保存到数据库(CD)。
Oracl e PL/SQL包(package)目录Oracle PL/SQL包(package) (1)一、什么是PL/SQL包 (2)1、PL/SQL包举例 (3)二、PL/SQL包的优点 (5)三、理解包说明 (5)四、理解包体 (7)五、包特性的例子 (8)六、包中私有项和公有项 (14)七、重载包级子程序 (14)八、包STANDARD是如何定义PL/SQL环境的 (15)九、系统包一览 (15)1、关于DBMS_ALERT包 (15)2、关于DBMS_OUTPUT包 (16)3、关于DBMS_PIPE包 (16)4、关于UTL_FILE包 (16)5、关于UTL_HTTP包 (17)十、包编写准则 (17)一、什么是PL/SQL包包就是一个把各种逻辑相关的类型、常量、变量、异常和子程序组合在一起的模式对象。
包通常由两个部分组成:包说明和包体,但有时包体是不需要的。
包说明(简写为spec)是应用程序接口;它声明了可用的类型、变量、常量、异常、游标和子程序,包体(Body)部分完全定义游标和子程序,并对说明中的内容加以实现。
如下例所示,我们可以认为说明部分是一个可选接口,而包体是一个"黑盒"。
我们可以调试、增强或替换一个包体而不同改变接口(包说明)。
我们可以从SQL*Plus中使用CREATE PACKAGE语句来创建一个包。
语法如下:CREATE [OR REPLACE] PACKAGE package_name[AUTHID {CURRENT_USER | DEFINER}]{IS | AS}[PRAGMA SERIALLY_REUSABLE;][collection_type_definition ...][record_type_definition ...][subtype_definition ...][collection_declaration ...][constant_declaration ...][exception_declaration ...][object_declaration ...][record_declaration ...][variable_declaration ...][cursor_spec ...][function_spec ...][procedure_spec ...][call_spec ...][PRAGMARESTRICT_REFERENCES(assertions) ...]END [package_name];[CREATE [OR REPLACE] PACKAGE BODYpackage_name {IS | AS}[PRAGMA SERIALLY_REUSABLE;]在包说明部分声明的内容都是公有的,对应用程序是可见的。
oracle中dbms_output使用例子使用Oracle中的DBMS_OUTPUT包是在PL/SQL代码中显示输出的一种常用技术。
它允许开发人员在程序执行过程中向客户端或工具输出消息、变量值等信息,从而帮助调试和了解代码的执行情况。
在本文中,我将演示如何使用DBMS_OUTPUT包,并提供一些例子来帮助读者理解其用法。
首先,让我们了解一下DBMS_OUTPUT包的基本用法。
该包包含了两个主要的子程序:PUT_LINE和NEW_LINE。
PUT_LINE用于输出一条消息,并将其中的内容显示在一行中。
NEW_LINE则用于在输出中插入一个换行符。
这两个子程序的组合可以用来生成格式清晰的输出。
让我们从一个简单的例子开始。
假设我们有一个名为EMPLOYEES的员工表,其中包含员工的姓名和工资信息。
我们想要编写一个PL/SQL代码来输出员工的姓名和工资。
以下是代码的示例:sqlDECLAREv_name TYPE;v_salary employees.salaryTYPE;BEGINFOR rec IN (SELECT name, salary FROM employees) LOOPv_name := ;v_salary := rec.salary;DBMS_OUTPUT.PUT_LINE('Name: ' v_name ' Salary: 'v_salary);END LOOP;END;/在上面的代码中,我们首先声明了两个变量v_name和v_salary,用于存储从表中获取的姓名和工资的值。
然后,我们使用FOR循环来遍历EMPLOYEES表,并将每个员工的姓名和工资分别赋值给变量。
最后,我们使用DBMS_OUTPUT.PUT_LINE子程序将姓名和工资输出到客户端。
要注意的是,要在PL/SQL代码块中使用DBMS_OUTPUT包,需要先对其进行启用。
可以使用以下语句启用DBMS_OUTPUT包:sqlSET SERVEROUTPUT ON;将上述代码和启用DBMS_OUTPUT的语句一起执行,你将看到如下输出结果:Name: John Salary: 5000Name: Jane Salary: 6000Name: Mark Salary: 5500在添加格式的同时,DBMS_OUTPUT还可以用于调试代码。
采用oracle的dbms_rls包实现数据访问控制在大部份系统中,权限控制主要定义为模块进入权限的控制和数据列访问权限的控制(如:某某人可以进入某个控制,仓库不充许查看有关部门的字段等等)。
但在某些系统中,权限控制又必须定义到数据行访问权限的控制,此需求一般出现在同一系统,不同的相对独立机构使用的情况。
(如:集团下属多个子公司,所有子公司使用同一套数据表,但不同子公司的数据相对隔离), 绝大多数人会选择在View加上Where子句来进行数据隔离。
此方法编码工作量大、系统适应用户管理体系的弹性空间较小,一旦权限逻辑发生变动,就可能需要修改权限体系,导致所有的View都必须修改。
本文探讨的使用Oracle提供的Policy管理方法来实现数据行的隔离注意:这里的policy是在9i上测试,8i的policy是不同9i的,但是原理是一样的.(1)建立测试数据表(t_policy):CREATE TABLE T_POLICY(T1 VARCHAR2(10 BYTE),T2 NUMBER(10));insert into t_policy values('a',10);insert into t_policy values('b',20);insert into t_policy values('c',30);commit;(2)建立测试policy的函数:CREATE OR REPLACE function Fn_GetPolicy(P_Schema In Varchar2,P_Object In Varchar2) return varchar2 isResult varchar2(1000);beginResult:='t2 not in (10)';return(Result);end Fn_GetPolicy;/(3)加入policy:declareBeginDbms_Rls.Add_Policy(Object_Schema =>'niegc', --数据表(或视图)所在的Schema名称Object_Name =>'T_Policy', --数据表(或视图)的名称Policy_Name =>'T_TestPolicy', --POLICY的名称,主要用于将来对Policy的管理Function_Schema =>'NIEGC', --返回Where子句的函数所在Schema名称Policy_Function =>'Fn_GetPolicy', --返回Where子句的函数名称Statement_Types =>'Select,Insert,Update,Delete', --要使用该Policy的DML类型,如'Select,Insert,Update,Delete'Update_Check =>True, --仅适用于Statement_Type为'Insert,Update',值为'True'或'False'Enable =>True --是否启用,值为'True'或'False');end;注:如果Update_Check设为'True',则用户插入的值不符合Policy_Function返回条件时,该DML执行返回错误信息。
oracle存储过程日志输出语法-概述说明以及解释1.引言1.1 概述在撰写Oracle存储过程时,日志输出是一个非常重要的部分。
通过在存储过程中添加日志输出语句,可以帮助我们实时监控和调试代码,定位错误和异常,提高代码的可维护性和可扩展性。
因此,掌握Oracle存储过程日志输出语法是非常必要的。
本文将首先介绍存储过程的概念和作用。
存储过程是一组预定义的SQL语句集合,经过编译并存储在数据库中。
通过执行存储过程,可以实现复杂的数据处理操作,并且可以在一次调用中执行多条SQL语句。
存储过程具有很多优势,例如可以提高数据库的性能,减少网络通信的开销,保证数据的一致性和完整性,实现业务逻辑的封装和隐藏等。
其次,本文将着重介绍日志输出在存储过程中的重要性。
在开发和维护大型应用系统时,存储过程往往承担着核心的业务逻辑,处理的数据量和业务复杂度都非常大。
因此,为了方便排查和修复问题,在存储过程中添加详细的日志输出是十分必要的。
通过合理的日志输出,可以记录存储过程中每一步的执行情况,包括输入参数、输出结果、执行时间等。
这样,在遇到问题时,我们可以利用日志信息快速定位错误,并进行问题的分析和解决。
最后,本文将重点介绍Oracle存储过程日志输出的语法。
在Oracle 数据库中,我们可以使用dbms_output包提供的一系列过程和函数来实现日志输出。
这些过程和函数可以将指定的文本信息输出到控制台或者日志文件中,方便我们查看和分析。
通过使用合适的日志输出语法,我们可以按照自己的需求输出不同的日志信息,包括调试信息、错误日志、性能统计等。
总之,本文将详细介绍Oracle存储过程日志输出的相关知识和语法。
通过学习和掌握这些内容,我们可以更好地开发和维护存储过程,提高代码的质量和可维护性。
另外,本文还将强调日志输出的必要性,并提出进一步研究的方向,希望能在存储过程的开发和优化中发挥更大的作用。
文章结构是指文章所采用的组织形式和框架,包括文章的大纲、目录以及各部分的内容。
数据库字典数据库字典1.概念数据字典是oracle数据库用来存贮数据库结构信息的地方。
数据字典是用来描述数据库数据的组织方式的,由表和视图组成。
数据字典由脚本$oracle_home/rdbms/admin/catalog.sql创建。
2.分类视图有三种实例:user_*(当前用户所拥有对象的有关信息),all_*(当前用户可访问对象的信息),dba_*(数据库中所有对象的信息)。
查询数据字典数据时使用大写字母。
可用upper\lower函数转换。
一下以user_*实例举例(如没有user_*,则依次以all_*、dba_*举例)。
3.类别3.1 关系群集、表、视图群集user_clusters 群集user_cluster_hash_expressions 群集使用的群集散列函数user_clu_columns 表列到群集列的映射(无all_*)表和视图user_tables 关系表user_all_tables 表(user_all_tables是user_tables与user_object_tables的集合)user_tab_columns 表列user_tab_comments 表的注释user_col_comments 表和视图的列的注释user_refs 对象类型列的属性和REF列user_partial_drop_tabs 被部分放弃的表user_unused_col_tabs 带有未使用列的表user_updatable_columns 联合视图中更新的列user_views 视图3.2 集合、LOB、对象类型和对象表集合user_coll_types 集合类型user_varrays varray数组类型user_nested_tables 嵌套表大型对象user_lobs LOB对象表类型user_types 对象类型user_type_attrs 对象类型的属性user_type_methods 对象类型的方法user_object_tables 对象表3.3 oracle视图设备环境all_conext(all_context) 设备环境维数user_dimensions 维数user_dim_hierarchies 维数分层user_dim_levels 维数的级别user_dim_level_key 维数级别的列user_dim_attributes 维数的相关列和维数级之间的关系user_dim_child_of 维数级别之间的关系user_dim_join_key 维数间的联合操作符user_operators 操作符的基本信息user_opancillary 操作符的辅助信息user_oparguments 操作符的参数user_opbindings 操作符的绑定功能摘要user_outlines 摘要user_outline_hints 摘要的提示策略user_policies 表和视图的策略3.4 其他数据库对象数据库任务user_jobs 数据库任务数据库连接user_db_links 数据库连接目录all_directories 目录库user_libraries 库(字典)序列user_sequences 序列替代名user_synonyms 替代名(同义词)3.5 分区和子分区user_part_tables 已分区表user_tab_partitions 表的分区user_tab_subpartitions 表的子分区user_part_indexes 已分区索引user_ind_partitions 索引分区user_ind_subpartitions 索引子分区user_part_lobs 表中的LOB数据分区user_lob_partitions LOB分区user_lob_subpartitions LOB子分区user_part_key_columns 已分区对象的分区关键字列user_subpart_key_columns 使用组合范围/散列法分区的表的子分区关键字列user_part_col_statistics 表分区统计和其他信息user_subpart_col_statistics 表子分区的列统计user_part_histograms 表的分区的直方图user_subpart_histograms 表的子分区的直方图3.6 索引user_indexes 索引user_ind_columns 索引列user_ind_expressions 索引的函数索引表达式user_indextypes 索引类型user_indextype_operators 索引类型支持的操作符3.7 实现视图、摘要、快照实现视图user_mviews 物化视图user_mview_logs 物化视图日志user_mview_comments 物化视图注释user_mview_refresh_times 物化视图刷新时间user_mview_analysis 物化视图的附加信息user_mview_detail_relations 物化视图FROM列表的详细关系user_mview_keys 物化视图列(或者GROUP BY子句中的列)user_mview_joins 物化视图WHERE子句中各列间的联合user_mview_aggregates 物化视图选择列表中的成组功能快照user_refresh 快照刷新组user_refresh_children 快照刷新组的对象user_snapshots 快照user_snapshot_logs 快照日志user_snapshot_refresh_time 快照的刷新次数user_registered_snapshots 已注册快照all_refresh_dependencies 快照的从属或容器表(只要all一种)摘要user_summaries 摘要user_summary_detail_tables 摘要FROM列表的详细关系user_summary_keys 摘要列(或者GROUP BY子句中的列)user_summary_joins 摘要WHERE子句中各列间的联合user_summary_aggregates 摘要选择列表中的成组功能3.8 子程序、方法、触发器子程序user_procedures 子程序名(包括过程、函数、包)user_arguments 子程序参数(包括过程、函数、包)方法user_method_params 对象类型方法的参数user_method_results 对象类型方法的返回值触发器user_triggers 触发器user_trigger_cols 触发器的列3.9 源代码和编译错误源代码user_source 包,包体,函数,过程,对象类型,对象类型体的源代码编译错误user_errors 视图和包,包体,函数,过程的编译错误3.10 相关和限制相关user_dependencies 对象之间的相关(引用)限制user_constraints 表的限制(约束)user_cons_columns 约束的列user_cons_obj_columns3.11 统计和审计统计user_ustats 对象的统计user_tab_col_statistics 表列的统计user_tab_histograms 表和视图的直方图user_associations 数据库对象的用户自定义统计审计all_def_audit_opts 对象的默认审计选项audit_actions 审计跟踪类型码的说明3.12 权限和授权系统权限user_sys_privs 用户系统权限表权限user_tab_privs 授予作为拥有者、授权者、权限受让者对象的权限user_tab_privs_made 授予当前用户对象的权限all_tab_privs_recd 授予作为权限受让者的用户对象的权限列权限user_col_privs 授予作为拥有者、授权者、或受让者的用户的可授访问表或视图列的权限user_col_privs_made 授予当前用户表或视图列的权限user_col_privs_recd 授予作为权限受让者用户表或视图列权限4.属性表(视图)的属性(列)信息查看sql如下(以视图user_coll_types举例):select lower(column_name) column_name,nullable,decode(data_type,'VARCHAR2',data_type ||'('||char_length||')',data_type) data_type from dba_tab_columns where lower(table_name)='user_coll_types' order by column_id;--》调整类型select lower(column_name) column_name,nullable,data_type||'('||data_length||')' data_type from dba_tab_columnswhere lower(table_name)='user_coll_types' order by column_id;4.1 集合、LOB、对象类型和对象表1.集合user_coll_types 集合类型user_varrays varray数组类型user_nested_tables 嵌套表user_coll_types列是否为空类型说明type_name N VARCHAR2(30) 集合名称coll_type N VARCHAR2(30) 集合类型,可以是表或可变数组upper_bound Y NUMBER 数组类型元素的最大上限elem_type_mod Y VARCHAR2(7) 元素类型修改符(如REF)elem_type_owner Y VARCHAR2(30) 元素类型的拥有者(只在与集合自身的拥有者不同时有效)elem_type_name Y VARCHAR2(30) 元素类型的名称length Y NUMBER 如果元素类型是CHAR或VARCHAR2,则为其长度precision Y NUMBER 如果元素是NUMBER类型,则为精度scale Y NUMBER 如果元素是NUMBER类型,则为比例character_set_name Y VARCHAR2(44) 在说明了CHARCS或NCHARCS时为字符集名称。
实验: 子程序和包
实验目的
(1)掌握函数和子程序的创建和使用。
(2)掌握带参数的子程序的使用。
(3)掌握包的创建和使用。
实验内容
1、编写一个包emp_package,用来对emp表进行操作。
其中应包含以上几个功能:
(1)编写一个不带参数的过程dept_pro,功能是输出每个部门名称和部门人数,建议使用游标。
SQL> ed
已写入file afiedt.buf
1 create procedure emp_pro
2 is
3 CURSOR dept_cur IS select dname,count(empno)人数from emp,dept
4 where emp.deptno=dept.deptno group by dname;
5 begin
6 for v_dept in dept_cur loop
7 dbms_output.put_line(v_dept.dname||' '||v_dept.人数);
8 end loop;
9* end;
SQL> /
过程已创建。
(2)输入职工编号,得到职工姓名的存储过程或函数emp_pro或emp_fun
CREATE OR REPLACE PROCEDURE emp_pro
(
p_name OUT emp.ename%type,
p_sal OUT emp.sal%type,
p_eno IN emp.empno%type
)
IS
begin
-- Test statements here
select ename,sal into p_name,p_sal
from emp where empno=p_eno;
end;
CREATE OR REPLACE FUNCTION emp_fun(p_eno emp.empno%type)
RETURN emp.ename%type
IS
v_ename emp.ename%type;
begin
-- Test statements here
select ename into v_ename
from emp where empno=p_eno;
return v_ename;
end;
(3)编写一个函数dept_fun,向函数传递一个部门号,如果dept表中不包含这个部门号,则返回”无此部门。
SQL> ed
已写入file afiedt.buf
1 CREATE OR REPLACE FUNCTION dept_fun(v_deptno NUMBER:=&deptno)
2 RETURN dept.dname%type
3 IS
4 v_dname dept.dname%type;
5 begin
6 -- Test statements here
7 select dname into v_dname
8 from dept where deptno=v_deptno;
9 return v_dname;
10 EXCEPTION
11 WHEN NO_DA TA_FOUND THEN
12 DBMS_OUTPUT.PUT_LINE('无此部门');
13* end;
SQL> /
输入deptno 的值: 10
原值1: CREATE OR REPLACE FUNCTION dept_fun(v_deptno NUMBER:=&deptno)
新值1: CREATE OR REPLACE FUNCTION dept_fun(v_deptno NUMBER:=10)
函数已创建。
2、使用EXECUTE、SELECT或PL/SQL程序块来调用包中的过程和函数。
SQL> EXECUTE emp_pro
PL/SQL 过程已成功完成。
SQL> SET SERVEROUTPUT ON
SQL> EXECUTE emp_pro
ACCOUNTING 3
RESEARCH 5
SALES 6
PL/SQL 过程已成功完成。
SQL> select dept_fun(10) from dept;
DEPT_FUN(10)
--------------------------------------------------------------------------------
ACCOUNTING
ACCOUNTING
ACCOUNTING
ACCOUNTING
SQL> select dept_fun(20) from dept;
DEPT_FUN(20)
--------------------------------------------------------------------------------
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SQL> select dept_fun(90) from dept;
select dept_fun(90) from dept
*
第1 行出现错误:
ORA-06503: PL/SQL: 函数未返回值
ORA-06512: 在"SCOTT.DEPT_FUN", line 13
ORA-06512: 在line 1
无此部门
_______________________________________________________________________________ CREATE OR REPLACE PACKAGE BODY emp_pak
IS
PROCEDURE emp_pro1
(
p_name OUT emp.ename%type,
p_sal OUT emp.sal%type,
p_eno IN emp.empno%type
)
IS
begin
-- Test statements here
select ename,sal into p_name,p_sal
from emp where empno=p_eno;
END emp_pro1;
procedure emp_pro2
is
CURSOR dept_cur IS select dname,count(empno) from emp,dept
where emp.deptno=dept.deptno group by dname;
begin
for v_dept in dept_cur loop
dbms_output.put_line(v_dept.dname||' '||v_dept.count(empno) );
end loop;
end emp_pro2;
FUNCTION emp_fun(p_eno emp.empno%type)
RETURN emp.ename%type
IS
v_ename emp.ename%type;
begin
-- Test statements here
select ename into v_ename
from emp where empno=p_eno;
return v_ename;
END emp_fun;
FUNCTION dept_fun(v_deptno NUMBER:=&deptno)
RETURN dept.dname%type
IS
v_dname dept.dname%type;
begin
-- Test statements here
select dname into v_dname
from dept where deptno=v_deptno;
return v_dname;
EXCEPTION
WHEN NO_DATA_FOUND THEN
Return '无此部门';
end dept_fun;
END emp_pak;。