数据库实验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;

 

 

截图:

 

 

转载于:https://www.cnblogs.com/kiko2014551511/p/6170607.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一部分sql基础 9 基本查询语句 9 实验1:书写一个最简单的sql语句,查询一张表的所有行和所有列 9 实验2:查询一张表的所有行,但列的顺序我们自己决定 10 实验3:查询表的某些列,在列上使用表达式 10 实验4:使用sqlplus,进入sqlplus并进行简单的操作 11 实验5:查看当前用户的所有表和视图 13 实验6:关于null值的问题 15 实验7:在列上起一个别名 15 实验8:在显示的时候去掉重复的行 16 实验9:显示表的部分行和部分列,使用where子句过滤出想要的行 18 实验10:使用like查询近似的值 18 实验11:使用order by子句来进行排序操作 20 实验12:操作字符串的函数 22 实验13:操作数字的函数 25 实验14:操作日期的函数 25 实验15:操作数据为null的函数 31 实验16:分支的函数 32 实验17:分组统计函数 33 实验18:表的连接查询 36 实验19:sql99规则的表连接操作 40 实验20:子查询 41 DDL和DML语句 45 实验21:建立简单的表,并对表进行简单ddl操作 45 实验22:dml语句,插入删除和修改表的数据 49 实验23:事务的概念和事务的控制 52 实验24:在表上建立不同类型的约束 54 实验25:序列的概念和使用 58 实验26:建立和使用视图 60 实验27:查询结果的集合操作 63 实验28:高级分组rollup,cube操作 65 实验29:树结构的查询start with子句 66 实验30:高级dml操作 68 第二部分pl/sql基础 69 匿名块的编写 69 实验31:书写一个最简单的块,运行并查看结果 69 实验32:在块中操作变量 70 实验33:在块中操作表的数据 71 实验34:在块中的分支操作if语句 71 实验35:在块中使用循环,三种循环模式 72 实验36:在块中自定义数据类型,使用复合变量 73 实验37:在块中使用自定义游标 76 实验38:在块中处理错误exception 78 编写程序 80 实验39:触发器 80 实验40:编写函数 82 实验41:编写存储过程 83 实验42:编写包package 85 第三部分数据库的体系结构 88 实例的维护 88 实验43:数据库的最高帐号sys的操作系统认证模式 90 实验44:数据库的最高帐号sys的密码文件认证模式 92 实验45:数据库的两种初始化参数文件 92 实验46:启动数据库的三个台阶nomount,mount,open 95 实验47:停止数据库的四种模式 96 实验48:建立数据库 97 实验49:查找你想要的数据字典 99 控制文件 99 实验50:减少控制文件的个数 100 实验51:增加控制文件的个数 101 日志文件 104 实验52:日志文件管理和nologging的实现 107 数据文件 111 实验53:建立新的表空间 111 实验54:更改表空间的名称,更改数据文件的名称 113 表空间 116 实验55:建立临时表空间 117 实验56:大文件表空间和表空间的管理模式 118 数据库的逻辑结构 120 实验57:建立表,描述表的存储属性 121 实验58:数据库范围extent的管理 128 undo段的管理 134 实验59:数据库自动回退段的管理 135 实验60:数据库手工回退段的管理 136 实验61:通过回退段闪回历史数据 136 实验62:闪回数据的查询方法,以及历史交易 137 表—存储数据的最基本单元 138 实验63:rowid的使用 138 实验64:临时表和压缩数据表的使用 141 实验65:压缩存储数据 142 实验66:删除表中指定列操作 142 实验67:使用sqlldr加载外部的数据 143 实验68:使用utl_file包来将表的数据存储到外部文件 144 实验69:使用外部表 145 实验70:处理挂起的事务 146 索引 149 实验71:查看索引的内部信息 151 实验72:监控索引的使用状态 153 约束的管理 154 实验73:改变约束的状态 154 实验74:找到违反约束条件的行 155 Profile配置 156 实验75:管理密码的安全配置 156 实验76:限制会话的资源配置 157 权限管理 158 实验77:维护系统权限 158 实验78:维护对象权限 159 实验79:维护角色 160 实验80:审计 161 数据库字符集 162 实验81:配置国家语言支持 163 元数据 165 实验82:提取元数据dbms_metedata 165 第四部分数据库的网络配置 168 实验83:配置监听 168 实验84:客户端的网络配置 169 实验85:数据库共享连接的配置 171 实验86:数据库dblink 173 第五部分数据库的备份和恢复 174 Exp导出和imp导入 174 实验87:交互模式导出和导入数据 174 实验88:命令行模式导出和导入数据 175 实验89:参数文件模式导出和导入数据 175 实验90:导出和导入表的操作 176 实验91:导出和导入用户操作 178 实验92:导出和导入全数据库操作 179 实验93:导出和导入表空间操作 179 实验94:数据泵 179 冷备份 180 实验95:将冷备份恢复到其它目录 181 实验96:修改实例的名称 181 实验97:将冷备份恢复到其它主机 181 实验98:将数据库改为归档数据库 182 热备份 182 实验99:热备份数据文件 184 实验100:热备份控制文件 186 实验101:改变控制文件大大小 186 实验102:改变数据库的名称 187 实验103:使用老的控制文件进行数据库恢复 187 实验104:系统表空间损坏的恢复 187 实验105:非系统表空间损坏的恢复 188 实验106:索引表空间损坏的恢复 193 实验107:临时表空间损坏的恢复 195 实验108:无备份表空间损坏的恢复 195 实验109:日志挖掘 198 实验110:不完全恢复,删除表的恢复 199 实验111:不完全恢复,删除表空间的恢复 199 实验112:不完全恢复,当前日志损坏的恢复 199 实验113:不完全恢复,resetlogs后的再次恢复 203 实验114:表空间的传送 203 实验115:整个数据库的闪回 203 Rman备份和恢复 204 实验116:rman的连接,report和list命令 204 实验117:rman的copy命令 205 实验118:rman的backup命令 206 实验119:rman的backup备份增量级别 206 实验120:rman的backup备份片大小的限制 209 实验121:rman的backup备份数据文件 211 实验122:rman的backup备份控制文件 211 实验123:rman的backup备份归档日志文件 211 实验124:rman的backup备份二进制参数文件 212 实验125:rman的恢复目录的配置 212 实验126:rman的数据文件的恢复 212 实验127:rman的数据块完全恢复 213 实验128:rman的数据库不完全恢复 214 实验129:rman的数据库副本管理 214 实验130:rman的备份管理 214 第六部分数据库的优化 216 采集数据 216 实验131:优化工具utlbstat/utlestat的使用 216 实验132:优化工具spreport的使用 217 实验133:系统包dbms_job维护作业 217 Shared_pool 219 实验134:sql语句在shared_pool中的查询 219 实验135:shared_pool的sql命中率 220 实验136:数据字典的命中率查询 223 实验137:shared_pool保留区的判断 223 其它内存优化 224 实验138:db_cache命中率和db_cache的细化管理 224 实验139: v$latch的使用 225 实验140:log_buffer的优化 227 实验141:pga的优化 227 不同的存储格式 229 实验142:OMF管理的文件 229 实验143:处理行迁移 230 实验144:lock的信息查询 231 SQL语句的优化 234 实验145:explain列出执行计划 234 实验146:跟踪sql语句的使用 235 实验147:AUTOTRACE的使用 235 实验148:定位高消耗资源语句 236 实验149:收集数据库的统计信息 236 实验150:收集列的统计信息 238 实验151:自动收集统计信息 239 数据库的不同访问模式 240 实验152:全表扫描的优化 240 实验153:索引的五种使用模式 242 实验154:连接的三种模式 246 实验155:联合索引的建立 247 实验156:基于函数索引的建立 249 实验157:位图索引的建立 249 实验158:反键索引的建立 252 实验159:索引组织表的建立 253 实验160:cluster表的建立 253 实验161:物化视图的建立 253 实验162:查询重写 255 实验163:最后的sql优化办法,使用hints
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值