oracle子程序和包
ORACLE数据库管理系统介绍

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_PLSQL教程-第七章

使用这个包执行 DDL 语句可能导致死锁。大多数类似这样的原因是包被用于删除一个你 还正在使用中的过程。
DBMS_SQL 包的组成部分 DBMS_SQL 包使用动态 SQL 访问数据库。
Copyright © Oracle Corporation, 2001. All rights reserved.
用本地动态 SQL (动态 SQL) 你可以用动态 SQL 写 PL/SQL 块。动态 SQL 语句不能嵌入在你的源程序中,但可以存
储在输入到程序或写在程序的字符串中。换句话说,SQL 语句可以在运行时用变量被动态创建。 例如,你可以用动态 SQL 创建对一个表操作的过程,但表的名字直到运行时还不知道,或者 写并且执行一个数据定义语言 (DDL) 语句 (例如 CREATE TABLE),一个数据控制语句 (例 如 GRANT),或一个会话控制语句 (例如 ALTER SESSION),在 PL/SQL 中,这些语句不 能被静态地执行。
动态 DML 的过程 1. 用 OPEN_CURSOR 在内存中建立一个区域来处理 SQL 语句。 2. 用 PARSE 确定 SQL 语句的建立正确性。 3. 用 EXECUTE 函数运行 SQL 语句。该函数返回被处理的行数。 4. 用 CLOSE_CURSOR 关闭光标。
Oracle PL/SQL 编程 77
在创建你的应用程序时你可以利用这些包提供的功能,你也可以只是想在创建你自己的存储过 程时使用这些包的思想。
大多数标准的包可以运行 catproc.sql 来创建。
catproc.sql 在 ORACLE_HOME\RDBMS\ADMIN 目录下。
Oracle 中的PL sql 的符号解释大全

"X+Y"
"last name"
"on/off switch"
"employee(s)"
"*** header info ***"
除了双引号以外,引用标识符最多可以包含30个字符。虽然把PL/SQL保留关键字作为引用标识符是被允许的,但这并不是一个好的编程习惯。
有些PL/SQL保留关键字并不是SQL的保留关键字。例如,我们可以在CREATE TABLE语句中使用TYPE作为字段名。但是,如果程序中的SQL语句要引用到这个字段的话,就会发生编译错误:
PL/SQL把12.0和25.这样的数字都当作实数处理,虽然它们只有整数部分值。
数字文字不能包含美元符号或是逗号,但可以使用科学记数法。只要在数字后面添加一个E(或e),再跟上一个整数即可(符号可选)。比如下面几个例子:
2E5 1.0E-7 3.14159e0 -1E38 -9.5e-3
<> 关系操作符
!= 关系操作符
~= 关系操作符
^= 关系操作符
<= 关系操作符
>= 关系操作符
-- 单行注释提示符
2、标识符
我们可以使用标识符来为PL/SQL程序中的常量、变量、异常、游标、游标变量、子程序和包命名。下面是一些标识符的例子:
X
t2
phone#
DECLARE
n NUMBER ;
BEGIN
n := 10E127; -- causes a 'numeric overflow or underflow' error
字符文字
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笔试题库附参考答案

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)。
Oracle PlSql包(package)

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使用例子使用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 VPD--20100323

采用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存储过程 日志输出语法-概述说明以及解释

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时为字符集名称。
全面解析OracleProcedure基本语法

全⾯解析OracleProcedure基本语法关键字: oracle 存储过程1.基本结构CREATE OR REPLACE PROCEDURE 存储过程名字(参数1 IN NUMBER,参数2 IN NUMBER) IS变量1 INTEGER :=0;变量2 DATE;BEGINEND 存储过程名字2.SELECT INTO STATEMENT将select查询的结果存⼊到变量中,可以同时将多个列存储多个变量中,必须有⼀条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)例⼦:BEGINSELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;EXCEPTIONWHEN NO_DATA_FOUND THENxxxx;END;...3.IF 判断IF V_TEST=1 THENBEGINdo somethingEND;END IF;4.while 循环WHILE V_TEST=1 LOOPBEGINXXXXEND;END LOOP;5.变量赋值V_TEST := 123;6.⽤for in 使⽤cursor...ISCURSOR cur IS SELECT * FROM xxx;BEGINFOR cur_result in cur LOOPBEGINV_SUM :=cur_result.列名1+cur_result.列名2END;END LOOP;END;7.带参数的cursorCURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;OPEN C_USER(变量值);LOOPFETCH C_USER INTO V_NAME;EXIT FETCH C_USER%NOTFOUND;do somethingEND LOOP;CLOSE C_USER;8.⽤pl/sql developer debug连接数据库后建⽴⼀个Test WINDOW在窗⼝输⼊调⽤SP的代码,F9开始debug,CTRL+N单步调试转载:oracle 存储过程关键字: oracle 存储过程存储过程创建语法:create or replace procedure 存储过程名(param1 in type,param2 out type)as变量1 类型(值范围);变量2 类型(值范围);BeginSelect count(*) into 变量1 from 表A where列名=param1;If (判断条件) thenSelect 列名 into 变量2 from 表A where列名=param1;Dbms_output。
Oracle_PLSQL教程-第五章

