分享
 
 
 

ORACLE的PL/SQL二

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

(B):其中语句CURSOR desc_salary(emp_id NUMBER) RETURN EMPRECTYP定义了一个游标desc_salary。

游标(CURSOR)详见本节最后的内容。

.包体建立

CREATE PACKAGE BODY emp_actions AS

CURSOR desc_salary(emp_id NUMBER)RETURN EMPRECTYP

IS SELECT EMPNO,SAL FROM emp ORDER BY SAL DESC;

PROCEDURE hire_employee

(ename CHAR,

job CHAR,

sal NUMBER,

mgr NUMBER,

comm NUMBER,

deptno NUMBER)IS

BEGIN

INSERT INTO EMP VALUES(EMPNO_SEQ.NEXTVAL,

ename,job,mgr,SYSDATE,sal,comm,deptno);

END hire_employee;

PROCEDURE fire_employee(emp_id NUMBER) IS

BEGIN

DELETE FROM EMP WHERE EMPNO=emp_id;

END fire_employee;

END emp_actions;

注意:hire_employee过程使用参数,数据库序列empno_seq、函数SYSDATE插入一个新职工记录,其职工号由序列产生,聘用日期由函数

SYSDATE生成。

在包说明中,说明对所有应用是可见的而且可存取。在包体中,实现细节是隐藏的,不可存取。所以改变包体不会引起调用程序的重新编译。

在设计一个应用时,最初只需要定义包说明的接口信息。在没有包体时可编制包说明的程序并进行编译。一旦包说明已经被编译,引用该包的存贮子程序同样编译。在完成应用之前,可不必定义包体。调试、提高或替换一个包体不必修改包说明,以致不需重新编译调用程序。在包说明中所说明的游标和子程序必须在包体中定义。

(3)对包装子程序的调用

包装的子程序可被数据库触发器、其它的存贮子程序、ORACLE预编译应用程序、OCI应用程序或ORACLE工具(如SQL*PLUS)调用,其调用形式如下:

.从另一存贮子程序调用

存贮子程序可调用包装子程序。

例2.53: 调用包EMP_ACTIONS中的包装过程HIRE_EMPLOYEE,其形式为:

EMP_ACTIONS.HIRE_EMPLOYEE(name,title,...);

.从应用程序中调用

一个ORACLE预编译的应用程序或OCI应用程序可用无名PL/SQL块调用包装子程序。

例2.54: 在ORACLE预编译应用程序对包装过程HIRE_EMPLOYEE调用,形式为:

EXEC SQL EXECUTE

BEGIN

EMP_ACTIONS.HIRE_EMPLOYEE(:name,:title,...);

END;

END_EXEC;

其中实在参数name、title为宿主变量。

.从ORACLE工具中调用

可从ORACLE工具(如SQL*PLUS、SQL*FORMS和SQL*DBA)中交互地调用包装子程序。其调用形式为:

SQLEXECUTE EMP_ACTIONS.HIRE_EMPLOYEE(‘TATE’,’CLERK’,...);

注意:在执行一个包装子程序之前,ORACLE标志一个隐式的保留点。如果子程序由于具有未处理例外而失败时,在返回到宿主环境之前,ORACLE将回滚到该保留点上.

在一个包装子程序中可包含任何SQL语句和PL/SQL语句。然而,凡参与分布工事务、数据库触发器、SQL*FORM应用程序的子程序不能调用包含有COMMIT、ROLLBACK、SAVEPOINT语句的包装子程序。

.远程存取

可利用下列语法调用存贮在远程ORACLE数据库中的包装子程序:

包名.子程序名@DB链名(参数1,参数2,...)

ORACLE在数据字典中分别存贮包说明和包体。其它对象仅可引用包说明中全局包对象,重新定义包体中的对象时不会引起ORACLE使从属对象无效。

(4) STANDARD包和产品特有的包

名为STANDARD的包定义了PL/SQL环境。该包说明全局的申明类型、例外和子程序,可自动地适用于每一个PL/SQL程序。STANDARD包的内容对应用是直接可见的。许多内部函数是被重载的。

为了方便建立基于PL/SQL的应用程序,ORACLE SERVER和几种ORACLE工具都有产品特有的包,例SQL*FORMS提供名为SQLFORMS的包。如需要更多信息,请参见相应产品的引用手册。

三、控制结构

本节介绍PL/SQL程序的控制流结构。根据结构化程序设计理论,任何程序可同三种基本控制结构组成:分支结构、循环结构和顺序结构。PL/SQL也用相应的语句来支持这三种控制结构。

1.条件控制IF语句

IF语句是条件执行语句。IF语句有三种形式:IF_THEN,IF_THEN_ELSE和IF_THEN_ELSIF。

