1。控制流E(Q?br />
A.条g语句
IF <statement> THEN
PL/SQL
END IF;
IF <statement> THEN
PL/SQL
ELSE
PL/SQL
END IF;
IF
<statement> THEN
PL/SQL
ELSIF <statement> THEN
PL/SQL
END IF;
2。@?br />
A.simple loop
LOOP
SQL
EXIT WHEN <statement>;
END LOOP;
LOOP
SQL
IF
<statement>
THEN
EXIT;
END IF;
END LOOP;
B.While loop
WHILE <statement> LOOP
SQL
END LOOP;
C.For loop
FOR $counter in $low .. $high LOOP
SQL
END LOOP
3。游?br />
在PL/SQLE序中定义的游标叫做昑ּ游标?br />
A.昑ּ游标的处理由四个部分l成Q?br />cursor $cursorname is $Query; --定义游标
open $cursorname; --打开游标
fetch $cursorname into $othervariable --把游标中的东西取?br />close $cursorname --关闭游标
B.游标属?br />%found 布尔型属性,当最q一ơ读U录成功
?/span>
Qؓtrue.
%nofound p|Ӟ为false.
%isopen
%rowcount q回已从游标中读取的记录数?br />
C.参数化游?br />
所有的SQL语句在上下文区内部都是可执行的,因此都有一个游标指向上下文区,此游标就是所谓的SQL游标?br />与显式游标不同,SQL游标不被E序打开和关闭?br />
4.异常处理概念
异常处理是用来处理正常执行过E中未预料的事g。如果PL/SQLE序块一旦生异常而又没有指出如何处理ӞE序会自动终止?br />异常处理部分攑֜PL/SQL的后半部分,l构为:
EXCEPTION
WHEN first_exception THEN <code to handle first exception>
WHEN second_exception THEN <code to handle second exception>
WHEN OTHERS THEN <
code to handle second exception
> --OTHERS必须攑֜最?br />
异常分ؓ预定义和用户定义两种?br />用户定义的异常是通过昑ּ使用RAISE语句来引发。如
DECLARE
e_TooManyStudents EXCEPTION; -- cd?span lang="EN-US">ExceptionQ用于指C错误条?br /> v_CurrentStudents NUMBER(3); -- HIS-101学生注册当前?br /> v_MaxStudents NUMBER(3); -- HIS-101学生注册允许的最大号
BEGIN
/* 扑և注册学生当前号和允许的最大号 */
SELECT current_students, max_students
INTO v_CurrentStudents, v_MaxStudents
FROM classes
WHERE department = 'HIS' AND course = 101;
/* 查学生的?span lang="EN-US"> */
IF v_CurrentStudents > v_MaxStudents THEN
/* 太多的学生注册,则触发例外处?span lang="EN-US"> */
RAISE e_TooManyStudents;
END IF;
EXCEPTION
WHEN e_TooManyStudents THEN
/* 当太多的学生注册Q就插入信息解释发生q错?span lang="EN-US"> */
INSERT INTO log_table (info) VALUES ('History 101 has ' || v_CurrentStudents ||
'students: max allowed is ' || v_MaxStudents);
END;
CREATE OR REPLACE PROCEDURE Register (
p_StudentID IN students.id%TYPE,
p_Department IN classes.department%TYPE,
p_Course IN classes.course%TYPE) AS
v_CurrentStudents NUMBER; -- 班上学生的当前号
v_MaxStudents NUMBER; -- 班上学生的最大号
BEGIN
/* 扑և学生的当前号和最大号 */
SELECT current_students, max_students
INTO v_CurrentStudents, v_MaxStudents
FROM classes
WHERE course = p_Course
AND department = p_Department;
/*
认另外的学生是否有_的教?/span>
*/
IF v_CurrentStudents + 1 > v_MaxStudents THEN
RAISE_APPLICATION_ERROR(-20000, 'Can''t add more students to ' ||
p_Department || ' ' || p_Course);
END IF;
/*
加一个学生在本班
*/
ClassPackage.AddStudent(p_StudentID, p_Department, p_Course);
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20001, p_Department || ' ' || p_Course ||
' doesn''t exist!');
END Register;
一、什么是Java虚拟?/p>
Java虚拟机是一个想象中的机?在实际的计算Z通过软g模拟来实现。Java虚拟机有自己惌中的g,如处理器、堆栈、寄存器{?q具有相应的指opȝ?/p>
1.Z么要使用Java虚拟?/p>
Java语言的一个非帔R要的特点是与^台的无关性。而用Java虚拟机是实现q一特点的关键。一般的高语言如果要在不同的^Cq行,臛_需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同^Cq行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体^台相关的信息,使得Java语言~译E序只需生成在Java虚拟Zq行的目标代?字节?,可以在多种q_上不加修改地q行。Java虚拟机在执行字节码时,把字节码解释成具体^C的机器指令执行?/p>
2.谁需要了解Java虚拟?/p>
Java虚拟机是Java语言底层实现的基,对Java语言感兴的人都应对Java虚拟机有个大概的了解。这有助于理解Java语言的一些性质,也有助于使用Java语言。对于要在特定^C实现Java虚拟机的软g人员,Java语言的编译器作者以及要用硬件芯片实现Java虚拟机的人来?则必Lȝ解Java虚拟机的规范。另?如果你想扩展Java语言,或是把其它语a~译成Java语言的字节码,你也需要深入地了解Java虚拟机?/p>
3.Java虚拟机支持的数据cd
Java虚拟机支持Java语言的基本数据类型如?
byte://1字节有符h数的补码
short://2字节有符h数的补码
int://4字节有符h数的补码
long://8字节有符h数的补码
float://4字节IEEE754单精度QҎ(gu)
double://8字节IEEE754双精度QҎ(gu)
char://2字节无符号Unicode字符
几乎所有的Javacd查都是在~译时完成的。上面列出的原始数据cd的数据在Java执行时不需要用g标记。操作这些原始数据类型数据的字节?指o)本n已l指Z操作数的数据cd,例如iadd、ladd、fadd和dadd指o都是把两个数相加,其操作数cd别是int、long、float和double。虚拟机没有lboolean(布尔)cd讄单独的指令。boolean型的数据是由integer指o,包括integerq回来处理的。boolean型的数组则是用byte数组来处理的。虚拟机使用IEEE754格式的QҎ(gu)。不支持IEEE格式的较旧的计算?在运行Java数D程序时,可能会非常慢?/p>
虚拟机支持的其它数据cd包括:
object//对一个Javaobject(对象)?字节引用
returnAddress//4字节,用于jsr/ret/jsr-w/ret-w指o
?Java数组被当作object处理?/p>
虚拟机的规范对于object内部的结构没有Q何特D的要求。在Sun公司的实C,对object的引用是一个句?其中包含一Ҏ(gu)?一个指针指向该object的方法表,另一个指向该object的数据。用Java虚拟机的字节码表C的E序应该遵守cd规定。Java虚拟机的实现应拒l执行违反了cd规定的字节码E序。Java虚拟机由于字节码定义的限制似乎只能运行于32位地址I间的机器上。但是可以创Z个Java虚拟?它自动地把字节码转换?4位的形式。从Java虚拟机支持的数据cd可以看出,JavaҎ(gu)据类型的内部格式q行了严D?q样使得各种Java虚拟机的实现Ҏ(gu)据的解释是相同的,从而保证了Java的与q_无关性和?
UL性?/p>
二、Java虚拟Zpȝ?/p>
Java虚拟机由五个部分l成:一l指令集、一l寄存器、一个栈、一个无用单元收集堆(Garbage-collected-heap)、一个方法区域。这五部分是Java虚拟机的逻辑成䆾,不依赖Q何实现技术或l织方式,但它们的功能必须在真实机器上以某U方式实现?/p>
1.Java指o?/p>
Java虚拟机支持大U?48个字节码。每个字节码执行一U基本的CPUq算,例如,把一个整数加到寄存器,子程序{Uȝ。Java指o集相当于JavaE序的汇~语a?
Java指o集中的指令包含一个单字节的操作符,用于指定要执行的操作,q有0个或多个操作?提供操作所需的参数或数据。许多指令没有操作数,仅由一个单字节的操作符构成?/p>
虚拟机的内层循环的执行过E如?
do{
取一个操作符字节;
Ҏ(gu)操作W的值执行一个动?
}while(E序未结?
׃指opȝ的简单?使得虚拟机执行的q程十分?从而有利于提高执行的效率。指令中操作数的数量和大是由操作符军_的。如果操作数比一个字节大,那么它存储的序是高位字节优先。例?一?6位的参数存放时占用两个字?其gؓ:
W一个字?256+W二个字节字节码指o一般只是字节对齐的。指令tabltch和lookup是例?在这两条指o内部要求强制?字节边界寚w?/p>
2.寄存?/p>
Java虚拟机的寄存器用于保存机器的q行状?与微处理器中的某些专用寄存器cM?/p>
Java虚拟机的寄存器有四种:
pc:JavaE序计数器?
optop:指向操作数栈端的指针?
frame:指向当前执行Ҏ(gu)的执行环境的指针?
vars:指向当前执行Ҏ(gu)的局部变量区W一个变量的指针?/p>
Java虚拟?/p>
Java虚拟机是栈式?它不定义或用寄存器来传递或接受参数,其目的是Z保证指o集的z性和实现时的高效?特别是对于寄存器数目不多的处理器)?
所有寄存器都是32位的?/p>
3.?/p>
Java虚拟机的栈有三个区域:局部变量区、运行环境区、操作数区?/p>
(1)局部变量区 每个JavaҎ(gu)使用一个固定大的局部变量集。它们按照与vars寄存器的字偏U量来寻址。局部变量都?2位的。长整数和双_ֺ点数占据了两个局部变量的I间,却按照第一个局部变量的索引来寻址?例如,一个具有烦引n的局部变?如果是一个双_ֺ点?那么它实际占据了索引n和n+1所代表的存储空间?虚拟范ƈ不要求在局部变量中?4位的值是64位对齐的。虚拟机提供了把局部变量中的D载到操作数栈的指?也提供了把操作数栈中的值写入局部变量的指o?/p>
(2)q行环境区 在运行环境中包含的信息用于动态链?正常的方法返回以及异怼播?/p>
·动态链?
q行环境包括Ҏ(gu)向当前类和当前方法的解释器符可的指?用于支持Ҏ(gu)代码的动态链接。方法的class文g代码在引用要调用的方法和要访问的变量时用符受动态链接把W号形式的方法调用翻译成实际Ҏ(gu)调用,装蝲必要的类以解释还没有定义的符?q把变量讉K译成与q些变量q行时的存储l构相应的偏Ud址。动态链接方法和变量使得Ҏ(gu)中用的其它cȝ变化不会影响到本E序的代码?/p>
·正常的方法返?br />如果当前Ҏ(gu)正常地结束了,在执行了一条具有正类型的q回指o?调用的方法会得到一个返回倹{执行环境在正常q回的情况下用于恢复调用者的寄存?q把调用者的E序计数器增加一个恰当的数?以蟩q已执行q的Ҏ(gu)调用指o,然后在调用者的执行环境中l执行下厅R?/p>
·异常和错误传?br />异常情况在Java中被UCError(错误)或Exception(异常),是Throwablecȝ子类,在程序中的原因是:①动态链接错,如无法找到所需的class文g。②q行旉,如对一个空指针的引?/p>
·E序使用了throw语句?br />当异常发生时,Java虚拟机采取如下措?
·查与当前Ҏ(gu)相联pȝcatch子句表。每个catch子句包含其有效指令范?能够处理的异常类?以及处理异常的代码块地址?br />·与异常相匚w的catch子句应该W合下面的条?造成异常的指令在其指令范围之?发生的异常类型是其能处理的异常类型的子类型。如果找C匚w的catch子句,那么pȝ转移到指定的异常处理块处执行;如果没有扑ֈ异常处理?重复L匚w的catch子句的过E?直到当前Ҏ(gu)的所有嵌套的catch子句都被查过?br />·׃虚拟ZW一个匹配的catch子句处l执?所以catch子句表中的顺序是很重要的。因为Java代码是结构化?因此d以把某个Ҏ(gu)的所有的异常处理器都按序排列C个表?对Q意可能的E序计数器的?都可以用U性的序扑ֈ合适的异常处理?以处理在该程序计数器g发生的异常情c?br />·如果找不到匹配的catch子句,那么当前Ҏ(gu)得到一?未截获异?的结果ƈq回到当前方法的调用?好像异常刚刚在其调用者中发生一栗如果在调用者中仍然没有扑ֈ相应的异常处理块,那么q种错误传播被l箋下去。如果错误被传播到最层,那么pȝ调用一个缺省的异常处理块?
(3)操作数栈区 机器指o只从操作数栈中取操作?对它们进行操?q把l果q回到栈中。选择栈结构的原因?在只有少量寄存器或非通用寄存器的机器(如Intel486)?也能够高效地模拟虚拟机的行ؓ。操作数栈是32位的。它用于l方法传递参?q从Ҏ(gu)接收l果,也用于支持操作的参数,q保存操作的l果。例?iadd指o两个整数相加。相加的两个整数应该是操作数栈顶的两个字。这两个字是由先前的指o压进堆栈的。这两个整数从堆栈弹出、相?q把l果压回到操作数栈中?/p>
每个原始数据cd都有专门的指令对它们q行必须的操作。每个操作数在栈中需要一个存储位|?除了long和double?它们需要两个位|。操作数只能被适用于其cd的操作符所操作。例?压入两个intcd的数,如果把它们当作是一个longcd的数则是非法的。在Sun的虚拟机实现?q个限制由字节码验证器强制实行。但?有少数操?操作Wdupe和swap),用于对运行时数据行操作时是不考虑cd的?/p>
4.无用单元攉?/p>
Java的堆是一个运行时数据?cȝ实例(对象)从中分配I间。Java语言h无用单元攉能力:它不l程序员昑ּ释放对象的能力。Java不规定具体用的无用单元攉法,可以Ҏ(gu)pȝ的需求用各U各L法?/p>
5.Ҏ(gu)?/p>
Ҏ(gu)Z传统语言中的~译后代码或是Unixq程中的正文D늱伹{它保存Ҏ(gu)代码(~译后的java代码)和符可。在当前的Java实现?Ҏ(gu)代码不包括在无用单元攉堆中,但计划在来的版本中实现。每个类文g包含了一个JavacL一个Java界面的编译后的代码。可以说cL件是Java语言的执行代码文件。ؓ了保证类文g的^台无x?Java虚拟范中对类文g的格式也作了详细的说明。其具体l节请参考Sun公司的Java虚拟范?/p>