511
Copyright © Oracle Corporation, 2001. All rights reserved.
创建包体
为了创建包,在包体中定义所有公共和私有结构。
§ 如果包体已经存在,指定 REPLACE 选项。 § 在包体中子程序的定义顺序很重要:你必须在一个变量被引用之前先声明它,
同样,在一个私有子程序被调用之前你必须先声明它。通常的做法是在包体中
先定义私有变量和子程序,后定义公共子程序。
语法解说
在包中定义所有公共和私有过程与函数。
参数
说明
package_name
Oracle PL/SQL 编程 54
第五章 创建包
包声明 包体
引用包对象
过程 A 声明
公共变量 公共过程
过程 B 声明
私有变量 私有过程
过程 A 定义
公共过程
局部变量
55
Copyright © Oracle Corporation, 2001. All rights reserved.
包的开发 (续) 结构的可见性 Local
第五章 创建包
翻译:陈拓 chentuo@ 2006 年 6 月 16 日
创建包
Copyright © Oracle Corporation, 2001. All rights reserved.
进度表:
时间 40 分钟练习 总共
Oracle PL/SQL 编程 51
• REPLACE 选项删除并重新创建包声明 • 在包声明中的变量声明默认情况下被初始化 NULL • 在包声明中的所有被声明的结构对于已授权的用户都是
Oracle_PLSQL教程-第六章

翻译:陈拓 chentuo@2006 年 6 月16 日更多包的概念Copyright © Oracle Corporation, 2001. All rights reserved.进度表: 时间 主题40 分钟 讲演25 分钟 练习65 分钟 总共目标完成本课程后, 您应当能够:• 用重载特性写包• 说明子程序相互引用的规则• 用单次执行 (onetimeonly) 过程初始化变量• 确定持久状态62 Copyright © Oracle Corporation, 2001. All rights reserved.本课目标本课介绍更多的PL/SQL高级特性,包括覆盖、前向引用、单次执行过程和变量、 常量、表达式和游标的持久性。
你还将学习怎样创建和使用包。
还要看看用在SQL语 句中的包函数的作用。
重载 (Overloading)• 使你能够对在 PL/SQL 块、子程序或包中的不同的子程序使用的相同的名字• 要求子程序形式参数的个数、顺序或数据类型不同• 使得你可以更灵活地构建应用程序。
因为重载使用户或 应用程序不被形式参数指定的数据类型或个数所限制注:本地或打包的子程序可以被重载。
单独的子程序不能重载。
63 Copyright © Oracle Corporation, 2001. All rights reserved.重载重载特性使你能够用相同的名字定义不同的子程序。
你可以用用名字和参数区别这 些子程序。
有时在两个子程序中的过程是相同的,但传递给它们的变量的参数不同。
在 这种情况下,只是逻辑上给它们以相同的名字。
PL/SQL 靠检查其形式参数确定哪一个 子程序被调用。
只有本地或打包的子程序可以被重载。
独立的子程序不能被重载。
限制下面的情况不能重载:§两个子程序如果它们的形式参数只是数据类型不同,并且不同的数据类型具有 相同的大类 (NUMBER 和 DECIMAL 就属于相同的大类)。
oracle package 新增方法

