湘潭大学
实 验 报 告
课 程: Oracle数据库
实验题目: PL/SQL程序设计(2)
完成日期: 2016.12.07
一、上机目的
在掌握 PL/SQL 程序的基本结构编程的基础上,学会一些较复杂的 PL/SQL 编程方法。
二、上机内容
1、在A_DB模式中有一个名为tan1(a)的表,表中有若干个整数(不要管是否有重复)。请编写一个名为f1的存储函数(无参数),统计该表中有多少个数是素数,并作为函数返回值返回。
代码:
create or replace
function F1 return integer as
m integer:=0;
is_prim boolean;
begin
for e in (select * from A_DB.tan1) loop
begin
is_prim:=true;
for j in 2..trunc(sqrt(e.a)) loop
if mod(e.a,j)=0 then
begin
is_prim:=false;
exit;
end;
end if;
end loop;
if is_prim then
m:=m+1;
end if;
end;
end loop;
return m;
end;
截图:
代码:
select f1() 素数个数 from DUAL;
截图:
2、在A_DB模式中有一个名为tan3(a)的表,表中有若干个整数(不要管是否重复),假设这些数表示年份。
请编写一个名为f2的存储函数(无参数),统计该表中有多少个年份是闰年,并作为函数返回值返回。说明:闰年的计算方法:被400整除,或被4整除而不能被100整除的年份为闰年。
代码:
create or replace function f2 return integer
as
total INTEGER:=0;
BEGIN
For y in (select distinct(A_DB.TAN3.A) from A_DB.TAN3)loop
if mod(y.A,400)=0 or (mod(y.A,4)=0 and mod(y.A,100)!=0) then
total:=total+1;
DBMS_OUTPUT.put_line(y.A);
End if;
End loop;
Return total;
End;
截图:
代码:
SET SERVEROUTPUT ON;
Select f2 from dual;
截图:
3、在A_DB模式中有一个名为tanbn1(a,b)的表,请编写一个名为f3的存储函数(无参数),对于表中所有三位数abc,将个位与百位数字交换,得到cba。求这些cba的和,并作为函数返回值返回。
代码:
create or replace function f3 return integer
as
m integer:=0;
begin
for e in(select * from a_db.tanbn1) loop
if e.a>=100 and e.a<1000 then
m:=m+trunc(e.a/100)+mod(trunc(e.a/10),10)*10+mod(e.a,10)*100;
end if;
if e.b>=100 and e.b<1000 then
m:=m+trunc(e.b/100)+mod(trunc(e.b/10),10)*10+mod(e.b,10)*100;
end if;
end loop;
return m;
end;
截图:
代码:
Select f3 result from dual;
截图:
4、对称字符串。
在A_DB中有一个名为tac1(a)的表,表中有若干个字符串(不管是否有重复)。
请编写一个名为f4的存储函数(无参数),统计该表中有多少对称字符串,并作为函数返回值返回。
说明:对称字符串是正读倒读一样的字符串。如:“abcdcba”、“6”和“123321”等前后对称,是对称字符串;而“12332”不是。
代码:
create or replace
function F4 return integer as
m INTEGER:=0;
b number;
o number;
c varchar(2);
d varchar(2);
begin
for e in (select a from A_DB.tac1) loop
begin
b:=length(e.a);
o:=b;
for j in 1..b/2 loop
c:= substr(e.a, j, 1);
d:= substr(e.a, o, 1);
if c!=d then
exit;
end if;
o:=o-1;
end loop;
if o=b/2+1 or o=b/2 then
m:=m+1;
end if;
end;
end loop;
return m;
end;
截图:
代码:
select f4() from dual;
截图:
5、编写一个名为f5的存储过程,判断正整数n是否是若干个连续的正整数之和。如是,则输出这些连续的正整数。n是过程的参数。如:12=3+4+5。
代码:
create or replace procedure f5(n integer )
as
a integer;
b integer;
c integer;
d integer;
k integer;
begin
for c in 1..n-1 loop
for d in c+1..n loop
a:=c+d;
b:=d-c+1;
if n=a*b/2 then
for k in c..d loop
dbms_output.put(k||' ');
end loop;
end if;
end loop;
end loop;
end;
截图:
代码:
set serveroutput on;
Exec(f5(n));
截图:
6、编写一个名为f6的存储函数,判断正整数n是否是若干个连续的正整数之和。如是,则返回1,否则返回0。n是函数的参数。
代码:
create or replace function f6 (n integer) return integer
as
a integer;
b integer;
c integer;
d integer;
k integer:=0;
begin
for c in 1..n-1 loop
for d in c+1..n loop
a:=c+d;
b:=d-c+1;
if n=a*b/2 then
k:=k+1;
end if;
end loop;
end loop;
if k!=0 then
return 1;
else
return k;
end if;
end;
截图:
代码:
select f6(12) result from dual;
截图:
7、在A_db模式中有一个名为tan2(a)的表,表中有若干个整数(不要管是否重复),请编写一个名为f7的存储函数(无参数),统计该表中有多少数是若干个连续的正整数之和,并作为函数返回值返回。要求调用第6题的存储函数f6(n).
代码:
create or replace function f7 return integer
as
total integer:=0;
small integer;
begin
for e in(select * from a_db.tan2) loop
small:= f6(e.a);
total:=total+small;
end loop;
return total;
end;
set serveroutput on;
select f7() from dual;
截图:
8、编写一个名为pk8的程序包,包中重载两个过程,一个以员工号为参数,输出该员工信息;另一个以员工名为参数,输出员工信息。包中另一个过程利用两个重载过程分别查询员工号为7902、7934、以及员工名为SMITH、FORD的员工信息。
代码:
create or replace package pk8 as
procedure p1(vno emp.empno%type);
procedure p1(vname emp.ename%type);
procedure p2;
end;
截图:
截图:
create or replace
package body pk8 as
procedure p1(vno emp.empno%type)
as
vemp emp%rowtype;
begin
select * into vemp
from emp
where empno=vno;
dbms_output.put_line('姓名:'||vemp.ename||',职位:'||vemp.job||
',管理者编号:'||vemp.mgr||',雇佣日期:'||vemp.hiredate||
',工资:'||vemp.sal||',提成:'||nvl(vemp.comm,0)||',部门编号:'||vemp.deptno);
end p1;
procedure p1(vname emp.ename%type)
as
vemp emp%rowtype;
begin
select * into vemp
from emp
where ename=vname;
dbms_output.put_line('姓名:'||vemp.ename||',职位:'||vemp.job||
',管理者编号:'||vemp.mgr||',雇佣日期:'||vemp.hiredate||
',工资:'||vemp.sal||',提成:'||nvl(vemp.comm,0)||',部门编号:'||vemp.deptno);
end p1;
procedure p2
as
begin
pk8.p1('7902');
pk8.p1('7934');
pk8.p1('smith');
pk8.p1('ford');
end p2;
end;
截图:
.
9、在示例“5.二进制转换为十进制”的bit_to_number函数中特意用到了动态SQL与BIN_TO_NUM函数。请换一种方式实现相同的功能,该存储函数命名为f9.
代码:
create or replace function f9 (v varchar2) return number
as
m integer;
total integer:=0;
i integer;
begin
i:=length(v);
for e in 0..i-1 loop
m:=to_number(substr(v,i-e,1))*2**e;
total:=total+m;
end loop;
return total;
end;
截图:
代码:
select f9('11010000') from dual;
截图: