PL/SQL程序基础2
PL/SQL程序基础2
- 一.实验目标
- 二.实验项目
- 三.实验错误解决方案
一.实验目标
掌握较复杂的PL/SQL编程方法。具备如下能力:
- 针对数据库应用领域的数据需求,设计出基于Oracle数据库的解决方案的能力;
- 承担Oracle数据库系统的实施、运行与维护等基本工作的能力。
二.实验项目
- 在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;
在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;在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;对称字符串。
在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;编写一个名为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;
.
/编写一个名为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;在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;
- 编写一个名为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;
.
/
- 在示例“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相关推荐
- PL/SQL程序基础1
PL/SQL程序基础1 一.实验目标 1.针对数据库应用领域的数据需求,设计出基于Oracle数据库的解决方案的能力: 2.承担Oracle数据库系统的实施.运行与维护等基本工作的能力. 二.实验项目 ...
- Oracle数据库之PL/SQL程序基础设计
一.PL/SQL块结构 前边我们已经介绍了PL/SQL块的结构,再来回顾一下: DECLARE /** 声明部分--定义常量.变量.复杂数据类型.游标.用户自定义异常*/ BEGIN /** 执行部分 ...
- PL/SQL语言基础
PL/SQL语言基础 /********************************数据类型*************************************/ %rowtype (行对 ...
- PL/SQL编程基础(一):PL/SQL语法简介(匿名PL/SQL块)
PL/SQL PL/SQL是Oracle在关系数据库结构化查询语言SQL基础上扩展得到的一种过程化查询语言. SQL与编程语言之间的不同在于,SQL没有变量,SQL没有流程控制(分支,循环).而PL/ ...
- ORA-00980与PL/SQL程序编译出错
今天碰到一个有意思的问题. 为了降低统计分析数据库的计算和磁盘空间压力.我们使用了将远程数据库中数据通过DBLINK和SYNONYM的形式来缓解当前统计数据库所面临的问题.工作实施的比 ...
- Oracle 实验六:PL/SQL编程基础(1)
实验六:PL/SQL编程基础(1) 一.实验目的 1.熟悉掌握PL/SQL编程中的变量定义语句 2.熟悉掌握PL/SQL编程中的条件语句和循环语句等流程控制语句. 3.能熟练使用上述基本语句编写PL/ ...
- Oracle PL/SQL语句基础学习笔记(上)
PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL ...
- KingbaseES PL/SQL 过程语言参考手册(3. PL/SQL语言基础)
3. PL/SQL语言基础¶ 本章节阐述PL/SQL语言的基本组成. 字符集 词法单元 声明 对标识符的引用 标识符的作用域和可见性 为变量赋值 表达式 错误报告函数 3.1. 字符集 任何要由PL/ ...
- 视频教程-赵强老师:Oracle数据库从10g到11g(4)PL/SQL编程基础-Oracle
赵强老师:Oracle数据库从10g到11g(4)PL/SQL编程基础 毕业于清华大学,拥有超过13年的工作经验. Oracle认证讲师,拥有6年以上授课经验.精通Oracle数据库.中间(Weblo ...
最新文章
- 循环神经网络(RNN)简介
- 打不死的小强机器人来了,向心加速度堪比猎豹,能抵抗自身数百倍重量碾压...
- Dubbo的总体架构
- 如何让EasyUI弹出层跳出框架
- 计算机网络-TCP拥塞控制
- JavaScript数据结构与算法——栈详解
- P3387-【模板】缩点【tarjan,强联通分量,DAGdp】
- as3 访问远程计算机,本地swf不能访问网络的解决办法
- junit 单元测试报错java.lang.NoClassDefFoundError
- python 生成器装饰器_对Python生成器、装饰器、递归的使用详解
- CANoe软件打不开了怎么办?
- oracle导出为dmp文件,oracle导出dmp文件的2种方法
- git如何查看缓存区文件内容_[暂存盘已满怎么解决]git暂存区的理解
- 斐讯w2Android Wear,有人研究过W2的连接QRcode吗?
- 《西游记》《封神榜》各路神仙基本层次图,不要再傻傻分不清楚了
- Libero逻辑分析仪的使用(基本篇)
- html directive 内容传递,directive的传值问题(全面解析directive的传值问题)微信分享实例...
- 数据结构学习(冒泡、选择、插入、快速排序)
- 【愚公系列】2023年02月 .NET CORE工具案例-Lunar日历转换
- Taro 动画 之放大缩小
热门文章
- CSS中的nth-child和nth-of-type选择器
- 25-方向传感器实现指南针
- Object Detection : One-stage Detector YOLO
- 彩色流程图怎么做?这样的操作方法你尝试过吗?
- 项链(牛客竞赛2020-普及组第四场-T4)
- 8.0钓鱼宏命令插件 使用方法
- TensorFlow报AttributeError: module tensorflow has no attribute io
- 爬虫学的好,牢饭吃得好(爬虫实例)
- 简单演示Exploit SEH原理(未开启SafeSEH模块)
- android平板更新系统,终于跟上安卓!iPad Pro新功能曝光:系统升级方便了