一、介绍Oracle Package是Oracle数据库中存储过程和函数的一种封装方式,它可以将一系列逻辑相关的存储过程和函数放在一起,方便管理和调用。
在实际开发中,经常会遇到在已有的Oracle Package中新增方法的需求,本文将介绍在Oracle Package中新增方法的实现方法。
二、方法一1. 确定新增方法的名称及参数列表在新增方法之前,首先需要确定新增方法的名称以及参数列表。
通过分析业务需求和数据库表结构,确定新增方法的功能及所需参数。
2. 编写新增方法的实现代码在确定新增方法的名称及参数列表之后,便可开始编写新增方法的实现代码。
通过使用PL/SQL语言,可以在Oracle Package中新增方法的实现代码。
3. 测试新增方法的功能在编写新增方法的实现代码之后,需要进行对新增方法的功能进行测试。
可以通过编写测试用例,测试新增方法的功能是否符合预期。
4. 编译Oracle Package在新增方法的实现代码编写完成并测试通过之后,需要对Oracle Package进行编译,确保新增方法可以被正常调用。
5. 提交新增方法的更改最后一步是将新增方法的更改提交到版本控制系统中,以便其他开发人员在需要时可以使用该新增方法。
三、方法二1. 使用ALTER PACKAGE语句在已有的Oracle Package中新增方法,可以使用ALTER PACKAGE 语句。
该语句可以用来修改Oracle Package的定义,包括新增方法、修改方法的实现代码等。
2. 编写新增方法的实现代码使用ALTER PACKAGE语句,在已有的Oracle Package中新增方法的实现代码。
通过使用ALTER PACKAGE语句,可以在已有的Oracle Package中新增方法的实现代码。
3. 编译Oracle Package在新增方法的实现代码编写完成之后,需要对Oracle Package进行重新编译,确保新增方法可以被正常调用。
oracle系统包简介

