zoukankan      html  css  js  c++  java
  • 数据库实验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;

    截图:

     

    作者:小念
    本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    C 语言实例
    C 语言实例
    C 语言实例
    C 语言实例
    C 语言实例
    C 语言实例
    C 语言实例
    C 语言实例
    YQCB冲刺第二周第二天
    YQCB冲刺第二周第一天
  • 原文地址:https://www.cnblogs.com/kiko2014551511/p/6170607.html
Copyright © 2011-2022 走看看