end;
3))FOR语句格式:
for 计数器 in 低值..高值 loop 执行语句; end loop; eg:
--从1加到100 declare
v_I int := 1; v_Sum int := 0; begin
for v_I in 1..100 loop v_Sum := v_Sum + v_I; end loop;
dbms_output.put_line(v_Sum); exception
when others then
dbms_output.put_line('error!'); end;
4))case语句格式: 1)))语法一:
CASE search_expression
WHEN expression1 THEN result1 WHEN expression2 THEN result2 ...
WHEN expressionN THEN resultN ELSE default_result END eg:
select scott.emp.empno, scott.emp.ename, case scott.emp.empno when 7369 then 'aa' when 7499 then 'bb' when 7521 then 'cc' when 7566 then 'dd' when 7654 then 'ee' else 'ff'
end A --新字段名称 from scott.emp
41
2)))语法二: CASE
WHEN condition1 THEN result1 WHEN condition2 THEN result2 ...
WHEN conditionN THEN resultN ELSE default_result END eg:
select scott.emp.empno, scott.emp.ename, case
when scott.emp.empno=7369 then 'aa' when scott.emp.empno=7499 then 'bb' when scott.emp.empno=7521 then 'cc' when scott.emp.empno=7566 then 'dd' when scott.emp.empno=7654 then 'ee' else 'ff'
end A --新字段名称 from scott.emp
2.关键字%TYPE和%ROWTYPE的含义和作用是什么? 解:
(1)%type:
如果声明的变量是直接映射到数据库的某一列上,那么就可以使用%type关键字将变量锚定到这个列上。
比如:declare v_ename scott.emp.ename%type; 当数据类型发生变化时,此方法显得非常灵活。
如果更改了列的长度,那么锚定到该列上的所有变量都会自动更改其长度;
假设我们将v_ename定义为varchar2(10),那么当emp表中的ename列发生变化时, 我们得手动将v_enam更改为emp.ename相同的数据长度; 当我们使用锚定类型后,变量就会自动进行调整。 (2)%rowtype:
%rowtype与%type相似;不过它将变量锚定到表的所有列,而不是锚定到某一列;
3.如何处理用户自定义的异常? 解:
使用RAISE_APPLICATION_ERROR 函数,该函数是将应用程序专有的错误从服务器端转达到客户端应用程序(其他机器上的SQLPLUS或者前台开发语言)。
42
第十一章 存储过程与函数
一、单项选择题
1.存储过程保存在( B )中。
A.系统表 B.数据库 C.内存 D.数据表
2.下列哪个语句可以在SQL*PLUS中直接调用一个过程?( D ) A.RETURN B.CALL C.SET D.EXEC
3.下面哪些不是过程中参数的有效模式?( C ) A.IN B.IN OUT C.OUT IN D.OUT
4.如果存在一个名为TEST的过程,它包括3个参数:第一个参数为P_NUM1,第二个参数为P_NUM2,第三个参数为P_NUM3。3个参数的模式都是IN,P_NUM1参数的数据类型是NUMBER, P_NUM2参数的数据类型是VARCHAR2, P_NUM3参数的数据类型是VARCHAR2,下列哪一个是该过程的有效调用?( D )
A.TEST(1010,P_NUM3>=’abc’,P_num2>=’bcd’) B. TEST(P_NUM1>=1010,P_num2=>’abc’,’bcd’) C.TEST(P_NUM1=>1010,’abc’,’bcd’) D.上述都对
5.函数头部中的RETURN语句的作用是( A ) A.声明返回的数据类型
B.声明返回值的大小和数据类型 C.调用函数
D.函数头部不能使用RETURN语句
6.如果在程序包的主体中包括了一个过程,但没有在程序包规范中声明这个过程,那么它将会被认为是( D )
A.非法的 B.公有的 C.受限的 D.私有的
7.对于下面的函数,哪个语句能成功地调用?( D )
43
CREATE OR REPLACE FUNCTION Calc_Sum(Addend_x number,Addend_Y number) Return number As
Sum number; BEGIN
Sum:=Addend_x+Addend_y; Return Sum; END;
A.Calc_Sum
B.EXECUTE Calc_Sum(45) C.EXECUTE Calc_Sum(23,12) D.Sum:=Calc_Sum(23,12)
8.当满足下列( B )条件时允许两个过程具有相同的名称? A.参数的名称或数量不相同时 B.参数的数量或数据类型不相同时 C.参数的数据类型和名称不相同时 D.参数的数量和数据类型不相同时
9.在FUNCTION主体中,不可能有( A )个RETURN语句。 A.0 B.1 C.2 D.3
10.数据包airline中有函数book_ticket,其定义如下: FUNCTION book_ticket(para1 CHAR)RETURN DATE IS 下列( D )程序段正确地调用该数据包的函数。 A. DECLARE
value1 CHAR(10); BEGIN ----
value1 := airline.book_ticket(10); B. DECLARE
value1 CHAR(10); BEGIN ----
value1 := airline.book_ticket(‘10’); C. DECLARE value1 DATE; BEGIN ----
value1 := airline.book_ticket(10); D. DECLARE value1 DATE;
44