oracle系统包简介包名称包头文件说明dbms_alert dbmsalrt.sql 异步处理数据库事件dbms_application_info dbmsutil.sql 注册当前运行的应用的名称(用于性能监控)dbms_aqadm dbmsaqad.sql 与高级队列选项一起使用dbms_ddl dbmsutil.sql 重新编译存储子程序和包,分析数据库对象dbms_debug dbmspb.sql PL/SQL调试器接口dbms_deffr dbmsdefr.sql 远程过程调用应用的用户接口dbms_describe dbmsdesc.sql 说明存储子程序的参数dbms_job dbmsjob.sql 按指定的时间或间隔执行用户定义的作业dbms_lock dbmslock.sql 管理数据库块dbms_output dbmsotpt.sql 将文本行写入内存、供以后提取和显示dbms_pipe dbmspipe.sql 通过内存“管道”在会话之间发送并接收数据dbms_profiler dbmspbp.sql 用于配置PL/SQL脚本以鉴别瓶颈问题dbms_refresh dbmssnap.sql 管理能够被同步刷新的快照组dbms_session dbmsutil.sql 程序执行alter session(改变会话)语句dbms_shared_pool dbmspool.sql 查看并管理共享池内容dbms_snapshot dbmssnap.sql 刷新,管理快照,并清除快照日志dbms_space dbmsutil.sql 获取段空间信息dbms_sql dbmssql.sql 执行动态SQL和PL/SQLdbms_system dbmsutil.sql 开/关给定会话的SQL追踪dbms_transaction dbmsutil.sql 管理SQL事务dbms_utility dbmsutil.sql 多种实用工具:对于一个给定的模式,重新编译存储子程序和包、分析数据库对象、格式化错误信息并调用堆栈用于显示、显示实例是否以并行服务器模式运行、以10毫秒间隔获取当前时间、决定数据库对象的全名、将一个PL/SQL表转换为一个使用逗号分割的字符串,获取数据版本/操作系统字符串utl_raw utlraw.sql RAW数据转化为字符串utl_file utlfile.sql 读/写基于ASCII字符的操作系统文件utl_http utlhttp.sql 从给定的URL得到HTML格式的主页dbms_lob dbmslob.sql 管理巨型对象一.dbms_output作用:用于输入和输出信息,使用过程PUT和PUT_LINES可以将信息发送到缓冲区,使用过程GET_LINE和GET_LINES可以显示缓冲区信息.详细如下:1.enable该过程用于激活对过程PUT,PUT_LINE,GET_LINE,GET_LINES的调用语法如下:dbms_output.enable(buffer_size in integer default 20000);2.disable该过程用于禁止对过程PUT,PUT_LINE,GET_LINE,GET_LINES的调用语法如下:dbms_output.disable;3.put和put_line过程put_line用于将一个完整行的信息写入到缓冲区中,过程put 则用地分块建立行信息, 当使用过程put_line时,会自动在行的尾部追加行结束符;当使用过程put时,需要使用过程 new_line追加行结束符.示例如下:set serverout onbegindbms_output.put_line('伟大的中华民族');dbms_output.put('中国');dbms_output.put(',伟大的祖国');dbms_output.new_line;end;/伟大的中华民族中国,伟大的祖国4.new_line该过程用于在行的尾部追加行结束符.当使用过程PUT时,必须调用NEW_LINE过程来结束行.5.get_line和get_lines过程get_line用于取得缓冲区的单行信息,过程get_lines用于取得缓冲区的多行信息.二.dbms_job作用:用于安排和管理作业队列,通过使用作业,可以使ORACLE数据库定期执行特定的任务.1.submit用于建立一个新作业.当建立作业时,需要给作业要执行的操作,作业的下次运行日期及运行时间间隔.语法如下:dbms_out.submit (job out binary_integer,what in varchar2,next_date in date default sysdate,interval in varchar2 default 'null',no_parse in boolean default false,instance in binary_integer default any_instance,force in boolean default false);注:job用于指定作业编号;what用于指定作业要执行的操作;next_date用于指定作业的下次运行日期;interval用于指定运行作业的时间间隔;no_parse用于指定是否解析与作业相关的过程;instance用于指定哪个例程可以运行作业;force用于指定是否强制运行与作业相关的例程.示例如下:var jobno numberbegindbms_job.submit(:jobno,'dbms_ddl.analyze_object(''table'',''scott'',''emp'',''compute'');',sysdate,'sysdate+1');commit;end;/2.remove删除作业队列中的特定作业示例如下:SQL>exec dbms_job.remove(1);3.change用于改变与作业相关的所有信息,包括作业操作,作业运行日期以及运行时间间隔等.示例如下:SQL>exec dbms_job.change(2,null,null,'sysdate+2');4.what用于改变作业要执行的操作示例如下:SQL>exec dbms_job.what(2,'dbms_stats.gather_table_stats->(''scott'',''emp'');');5.next_date用于改变作业的下次运行日期示例如下:SQL>exec dbms_job.next_date('2','sysdate+1');6.instance用于改变作业的例程示例如下:SQL>exec dbms_job.instance(2,1);7.interval用于改变作业的运行时间间隔示例如下:SQL>exec dbms_job.interval(2,'sysdate+1/24/60');8.broken用于设置作业的中断标识示例如下:SQL>exec dbms_job.broken(2,true,'sysdate+1');9.run用于运行已存在的作业示例如下:sql>exec dbms_job.run(1);三.dbms_pipe作用:用于在同一例程程的不同会话之间进行管道通信.注意,如果用户要执行包dbms_pipe中的过程和函数,则必须要为用户授权.sql>conn sys/oracle as sysdba;sql>grant execute on dbms_pipe to scott;1.create_pipe该函数用于建立公用管道或私有管道.如果将参数private设置为TRUE,则建立私有管道;如果设置为FALSE,则建立公用管道.示例如下:declarefalg int;beginflag:=dbms_pipe.create_pipe('public_pipe',8192,false);if flag=0 thendbms_output.put_line('建立公用管道成功');end if;end;/2.pack_message该过程用于将消息写入到本地消息缓冲区3.send_message该函数用于将本地消息缓冲区中的内容发送到管道4.receive_message该函数用于接收管道消息5.next_item_type该函数用于确定本地消息缓冲区下一项的数据类型,如果该函数返回0,则表示管道没有任何消息;如果返回6,则表示下一项的数据类型为number;如果返回9,则表示下一项的数据类型为varchar2;如果返回11,则表示下一项的数据类型为rowid;如果返回12,则表示下一项的数据类型为date;如果返回23,则表示下一项的数据类型为raw.6.unpack_message该过程用于将消息缓冲区的内容写入到变量中.7.remove_pipe该函数用于删除已经建立的管道8.purge该过程用于清除管道中的内容9.reset_buffer该过程用于复位管道缓冲区10.unique_session_name该函数用于为特定会话返回惟一的名称,并且名称的最长度为30字节.四.dbms_alert作用:用于生成并传递数据库预警信息.使用包DBMS_ALERT,则必须以SYS登陆,为该用户授予执行权限.sql>conn sys/oracle as sysdbasql>grant execute on dbms_alert to scott;1.register用于注册预警事件示例如下:sql>exec dbms_alter.register('alter1');2.remove用于删除会话不需要的预警事件.3.removeall用于删除当前会话所有已注册的预警事件语法如下:dbms_alter.removeall;4.set_defaults用于设置检测预警事件的时间间隔,默认时间间隔为5秒5.signal用于指定预警事件所对应的预警消息.6.waitany用于等待当前会话的任何预警事件,并且在预警事件发生时输出相应信息.在执行该过程之前,会隐含地发出COMMIT.语法如下:dbms_alter.waitany (name out varchar2,message out varchar2,status out integer,timeout in number default maxwait);注:status用于返回状态值,返回0表示发生了预警事件,返回1表示超时;timeout用于设置预警事件的超时时间.7.waitone用于等待当前会话的特定预警事件,并且在发生预警事件时输出预警消息.语法同上五.dbms_transaction作用:用于在过程,函数,和包中执行SQL事务处理语句.1.read_only用于开始只读事务,其作用与SQL语句SET TRANSACTION READ ONLY完全相同2.read_write用于开始读写事务,------------------------------------WRITE-------3.advise_rollback用于建议回退远程数据库的分布式事务4.advise_nothing用于建议远程数据库的分布式事务不进行任何处理5.advise_commit用于建议提交远程数据库的分布式事务/doc/a29907379.htmler_rollback_segment用于指定事务所要使用的回滚段/doc/a29907379.htmlmit_comment用于在提交事务时指定注释./doc/a29907379.htmlmit_force用于强制提交分布式事务./doc/a29907379.htmlmit用于提交当前事务10.savepoint用于设置保存点11.rollback用于回退当前事务12.rollback_savepoint用于回退到保存点13.rollback_force用于强制回退分布式事务14.begin_discrete_transaction用于开始独立事务模式15.purge_mixed用于清除分布式事务的混合事务结果16.purge_lost_db_entry用于清除本地数据库所记载的远程事务入口,该事务入口操作因为远程数据库问题未能在远程数据库完成.17.local_transaction_id用于返回当前事务的事务标识号18.step_id用于返回排序DML事务的惟一正整数六.dbms_session作用:提供了使用PL/SQL实现ALTER SESSION命令,SET ROLE命令和其他会话信息的方法.1.set_identifier用于设置会话的客户ID号2.set_context用于设置应用上下文属性3.clear_context用于清除应用上下文的属性设置4.clear_identifier用于删除会话的set_client_id.5.set_role用于激活或禁止会话角色6.set_sql_trace用于激活或禁止当前会话的SQL跟踪语法如下:dbms_session.set_sql_trace(sql_strace boolean);7.set_nls用于设置NLS特征语法如下:dbms_session.set_nls(param varchar2,value varchar2);8.close_database_link用于关闭已经打开的数据库链9.reset_package用于复位当前会话的所有包,并且会释放包状态10.modify_package_state用于修改当前会话的PL/SQL程序单元的状态语法如下:dbms_session.modify_package_state(action_flags in pls_integer);11.unique_session_id用于返回当前会话的惟一ID标识符12.is_role_enabled用于确定当前会话是否激活了特定角色.语法如下:dbms_session.is_role_enabled(rolename varchar2)return boolean;13.is_session_alive用于确定特定会话是否处于活动状态.14.set_close_cached_open_cursors用于打开或关闭close_cached_open_cursors15.free_unused_user_meory用于在执行了大内在操作(超过100K)之后回收未用内存16.set_context设置应用上下文属性的值17.list_context用于返回当前会话原命名空间和上下文列表18.swith_current_consumer_group用于改变当前会话的资源使用组七.dbms_rowid作用:用于在PL/SQL程序和SQL语句中取得行标识符的信息并建立ROWID,通过该包可以取得行所在的文件号,行所在文件的数据块号,行所在数据块的行号,以及数据库对象号等消息.1.rowid_create建立ROWID语法如下:dbms_rowid.rowid_create (rowid_type in number,object_number in number,relative_fno in n umber,block_number in number,row_number in number)return rowid;注:rowid_type用于指定ROWID类型(0:受限ROWID,1:扩展ROWID);object_number用于指定数据对象号;relative_fno用于指定相对文件号;block_number用于指定在文件中的数据块号;row_number用于指定在数据块中的行号.2.rowid_info用于取得特定ROWID的详细信息.3.rowid_type用于返回特定ROWID的类型4.rowid_object用于取得特定ROWID所对应的数据对象号5.rowid_relative_fno用于取得特定ROWID所对应的相对文件号6.rowid_block_number用于返回特定ROWID在数据文件中所对应的数据块号.7.rowid_row_number用于返回特定ROWID在数据块中所对应的行号.8.rowid_to_obsolute_fno用于返回特定ROWID所对应的绝对文件号9.rowid_to_extended用于将受限rowid转变为扩展rowid10.rowid_to_restricted用于将扩展rowid转换为受限rowid11.rowid_verify检查是否可以将受限rowid转变为扩展rowid八.dbms_rls作用:只适用于Oracle Enterprise Edition,它用于实现精细访问控制,并且精细访问控制是通过在SQL语句中动态增加谓词(WHERE子句)来实现的.通过使用ORACLE的精细访问控制特征,可以使不同数据库用户在执行相同SQL语句时操作同一张表上的不同数据.九.dbms_ddl作用:提供了在PL/SQL块中执行DDL语句的方法,并且也提供了一些DDL的特殊管理方法.十.dbms_shared_pool作用:提供了对共享池的一些过程和函数访问,它使用户可以显示共享池中的对象尺寸,绑定对象到共享池,清除绑定到共享池的对象.为了使用该包,必须运行dbmspool.sql脚本来建立该包.十一.dbms_random作用:提供了内置的随机数生成器,可以用于快速生成随机数.十二.dbms_logmnr作用:通过使用包DBMS_LOGMNR和DBMS_LOGMNR_D,可以分析重做日志和归档日志所记载的事务变化,最终确定误操作(例如DROP TABLE)的时间,跟踪用户事务操作,跟踪并还原表的DML操作.十三.dbms_flashback作用:用于激活或禁止会话的flashback特征,为了使得普通用户可以使用该包,必须要将执行该包的权限授予这些用户.十四.dbms_obfuscation_toolkit作用:用于加密和解密数据,另外还可以生成密码检验和.通过加密输入数据,可以防止黑客或其他用户窃取私有数据;而通过结合使用加密和密码检验和,可以防止黑客破坏初加密的数据.当使用该包加密数据时,要求被加密数据的长度必须为8字节的整数倍.当使用DES算法加密数据时,密钥长度不能低于8字节;当使用DES3算法加密数据时,密钥长度不能低于16字节.十五.dbms_space作用:用于分析段增长和空间的需求十六.dbms_space_admin作用:提供了局部管理表空间的功能十七.dbms_tts作用:用于检查表空间集合是否是自包含的,并在执行了检查之后,将违反自包含规则的信息写入到临时表TRANSPORT_SET_VIOLATIONS 中.十八.dbms_repair作用:用于检测,修复在表和索引上的损坏数据块.十九.dbms_resource_manager作用:用于维护资源计划,资源使用组和资源计划指令;包dbms_resource_manager_privs用于维护与资源管理相关的权限.二十.dbms_stats作用:用于搜集,查看,修改数据库对象的优化统计信息.二十一.utl_file作用:用于读写OS文件.使用该包访问OS文件时,必须要为OS目录建立相应的DIRECTORY对象..当用户要访问特定目录下的文件时,必须要具有读写DIRECTORY对象的权限.在使用UTL_FILE包之前,应首先建立DIRECTORY对象.二十二.utl_inaddr作用:用于取得局域网或Internet环境中的主机名和IP地址.。
C#打包包含Oracle数据库的程序

