PL/SQL程序基础2

  • 一.实验目标
  • 二.实验项目
  • 三.实验错误解决方案

一.实验目标

掌握较复杂的PL/SQL编程方法。具备如下能力:

  1. 针对数据库应用领域的数据需求,设计出基于Oracle数据库的解决方案的能力;
  2. 承担Oracle数据库系统的实施、运行与维护等基本工作的能力。

二.实验项目

  1. 在A_DB模式中有一个表tan1(a),表中有若干个整数(不要管是否有重复)。
    请编写一个名为obj4_1 的存储函数(无参数),统计该表中有多少个数是素数,并作为函数返回值返回。
create or replace function obj4_1 return integer asm integer:=0;is_prim boolean;beginfor e in (select * from A_DB.tan1) loopbeginis_prim:=true;for j in 2..trunc(sqrt(e.a)) loopif mod(e.a,j)=0 thenbeginis_prim:=false;exit;end;end if;
end loop;if is_prim thenm:=m+1;end if;end;end loop;return m;
end;
.
/
select obj4_1() 素数个数 from DUAL;
  1. 在A_DB模式中有一个表tan3(a),表中有若干个整数(不要管是否有重复),假设这些数表示年份。请编写一个名为obj4_2的存储函数(无参数),统计该表中有多少个年份是闰年,并作为函数返回值返回。说明:闰年的计算方法:被400整除,或被4整除而不能被100整除的年份为闰年。说明:闰年的计算方法:被400整数,或被4整除而不能被100整除的年份为闰年。
    create or replace
    function obj4_2 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;
    .
    /
    select obj4_2 from dual;

  2. 在A_DB模式中有一个表tanbn1(a,b)。
    请编写一个名为obj4_3的存储函数(无参数),对于表中所有三位数abc,将个位与百位数字交换,得到cba,求这些cba的和,并作为函数返回值返回。
    create or replace
    function obj4_3 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 obj4_3 result from dual;

  3. 对称字符串。
    在A_DB模式中有一个表tac1(a),表中有若干个字符串(不要管是否有重复)。
    请编写一个名为obj4_4的存储函数(无参数),统计该表中有多少对称字符串,并作为函数返回值返回。
    说明:对称字符串是正读倒读一样的字符串。如:“abcdcba”、“6”和"123321"等前后对称,是对称字符串;而“12332”不是。
    create or replace
    function obj4_4 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 obj4_4() from dual;

  4. 编写一个名为obj4_5的存储过程,判断正整数n是否是若干个连续的正整数之和。如是,则输出这些连续的正整数;如果有多串连续的正整数,则输出最长的那串连续的正整数。n是过程的参数。如:15=1+2+3+4+5,15=7+8,则输出1,2,3,4,5。
    create or replace
    procedure obj4_5(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;
    .
    /

  5. 编写一个名为obj4_6的存储函数,判断正整数n是否是若干个连续的正整数之和。如是,则返回1,否则返回0。n是函数的参数。
    create or replace
    function obj4_6 (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 obj4_6(12) result from dual;

  6. 在A_DB模式中有一个表tan2(a),表中有若干个整数(不要管是否有重复)。
    请编写一个名为obj4_7的存储函数(无参数),统计该表中有多少个数是若干个连续的正整数之和,并作为函数返回值返回。要求调用第6题编写的存储函数f6(n)。

create or replace
function obj4_7 return integerastotal integer:=0;small integer;
beginfor e in(select * from a_db.tan2) loopsmall:= obj4_6(e.a);total:=total+small;
end loop;
return total;
end;
.
/
select obj4_7() from dual;
  1. 编写一个名为obj4_8的程序包,包中重载两个过程,一个以员工号为参数,输出该员工信息;另一个以员工名为参数,输出员工信息。包中另一个过程利用两个重载过程分别查询员工号为7902、7934、以及员工名为SMITH、FORD的员工信息。
create or replace package obj4_8 asprocedure p1(vno emp.empno%type);procedure p1(vname emp.ename%type);procedure p2;
end;create or replace
package body obj4_8 asprocedure p1(vno emp.empno%type)asvemp emp%rowtype;beginselect * into vempfrom empwhere 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)asvemp emp%rowtype;beginselect * 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 p2asbeginobj4_8.p1('7902');obj4_8.p1('7934');obj4_8.p1('smith');obj4_8.p1('ford');end p2;
end;
.
/
  1. 在示例“5.二进制转换为十进制”的bit_to_number函数中特意用到了动态SQL与BIN_TO_NUM函数。请换一种方式实现相同的功能,该存储函数命名为obj4_9。
create or replace
function obj4_9 (v varchar2) return numberasm integer;total integer:=0;i integer;begini:=length(v);for e in 0..i-1 loopm:=to_number(substr(v,i-e,1))*2**e;total:=total+m;end loop;return total;
end;
.
/
select obj4_9('11010000') from dual;

三.实验错误解决方案

问题一: 函数创建成功,没有输出结果问题
1、问题的出现
在实验项目9中创建“二进制转换为十进制”函数,SQL语句如下:

create or replace function obj4_9 (v varchar2) return numberasm integer;t integer;i integer;begini:=length(v);for e in 0..i-1 loopm:=(substr(v,i-e,1))*2**e;t:=t+m;end loop;return t;
end;
.
/

出现错误:
输出结果与实际不相符

2、问题分析

通过分析与同学进行讨论发现第5行定义变量t时没有给变量赋初始值,所以出错。

3、解决方案
解决方案如下:

create or replace
function obj4_9 (v varchar2) return numberasm integer;total integer:=0;i integer;begini:=length(v);for e in 0..i-1 loopm:=to_number(substr(v,i-e,1))*2**e;total:=total+m;end loop;return total;
end;
.
/
select obj4_9('11010000') from dual;

执行该语句后,函数已创建,输出结果与预期相符合,问题解决。

PL/SQL程序基础2相关推荐

  1. PL/SQL程序基础1

    PL/SQL程序基础1 一.实验目标 1.针对数据库应用领域的数据需求,设计出基于Oracle数据库的解决方案的能力: 2.承担Oracle数据库系统的实施.运行与维护等基本工作的能力. 二.实验项目 ...

  2. Oracle数据库之PL/SQL程序基础设计

    一.PL/SQL块结构 前边我们已经介绍了PL/SQL块的结构,再来回顾一下: DECLARE /** 声明部分--定义常量.变量.复杂数据类型.游标.用户自定义异常*/ BEGIN /** 执行部分 ...

  3. PL/SQL语言基础

    PL/SQL语言基础 /********************************数据类型*************************************/ %rowtype  (行对 ...

  4. PL/SQL编程基础(一):PL/SQL语法简介(匿名PL/SQL块)

    PL/SQL PL/SQL是Oracle在关系数据库结构化查询语言SQL基础上扩展得到的一种过程化查询语言. SQL与编程语言之间的不同在于,SQL没有变量,SQL没有流程控制(分支,循环).而PL/ ...

  5. ORA-00980与PL/SQL程序编译出错

        今天碰到一个有意思的问题.     为了降低统计分析数据库的计算和磁盘空间压力.我们使用了将远程数据库中数据通过DBLINK和SYNONYM的形式来缓解当前统计数据库所面临的问题.工作实施的比 ...

  6. Oracle 实验六:PL/SQL编程基础(1)

    实验六:PL/SQL编程基础(1) 一.实验目的 1.熟悉掌握PL/SQL编程中的变量定义语句 2.熟悉掌握PL/SQL编程中的条件语句和循环语句等流程控制语句. 3.能熟练使用上述基本语句编写PL/ ...

  7. Oracle PL/SQL语句基础学习笔记(上)

    PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL ...

  8. KingbaseES PL/SQL 过程语言参考手册(3. PL/SQL语言基础)

    3. PL/SQL语言基础¶ 本章节阐述PL/SQL语言的基本组成. 字符集 词法单元 声明 对标识符的引用 标识符的作用域和可见性 为变量赋值 表达式 错误报告函数 3.1. 字符集 任何要由PL/ ...

  9. 视频教程-赵强老师:Oracle数据库从10g到11g(4)PL/SQL编程基础-Oracle

    赵强老师:Oracle数据库从10g到11g(4)PL/SQL编程基础 毕业于清华大学,拥有超过13年的工作经验. Oracle认证讲师,拥有6年以上授课经验.精通Oracle数据库.中间(Weblo ...

最新文章

  1. 循环神经网络(RNN)简介
  2. 打不死的小强机器人来了,向心加速度堪比猎豹,能抵抗自身数百倍重量碾压...
  3. Dubbo的总体架构
  4. 如何让EasyUI弹出层跳出框架
  5. 计算机网络-TCP拥塞控制
  6. JavaScript数据结构与算法——栈详解
  7. P3387-【模板】缩点【tarjan,强联通分量,DAGdp】
  8. as3 访问远程计算机,本地swf不能访问网络的解决办法
  9. junit 单元测试报错java.lang.NoClassDefFoundError
  10. python 生成器装饰器_对Python生成器、装饰器、递归的使用详解
  11. CANoe软件打不开了怎么办?
  12. oracle导出为dmp文件,oracle导出dmp文件的2种方法
  13. git如何查看缓存区文件内容_[暂存盘已满怎么解决]git暂存区的理解
  14. 斐讯w2Android Wear,有人研究过W2的连接QRcode吗?
  15. 《西游记》《封神榜》各路神仙基本层次图,不要再傻傻分不清楚了
  16. Libero逻辑分析仪的使用(基本篇)
  17. html directive 内容传递,directive的传值问题(全面解析directive的传值问题)微信分享实例...
  18. 数据结构学习(冒泡、选择、插入、快速排序)
  19. 【愚公系列】2023年02月 .NET CORE工具案例-Lunar日历转换
  20. Taro 动画 之放大缩小

热门文章

  1. CSS中的nth-child和nth-of-type选择器
  2. 25-方向传感器实现指南针
  3. Object Detection : One-stage Detector YOLO
  4. 彩色流程图怎么做?这样的操作方法你尝试过吗?
  5. 项链(牛客竞赛2020-普及组第四场-T4)
  6. 8.0钓鱼宏命令插件 使用方法
  7. TensorFlow报AttributeError: module tensorflow has no attribute io
  8. 爬虫学的好,牢饭吃得好(爬虫实例)
  9. 简单演示Exploit SEH原理(未开启SafeSEH模块)
  10. android平板更新系统,终于跟上安卓!iPad Pro新功能曝光:系统升级方便了