/* 子程序:有名字的plsql块 存储过程:过程procedure::没有返回值的子程序 函数:::::function::有返回值的子程序 子程序的优点:
>模块化 一个子程序代表一个完整的功能 >复用性 定义完后 可以通过名字直接来调用 >提高维护性 直接定位方法 维护起来方便简单 >提高安全性
调用者只能看到子查询到的声明 无法干涉程序具体执行 可以通过设置权限 只让可信任的用户进行操作此程序 存储过程的格式: create or replace
procedure 存储过程名(参数列表) as|is 定义变量的语句 begin 实现功能的具体代码 exception 处理异常的代码 end; */
-- 获取1到n的和 create or replace procedure pro_1(n int) is sumn int:=0; begin for m
in 1..n loop sumn:=sumn+m; end loop; dbms_output.put_line('1到'||n||'的和::'||sumn)
; end; -- 调用存储过程:方式1:通过plsql块 begin pro_1(10); end; --
调用存储过程:方式2:通过execute关键字:::但此方式在plsql developer中不识别 -- 通过oracle自带的客户端 sql plus来测试
-- 在sql plus中输入:set serverout on ; 开启oracle的系统输出流 execute pro_1(11); --
查询所有的存储过程 select * from user_procedures; -- 删除存储过程 drop procedure pro_1; --
注意事项1:子程序的参数列表不能指定精度 -- 对参数字符串解析转换:大写转换为小写 小写转化为大写 删除数字字符 create or replace
procedure pro_2(str varchar) is strNew varchar(100):=''; c varchar(3); begin for
iin 1..length(str) loop c:=substr(str,i,1); if ascii(c) >=ascii('a') and ascii(
c) <=ascii('z') then strNew:=strNew||upper(c); elsif ascii(c) >=ascii('A') and
ascii(c) <=ascii('Z') then strNew:=strNew||lower(c); elsif ascii(c) >ascii('9')
or ascii(c) <ascii('0') then strNew:=strNew||c; end if; end loop; dbms_output.
put_line(str||'::'||strNew); end; -- 调用 begin pro_2('&请输入一个字符串:'); end; ---
练习1:从1开始累加 判断加到几时 和第一次大于1000 -- 注意事项2:存储过程 如果没有参数列表 ()省略 create or replace
procedure pro_11 is sumn int:=0; n int:=1; begin loop sumn:=sumn+n; if sumn >
1000 then exit; end if; n:=n+1; end loop; dbms_output.put_line('从1开始累加 判断加到'||n
||'时 和第一次大于1000:::'||sumn); end; -- 调用 begin pro_11; end; ---
练习2:获取祖冲之计算到3.1415926到3.1415927时 计算的次数 create or replace procedure pro_12 is pi
float:=0; ciShu int:=0; numPi float:=0; begin while pi <3.1415926 or pi >
3.1415927 loop ciShu:=ciShu+1; --次数加1 numPi:=4/(ciShu*2-1); -- 每次的加数 if mod(
ciShu,2)=1 then pi:=pi+numPi; else pi:=pi-numPi; end if; end loop; dbms_output.
put_line('获取祖冲之计算到3.1415926到3.1415927时 '||pi||'计算的次数:::'||ciShu); end; -- 调用
begin pro_12; end; --- 练习3: 输入一个字符串 打印其大小写转换 并删除数字后的结果 --- 练习4:获取1到10000内
所有的完数:n的所有因子之和等于n :如果m可以除尽n m就是n的因子 本身不是本身的因子 -- 6: 1+2+3 create or replace
procedure pro_14 is yinZiSum int:=0; begin for n in 1..10000 loop yinZiSum:=0;
-- 判断当前n是不是完数 for m in 1..n-1 loop if mod(n,m)=0 then yinZiSum:=yinZiSum+m; end
if; end loop; if yinZiSum=n then dbms_output.put_line(n||'是完数!'); end if; end
loop; end; -- 调用 begin pro_14; end;

技术
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:766591547
关注微信