分享
 
 
 

Oracle PL/SQL语言初级教程之过程和函数

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

过程和函数

过程和函数都以编译后的形式存放在数据库中,函数可以没有参数也可以有多个参数并有一个返回值。过程有零个或多个参数,没有返回值。函数和过程都可以通过参数列表接收或返回零个或多个值,函数和过程的主要区别不在于返回值,而在于他们的调用方式。过程是作为一个独立执行语句调用的:

pay_involume(invoice_nbr,30,due_date);

函数以合法的表达式的方式调用:

order_volumn:=open_orders(SYSDATE,30);

创建过程的语法如下:

CREATE [ OR REPLACE] PROCEDURE [schema.]procedure_name

[parameter_lister]

{ASIS}

declaration_section

BEGIN

executable_section

[EXCEPTION

exception_section]

END [procedure_name]

每个参数的语法如下:

paramter_name mode datatype [(:=DEFAULT) value]

mode有三种形式:IN、OUT、INOUT。

IN表示在调用过程的时候,实际参数的取值被传递给该过程,形式参数被认为是只读的,当过程结束时,控制会返回控制环境,实际参数的值不会改变。

OUT在调用过程时实际参数的取值都将被忽略,在过程内部形式参数只能是被赋值,而不能从中读取数据,在过程结束后形式参数的内容将被赋予实际参数。

INOUT这种模式是IN和OUT的组合;在过程内部实际参数的值会传递给形式参数,形势参数的值可读也可写,过程结束后,形势参数的值将赋予实际参数。

创建函数的语法和过程的语法基本相同,唯一的区别在于函数有RETUREN子句

CREATE [ OR REPLACE] FINCTION [schema.]function_name

[parameter_list]

RETURN returning_datatype

{ASIS}

declaration_section

BEGIN

executable_section

[EXCEPTION]

exception_section

END [procedure_name]

在执行部分函数必须有哟个或多个return语句。

在创建函数中可以调用单行函数和组函数,例如:

CREATE OR REPLACE FUNCTION my_sin(DegreesIn IN NUMBER)

RETURN NUMBER

IS

pi NUMBER=ACOS(-1);

RadiansPerDegree NUMBER;

BEGIN

RadiansPerDegree=pi/180;

RETURN(SIN(DegreesIn*RadiansPerDegree));

END

包是一种将过程、函数和数据结构捆绑在一起的容器;包由两个部分组成:外部可视包规范,包括函数头,过程头,和外部可视数据结构;另一部分是包主体(package body),包主体包含了所有被捆绑的过程和函数的声明、执行、异常处理部分。

打包的PL/SQL程序和没有打包的有很大的差异,包数据在用户的整个会话期间都一直存在,当用户获得包的执行授权时,就等于获得包规范中的所有程序和数据结构的权限。但不能只对包中的某一个函数或过程进行授权。包可以重载过程和函数,在包内可以用同一个名字声明多个程序,在运行时根据参数的数目和数据类型调用正确的程序。

创建包必须首先创建包规范,创建包规范的语法如下:

CREATE [OR REPLACE] PACKAGE package_name

{ASIS}

public_variable_declarations

public_type_declarations

public_exception_declarations

public_cursor_declarations

function_declarations

procedure_specifications

END [package_name]

创建包主体使用CREATE PACKAGE BODY语句:

CREATE [OR REPLACE] PACKAGE BODY package_name

{ASIS}

private_variable_declarations

private_type_declarations

private_exception_declarations

private_cursor_declarations

function_declarations

procedure_specifications

END [package_name]

私有数据结构是那些在包主体内部,对被调用程序而言是不可见的。

触发器(Triggers)

触发器是一种自动执行响应数据库变化的程序。可以设置为在触发器事件之前或之后触发或执行。能够触发触发器事件的事件包括下面几种:

DML事件

DDL事件

数据库事件

DML事件触发器可以是语句或行级触发器。DML语句触发器在触发语句之前或之后触发DML行级触发器在语句影响的行变化之前或之后触发。用户可以给单一事件和类型定义多个触发器,但没有任何方法可以增强多触发器触发的命令。下表列出了用户可以利用的触发器事件:

事件

触发器描述

INSERT

当向表或视图插入一行时触发触发器

UPDATE

更新表或视图中的某一行时触发触发器

DELETE

从表或视图中删除某一行时触发触发器

CREATE

当使用CREATE语句为数据库或项目增加一个对象时触发触发器

ALTER

当使用ALTER语句为更改一个数据库或项目的对象时触发触发器

DROP

当使用DROP语句删除一个数据库或项目的对象时触发触发器

START

打开数据库时触发触发器,在事件后触发

SHUTDOWN

关闭数据库时触发,事件前触发

LOGON

当一个会话建立时触发,事件前触发

LOGOFF

当关闭会话时触发,事件前触发

SERVER

服务器错误发生时触发触发器,事件后触发

创建触发器的语法如下:

CREATE [OR REPLACE] TRIGGER trigger_name

{beforeafterinstead of} event

ON {table_or_view_nameDATABASE}