(1) IF_THEN形式

它是IF语句最简单形式,将一条件与一语句序列相联。当条件为TRUE时,执行语句序列。

例 2.55:

IF XY THEN high:=X;ENDIF

(2) IF_THEN_ELSE形式

该种IF语句形式比简单形式增加关键字ELSE,后跟另一语句序列。形式为:

IF 条件 THEN

语句序列1;

ELSE

语句序列2;

ENDIF;

ELSE子句中语句序列仅当条件计算为FALSE或NULL时执行。在THEN和ELSE子句中可包含IF语句,即IF语句可以嵌套。

(3) IF_THEN_ELSIF形式

该形式利用ELSIF关键字引入附加条件。形式为:

IF 条件1 THEN

语句序列1;

ELSIF 条件2 THEN

语句序列2;

ELSE

语句序列3;

ENDIF;

当条件1计算得FALSE或NULL时,ELSIF子句测试条件2,为TRUE时,则执行语句序列2。IF语句可以有任何数目的ELSIF语句,而最后的ELSE子句是可选项。在此种情况下,每一条件对应一语句序列,条件由顶向底计算。任何一个条件计算为TRUE时,执行相对应的语句序列。如果所有条件计算为FALSE或NULL,则执行ELSE子句中的序列。

例 2.56:

IF XY THEN

high:=X;

ELSIF X=Y THEN

B:=FALSE;

ELSE

C:=NULL;

ENDIF;

其中,B和C是布尔数据类型(BOOLEAN)。布尔数据类型用于存贮TRUE、FALSE或NULL(空值)。它没有参数,仅可将三种值赋给一个布尔变量,不能将TRUE、FALSE值插入到数据库的列,也不能从数据库的列中选择或获取列值到BOOLEAN变量。

2.循环语句:LOOP和EXIT语句

(1) 基本循环

基本循环(或无限循环)是循环语句的最简单的形式,它由关键字LOOP和ENDLOOP之间的语句序列组成。每一次循环迭代,语句序列执行一次,然后控制重新由循环的顶部开始。可利用EXIT、GOTO或RAISE语句退出循环。基本循环形式为:

LOOP

语句序列;

EXIT WHEN 布尔表达式;

ENDLOOP;

其中EXIT语句用于退出循环。EXIT语句有两种形式:无条件的EXIT和条件的EXIT[标号名]WHEN。[标号名]选项中的标号名为所要退出的循环标识。使用标号名不仅可退出当前循环,而且可退出由标号名所标识的循环。

不能用EXIT语句退出一个PL/SQL块。

(2) WHILE_LOOP循环

WHILE_LOOP循环语句将一条件与一由关键字LOOP和ENDLOOP包装的语句序列相联系。在每次循环开始前,计算条件,如果该条件计算得到TRUE,执行语句序列,然后控制重新回到循环顶部。如果条件计算得到FALSE或NULL,结束循环。在循环中引起例外时也结束循环。该语句的形式为:

WHILE 条件 LOOP

语句序列,

END LOOP;

例 2.57:

WHILE total

...

SELECT INTO Salary From emp WHERE...;

total:=total+Salary;

ENDLOOP;

循环迭代次数依赖于条件,在循环完成之前是未知的。由于条件的测试是在循环的顶部,语句序列可以一次也不执行。

(3) 数值FOR_LOOP循环

数值FOR循环语句在一指定整数范围中循环,所以通过该循环的迭代次数是已知的。在第一次进入FOR循环时计算范围,之后再不重新计算。对由整数表达式1..整数表达式2定义的范围中每一整数,语句序列执行一次,每次迭代之后,循环索引增加。

索引名为命名循环索引的标识符,索引名无需说明,它被隐式地说明为INTEGER类型的变量。该索引名的范围是该循环本身,在循环外不能存取。注意隐式说明压倒任何循环外的任何其它说明。

整数表达式1、整数表达式2是表达式,计算出一个整数。要求整数表达式1的值不大于整数表达式2的值。

REVERSE选择:缺省时,迭代由低界向高界处理。但使用REVERSE后,迭代是由高界向低界处理,每次迭代后,循环索引减小。

数值FOR循环语句形式为:

FOR计数器IN[REVERSE]低界..高界LOOP

语句序列;

ENDLOOP;

例 2.58:

FOR I IN 1..3 LOOP --将值1,2,3赋给I

语句序列; --执行三次

ENDLOOP;

3. 顺序控制

GOTO语句和NULL语句对PL/SQL程序设计不像IF语句和循环语句那么重要,但有时PL/SQL结构还是需要。

(1) GOTO语句

GOTO语句无条件转移到一标号,该标号应在它的范围内是唯一的,它必须位于可执行语

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有