news 2026/5/7 20:41:45

(课堂笔记)PL/SQL 循环 自定义函数 存储过程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(课堂笔记)PL/SQL 循环 自定义函数 存储过程

本文系统梳理了PL/SQL三大核心内容:

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

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


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


PL/SQL 循环、函数、存储过程的核心知识点


📘 一、循环结构

1. FOR 循环(最常用)

sql

FOR I IN 起始值..结束值 LOOP 循环体; END LOOP;
  • I自动从起始值递增到结束值,步长为 1

  • 适合已知循环次数的场景


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


在 PL/SQL 的 FOR 循环中,起始值..结束值是一个闭区间,循环变量I会从起始值一直遍历到结束值,包括结束值本身


示例:判断质数

sql

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 乘法表

sql

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 循环

sql

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

示例:输出 1~100 奇数

sql

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)

语法结构

sql

CREATE OR REPLACE FUNCTION 函数名(入参名 参数类型) RETURN 返回值类型 IS 变量声明; BEGIN 逻辑体; RETURN 结果; END;

特点

  • 必须有返回值

  • 入参和返回值类型不能定义长度

  • 适合封装常用计算逻辑

示例:模拟 ABS 函数

sql

CREATE OR REPLACE FUNCTION ABS_BAK(P_NUM NUMBER) RETURN NUMBER IS BEGIN RETURN REPLACE(P_NUM, '-'); END;
示例:根据员工编号返回姓名(带错误处理)

sql

CREATE OR REPLACE FUNCTION F_NAME(P_EMPNO NUMBER) RETURN VARCHAR2 IS V_ENAME VARCHAR2(100); V_CNT NUMBER; BEGIN SELECT COUNT(1) INTO V_CNT FROM EMP WHERE EMPNO = P_EMPNO; IF V_CNT = 0 THEN RETURN '该员工不存在!'; ELSE SELECT ENAME INTO V_ENAME FROM EMP WHERE EMPNO = P_EMPNO; RETURN V_ENAME; END IF; END;

📘 三、存储过程(PROCEDURE)

语法结构

sql

CREATE OR REPLACE PROCEDURE 过程名(入参名 参数类型) IS 变量声明; BEGIN -- 数据同步、清洗、处理流程 END;

特点

  • 没有返回值

  • 适合封装数据处理流程(如 ETL)

示例:同步部门最高薪资

sql

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;
调用方式

sql

BEGIN P_001; END;
示例:带参数的过程

sql

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. 函数练习

sql

-- 实现 ELIM 函数:删除字符串中第一次出现的指定字符 -- 示例:ELIM('A-B-C', '-') → 'AB-C'

3. 存储过程练习

sql

-- 创建表 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)是必须的,不能省略。


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

sql

CREATE OR REPLACE PROCEDURE 过程名(参数) IS -- 或 AS,必须存在,不能省略 BEGIN -- 过程体 END; /

IS 和 AS 的区别:

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

sql

-- 使用 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的作用是:

  1. 标记声明部分的开始(用于声明变量、游标等)

  2. 分隔过程头部和主体

  3. 语法规定的必需关键字

sql

-- 错误示范(缺少 IS/AS) CREATE OR REPLACE PROCEDURE p_004(x NUMBER) -- 编译错误! BEGIN NULL; END;

对比其他数据库:

数据库语法IS/AS 是否必需
OracleISAS必需
SQL ServerAS必需
PostgreSQLAS必需(但写法不同)
MySQL不需要不需要

总结:在 Oracle 中创建存储过程,ISAS必需的关键字,不能省略。如果没有任何变量声明,可以在IS后直接写BEGIN

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 20:36:40

Unlock-Music:打破音乐平台枷锁,让你的音乐真正属于你

Unlock-Music&#xff1a;打破音乐平台枷锁&#xff0c;让你的音乐真正属于你 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目…

作者头像 李华
网站建设 2026/5/7 20:35:21

在线抠图软件免费版有哪些?2026年最实用工具对比推荐

作为一个经常需要处理图片的人&#xff0c;我发现抠图真的是日常高频需求。无论是证件照换底色、商品图去背景&#xff0c;还是制作透明背景素材&#xff0c;选对工具能省下不少时间。最近我体验了市面上多款免费在线抠图软件&#xff0c;今天就来分享一下我的真实使用感受。我…

作者头像 李华
网站建设 2026/5/7 20:34:31

ChanlunX:基于C++的缠论技术分析插件架构与实现

ChanlunX&#xff1a;基于C的缠论技术分析插件架构与实现 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX ChanlunX是一个面向通达信金融终端的缠论技术分析插件&#xff0c;采用C语言实现缠论核心算法&am…

作者头像 李华
网站建设 2026/5/7 20:34:30

Needle核心组件详解:Component与Dependency协议的最佳实践

Needle核心组件详解&#xff1a;Component与Dependency协议的最佳实践 【免费下载链接】needle Compile-time safe Swift dependency injection framework 项目地址: https://gitcode.com/gh_mirrors/need/needle Needle是一个编译时安全的Swift依赖注入框架&#xff0c…

作者头像 李华
网站建设 2026/5/7 20:33:33

OpenClaw插件实现聊天工具与Codex开发助手无缝集成

1. 项目概述&#xff1a;在聊天中无缝接入你的本地开发工作流如果你和我一样&#xff0c;日常开发工作流重度依赖像 Codex 这样的智能编码助手&#xff0c;同时又习惯了在 Telegram 或 Discord 的群聊、频道里和团队沟通&#xff0c;那么你很可能面临一个割裂的体验&#xff1a…

作者头像 李华
网站建设 2026/5/7 20:33:00

基于霍夫变换的圆形物体检测和计数

一、前言在计算机视觉的实际应用中&#xff0c;圆形物体检测与计数是非常经典的场景&#xff1a;工业零件质检、药丸计数、圆形工件分拣、硬币统计等场景都离不开这项技术。而霍夫变换&#xff08;Hough Transform&#xff09; 就是实现圆形检测最核心、最经典的算法之一&#…

作者头像 李华