[FOR EACH ROW[WHEN condition]]

trigger_body

只有DML触发器(INSERT、UPDATE、DELETE)语句可以使用INSTEAD OF触发器并且只有表的DML触发器可以是BEFORE或AFTER触发器。

象约束一样触发器可以被设置为禁用或启用来关闭或打开他们的执行体(EXECUTE),将触发器设置为禁用或启用使用ALTER TRIGGER语句:

ALTER TRIGGER trigger_name ENABLE;

ALTER TRIGGER trigger_name DISABLE;

要禁用或启用表的所有触发器,使用ALTER TABLE语句

ALTER TRIGGER table_name DISABLE ALL TRIGGER;

ALTER TRIGGER table_name ENABLE ALL TRIGGER;

删除触发器使用DROP TRIGGER

DROP TRIGGER trigger_name;

数据字典

Oracle数据字典包含了用户数据库的元数据。带下划线的表名称中带OBJ$、UET$、SOURCE$,这些表是在执行CREATE DATABASE语句期间由sql.bsq脚本创建的,一般情况下用户很少访问这些表。脚本catalog.sql(通常位于$oracle_home/rdbms/admin)在CREATE DATABASE语句之后立即运行,创建数据字典视图。

数据字典视图大致可以分为三类:

.前缀为USER_的数据字典视图,包含了用户拥有的对象的信息。

.前缀为ALL_的数据字典视图,包含了用户当前可以访问的全部对象和权限的信息。

.前缀为DBA_的数据字典视图,包含了数据库拥有的所有对象和权限的信息。

在绝大多数数据字典视图中都有象DBA_TABLES,ALL_TABLES和USER_TABLES这样的视图家族。Oracle中有超过100个视图家族,所以要全面介绍这些视图家族是单调乏味的而且没有多大的意义。在下表中列出了最重要和最常用的视图家族,需要注重的是每个视图家族都有一个DBA_,一个ALL_一个USER_视图。

视图家族(View Family)

描述

COL_PRIVS

包含了表的列权限,包括授予者、被授予者和权限

EXTENTS

数据范围信息,比如数据文件,数据段名(segment_name)和大小

INDEXES

索引信息,比如类型、唯一性和被涉及的表

IND_COLUMNS

索引列信息,比如索引上的列的排序方式

OBJECTS

对象信息,比如状态和DDL time

ROLE_PRIVS

角色权限,比如GRANT和ADMIN选项

SEGMENTS

表和索引的数据段信息,比如tablespace和storage

SEQUECNCES

序列信息,比如序列的cache、cycle和ast_number

SOURCE

除触发器之外的所有内置过程、函数、包的源代码

SYNONYMS

别名信息,比如引用的对象和数据库链接db_link

SYS_PRIVS

系统权限,比如grantee、privilege、admin选项

TAB_COLUMNS

表和视图的列信息,包括列的数据类型

TAB_PRIVS

表权限,比如授予者、被授予者和权限

TABLES

表信息,比如表空间(tablespace),存储参数(storage parms)和数据行的数量

TRIGGERS

触发器信息,比如类型、事件、触发体(trigger body)

USERS

用户信息,比如临时的和缺省的表空间

VIEWS

视图信息,包括视图定义

在Oracle中还有一些不常用的数据字典表,但这些表不是真正的字典家族,他们都是一些重要的单一的视图。

VIEW NAME

描述

USER_COL_PRIVS_MADE

用户授予他人的列权限

USER_COL_PRIVS_RECD

用户获得的列权限

USER_TAB_PRIVS_MADE

用户授予他人的表权限

USER_TAB_PRIVS_RECD

用户获得的表权限

其他的字典视图中主要的是V$视图,之所以这样叫是因为他们都是以V$或GV$开头的。V$视图是基于X$虚拟视图的。V$视图是SYS用户所拥有的,在缺省状况下,只有SYS用户和拥有DBA系统权限的用户可以看到所有的视图,没有DBA权限的用户可以看到USER_和ALL_视图,但不能看到DBA_视图。与DBA_,ALL,和USER_视图中面向数据库信息相反,这些视图可视的给出了面向实例的信息。

在大型系统上化几周时间手工输入每一条语句

手工输入带用户名变量的语句,然后再输入每一个用户名,这需要花好几个小时的时间

写一条SQL语句,生成需要的ALTER USER语句,然后执行他,这只需要几分钟时间

很明显我们将选择生成SQL的方法:

例:

SELECT 'ALTER USER'username

'TEMPORARY TABLESPACE temp;'

FROM DBA_USERS

WHERE username<>'SYS'

AND temporary_tablespace<>'TEMP';

这个查询的结果将被脱机处理到一个文件中,然后在执行:

ALTER USER SYSTEM TEMPORARY TABLESPACE temp;

ALTER USER OUTLN TEMPORARY TABLESPACE temp;

ALTER USER DBSNMP TEMPORARY TABLESPACE temp;

ALTER USER SCOTT TEMPORARY TABLESPACE temp;

ALTER USER DEMO TEMPORARY TABLESPACE temp;

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