C#打包包含Oracle数据库的程序我⽤C#做过不需要安装Oracle客户端的,只需要使⽤⼏个DLL。
实际上Oracle已出绿⾊版的轻量级客户端,可以⽤于你的打包的。
只需要两个DLL就够了!oci.dlloraociei10.dll具体调⽤:private string connString = @"Data Source=数据库服务器的IP地址/数据库服务器实例名(通常为ORCL);Persist SecurityInfo=True;User ID=登录数据库的⽤户名;Password=登录数据库的密码;Unicode=True";有了这个串,我想接下来你知道怎么⽤了!两个DLL跟你的应⽤程序放在⼀个⽬录就⾏了。
我程序中还有个msvcr71.dll有没有关,你可以试试,如果只要前⾯两个不⾏,你就加上这个试试,我是成功的,应该没有问题。
祝你好运!如何⽤VS2008打包发布含Oracle数据库客户端的程序原帖地址/doc/188448018.html/ValiancyHe/archive/2011/11/04/2235855.html这些天来帮导师做⼀个⽤了oracle数据库的winform程序,快要竣⼯了,琢磨怎么打包发布,⽹上资料前篇⼀律,为此深刻鄙视那些复制粘贴的⽂章,简直浪费搜索页⾯,本⽂借鉴过部分⽹上资料,但是绝对是亲⾝试⽤过的。
进⼊正题:⼀建⽴安装程序项⽬:右键解决⽅案->添加->新建项⽬,在弹出的新建项⽬⾯板中选择其他项⽬类型->安装和部署,在模板中选择安装项⽬。
单击确定,安装部署项⽬已经建好。
⼆对项⽬⽂件进⾏打包:右键安装项⽬setup->视图->⽂件系统三个⽂件夹分别对应在⽬标机器上运⾏安装程序后相应的⽂件夹,⽤户程序菜单是对应电脑上点击“开始”后的程序菜单,桌⾯则是对应桌⾯,这两个地⽅⼀般都是建⽴快捷⽅式的,打包主要就是把必要的⽂件放进应⽤程序⽂件夹,右键应⽤程序⽂件夹->添加->项⽬输出,选择你想打包的项⽬,⼀般就是主运⾏输出为exe的项⽬,这个⼤家应该都懂,点击确定后项⽬主输出添加完毕,⼀般来说系统会⾃动把必要的相关⽂件以及dll组件都添加进去。
ORACLE包和包体的创建和使用

