(课堂笔记)PL/SQL 循环 自定义函数 存储过程
本文系统梳理了PL/SQL三大核心内容循环结构包括FOR循环固定次数、WHILE循环条件判断及BREAK/CONTINUE控制语句自定义函数强调必须返回值的特性演示了数值计算和业务查询两种应用场景存储过程侧重数据处理流程封装对比了与函数的关键差异无返回值、不可SQL调用。特别指出存储过程中IS/AS关键字不可省略的语法要求并提供了典型练习案例质数判断、字符串处理等。适用于数据库开发人员快速掌握PL/SQL编程要点。PL/SQL 循环、函数、存储过程的核心知识点 一、循环结构1. FOR 循环最常用sqlFOR I IN 起始值..结束值 LOOP 循环体 END LOOP;I自动从起始值递增到结束值步长为 1适合已知循环次数的场景for 循环的步长固定为1不能更改。在 PL/SQL 的 FOR 循环中起始值..结束值是一个闭区间循环变量I会从起始值一直遍历到结束值包括结束值本身。示例判断质数sqlDECLARE 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 乘法表sqlDECLARE 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 循环sqlWHILE 条件 LOOP 循环体 变量自增/自减 END LOOP;适合未知循环次数但知道结束条件的场景示例输出 1~100 奇数sqlDECLARE 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语法结构sqlCREATE OR REPLACE FUNCTION 函数名(入参名 参数类型) RETURN 返回值类型 IS 变量声明 BEGIN 逻辑体 RETURN 结果 END;特点必须有返回值入参和返回值类型不能定义长度适合封装常用计算逻辑示例模拟 ABS 函数sqlCREATE OR REPLACE FUNCTION ABS_BAK(P_NUM NUMBER) RETURN NUMBER IS BEGIN RETURN REPLACE(P_NUM, -); END;示例根据员工编号返回姓名带错误处理sqlCREATE 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语法结构sqlCREATE OR REPLACE PROCEDURE 过程名(入参名 参数类型) IS 变量声明 BEGIN -- 数据同步、清洗、处理流程 END;特点没有返回值适合封装数据处理流程如 ETL示例同步部门最高薪资sqlCREATE 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;调用方式sqlBEGIN P_001; END;示例带参数的过程sqlCREATE 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-C3. 存储过程练习sql-- 创建表 T_NUMBER(ID NUMBER) -- 创建过程 P_004(X)将比 X 小的所有奇数插入 T_NUMBERcreate 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是必须的不能省略。存储过程的基本语法结构sqlCREATE OR REPLACE PROCEDURE 过程名(参数) IS -- 或 AS必须存在不能省略 BEGIN -- 过程体 END; /IS 和 AS 的区别在存储过程中IS和AS完全等价可以互换使用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的作用是标记声明部分的开始用于声明变量、游标等分隔过程头部和主体语法规定的必需关键字sql-- 错误示范缺少 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。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2592601.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!