当前位置: 代码网 > it编程>数据库>MsSqlserver > PL/SQL 循环、自定义函数以及存储过程实例详解

PL/SQL 循环、自定义函数以及存储过程实例详解

2026年05月08日 MsSqlserver 我要评论
本文系统梳理了pl/sql三大核心内容:循环结构:包括for循环(固定次数)、while循环(条件判断)及break/continue控制语句;自定义函数:强调必须返回值的特性,演示了数值计算和业务查

本文系统梳理了pl/sql三大核心内容:

  1. 循环结构:包括for循环(固定次数)、while循环(条件判断)及break/continue控制语句;
  2. 自定义函数:强调必须返回值的特性,演示了数值计算和业务查询两种应用场景;
  3. 存储过程:侧重数据处理流程封装,对比了与函数的关键差异(无返回值、不可sql调用)。

特别指出存储过程中is/as关键字不可省略的语法要求,并提供了典型练习案例(质数判断、字符串处理等)。

适用于数据库开发人员快速掌握pl/sql编程要点。

📘 一、循环结构

1. for 循环(最常用)

for i in 起始值..结束值 loop
  循环体;
end loop;
  • i 自动从起始值递增到结束值,步长为 1
  • 适合已知循环次数的场景

for 循环的步长固定为1,不能更改。

在 pl/sql 的 for 循环中,起始值..结束值 是一个闭区间,循环变量 i 会从起始值一直遍历到结束值,包括结束值本身

示例:判断质数

declare
  x number := &请输入数值;
  v_flag number := 0;
begin
  for i in 2..x-1 loop
    if mod(x, i) = 0 then
      v_flag := 1;
    end if;
  end loop;
  ...
end;

示例:99 乘法表

declare
  v_str varchar2(100);
begin
  for i in 1..9 loop
    v_str := '';
    for j in 1..i loop
      v_str := v_str || i || ' * ' || j || ' = ' || i*j || ' ';
    end loop;
    dbms_output.put_line(v_str);
  end loop;
end;

2. while 循环

while 条件 loop
  循环体;
  变量自增/自减;
end loop;
  • 适合未知循环次数,但知道结束条件的场景

示例:输出 1~100 奇数

declare
  v_num number := 1;
begin
  while v_num <= 100 loop
    if mod(v_num,2) = 1 then
      dbms_output.put_line(v_num);
    end if;
    v_num := v_num + 1;
  end loop;
end;

3. 循环控制语句(重要!)

关键字作用说明
break终止当前循环,循环外代码继续执行
continue跳过本次循环剩余代码,进入下一次循环
return直接结束整个程序(循环外代码也不执行)

📘 二、自定义函数(function)

语法结构

create or replace function 函数名(入参名 参数类型)
return 返回值类型
is
  变量声明;
begin
  逻辑体;
  return 结果;
end;

特点

  • 必须有返回值
  • 入参和返回值类型不能定义长度
  • 适合封装常用计算逻辑

示例:模拟 abs 函数

create or replace function abs_bak(p_num number)
return number
is
begin
  return replace(p_num, '-');
end;

示例:根据员工编号返回姓名(带错误处理)

📘 三、存储过程(procedure)

语法结构

create or replace procedure 过程名(入参名 参数类型)
is
  变量声明;
begin
  -- 数据同步、清洗、处理流程
end;

特点

  • 没有返回值
  • 适合封装数据处理流程(如 etl)

示例:同步部门最高薪资

create or replace procedure p_001
is
begin
  delete from h_sal_emp;
  insert into h_sal_emp
  select deptno, max(sal) from emp group by deptno;
  commit;
end;

调用方式

begin
  p_001;
end;

示例:带参数的过程

create or replace procedure p_002(c_job varchar2)
is
begin
  delete from emp_j where job = c_job;
  insert into emp_j select * from emp where job = c_job;
  commit;
end;

📘 四、函数 vs 存储过程(面试/考试重点)

对比项函数(function)存储过程(procedure)
返回值必须有没有
语法关键字functionprocedure
使用场景计算并返回一个值封装数据同步、处理流程
能否在 sql 中直接调用✅ 可以(如 select 函数名()❌ 不可以
是否必须有 return✅ 是❌ 否

oracle 存储过程 procedure 不允许使用 return 语句

✅ 典型练习题(建议手动敲一遍)

1. 循环练习

  • 使用 for / while 计算 1~200 之间所有偶数的和
  • 打印 1~x 之间所有的质数

2. 函数练习

-- 实现 elim 函数:删除字符串中第一次出现的指定字符
-- 示例:elim('a-b-c', '-') → 'ab-c'

3. 存储过程练习

-- 创建表 t_number(id number)
-- 创建过程 p_004(x),将比 x 小的所有奇数插入 t_number
create table t_number(
id number
);
commit;
create or replace procedure p_004(x number)
      is
      begin
        -- 清空表格
        delete from t_number;
        commit;
        -- 或者使用 truncate(更高效,但无法回滚)
        -- execute immediate 'truncate table t_number';
        for i in 1..x-1 loop
            if mod(i,2)=1
            then
            insert into t_number(id) values (i);
            end if;
        end loop;
        commit;
      end;
-- 调用存储过程
begin
p_004(100);
end;
select * from t_number;

补充:is可以省略不写吗

在 oracle 存储过程中,is(或 as)是必须的,不能省略。

存储过程的基本语法结构:

create or replace procedure 过程名(参数)
is      -- 或 as,必须存在,不能省略
begin
    -- 过程体
end;
/

is 和 as 的区别:

在存储过程中,is 和 as 完全等价,可以互换使用:

-- 使用 is
create or replace procedure p_004(x number) 
is
begin
    -- 逻辑
end;
-- 使用 as(同样正确)
create or replace procedure p_004(x number) 
as
begin
    -- 逻辑
end;

为什么不能省略?

is/as 的作用是:

  • 标记声明部分的开始(用于声明变量、游标等)
  • 分隔过程头部和主体
  • 语法规定的必需关键字
-- 错误示范(缺少 is/as)
create or replace procedure p_004(x number)  -- 编译错误!
begin
    null;
end;

对比其他数据库:

数据库语法is/as 是否必需
oracleis 或 as必需
sql serveras必需
postgresqlas必需(但写法不同)
mysql不需要不需要

总结:在 oracle 中创建存储过程,is 或 as 是必需的关键字,不能省略。如果没有任何变量声明,可以在 is 后直接写 begin

到此这篇关于pl/sql 循环、自定义函数以及存储过程实例详解的文章就介绍到这了,更多相关pl/sql 循环 自定义函数存储过程内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com