ORACLE包和包体的创建和使用create or replace package pack_one as --包头的声明type cur is ref cursor; --定义一个动态游标,也只能是动态type v_record is record( -- 定义一个记录类型(集合的一种)v_name emp.ename%type,v_sal emp.sal%type,v_dname dept.dname%type);function my_fun(v_job varchar2) return cur; --定义一个方法procedure my_pro(v_job in varchar2,my_cur2 out cur);--定义一个存储过种end pack_one;--包头结束create or replace package body pack_one as--创建一个包体function my_fun(v_job varchar2) return cur--对方法的实现,注意是在包体的声明部分里操作ismy_cur cur;--声明游标,因为还是在包的部分,所以直接声明即可sql_cur varchar2(200);beginsql_cur:='select t1.ename,t1.sal,t2.dname from emp t1,dept t2 where t1.deptno=t2.deptno and t1.job='''||v_job||'''';--拼接SQL 语句,重要注意引号的使用dbms_output.put_line(sql_cur);--可以通过输出为调试拼接好的SQL语句open my_cur for sql_cur;--打开游标return(my_cur);--方法有返回值,要牢记end my_fun;--方法的实现结束procedure my_pro(v_job in varchar2,my_cur2 out cur)--对存储过程的实现assql_cur varchar2(200);beginsql_cur:='select t1.ename,t1.sal,t2.dname from emp t1,dept t2 where t1.deptno=t2.deptno and t1.job='''||v_job||'''';open my_cur2 for sql_cur;--打开游标,注意,打开的是传进来的参数,即我们把游标通过参数传出给调用环境因为是out end my_pro;beginnull;end pack_one;--存储实现的结束declare--下面是对包的调用调用其中的方法v_cur pack_one.cur;--注意这里游标类型声明的方式my_record pack_one.v_record;--同上,注意声明方式beginv_cur:=pack_one.my_fun('CLERK');--通过参数调过方法,传进的参数,会被接收因为是inloopfetch v_cur into my_record;exit when v_cur%notfound;dbms_output.put_line(my_record.v_name||'--'||my_record.v_sal||'--'||my_record.v_ dname);end loop;end;declare --下面是对包的调用,调用其中的合存储过程temp_record pack_one.v_record;--同上,注意声明方式my_cur2 pack_one.cur;--注意这里游标类型声明的方式beginpack_one.my_pro('CLERK',my_cur2);--通过传参,来调用,第一个参数是传进,第二个是用于接收传出的参数loopfetch my_cur2 into temp_record;exit when my_cur2%notfound;dbms_output.put_line(temp_record.v_name||'--'||temp_record.v_sal||'--'||temp_rec ord.v_dname);end loop;end;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验: 子程序和包
实验目的
(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;。