数据库实验7(pl/sql)

湘潭大学

     

 

 

 

 

     程:  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的程序包,包中重载两个过程,一个以员工号为参数,输出该员工信息;另一个以员工名为参数,输出员工信息。包中另一个过程利用两个重载过程分别查询员工号为79027934、以及员工名为SMITHFORD的员工信息。

 

代码:

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函数中特意用到了动态SQLBIN_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;

 

 

截图:

 

 

posted @ 2016-12-13 16:53  harara  阅读(847)  评论(0编辑  收藏  举报