77人参与 • 2026-05-08 • MsSqlserver
本文系统梳理了pl/sql三大核心内容:
特别指出存储过程中is/as关键字不可省略的语法要求,并提供了典型练习案例(质数判断、字符串处理等)。
适用于数据库开发人员快速掌握pl/sql编程要点。
for i in 起始值..结束值 loop 循环体; end loop;
i 自动从起始值递增到结束值,步长为 1for 循环的步长固定为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;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;while 条件 loop 循环体; 变量自增/自减; end loop;
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;| 关键字 | 作用说明 |
|---|---|
break | 终止当前循环,循环外代码继续执行 |
continue | 跳过本次循环剩余代码,进入下一次循环 |
return | 直接结束整个程序(循环外代码也不执行) |
create or replace function 函数名(入参名 参数类型) return 返回值类型 is 变量声明; begin 逻辑体; return 结果; end;
create or replace function abs_bak(p_num number) return number is begin return replace(p_num, '-'); end;
create or replace procedure 过程名(入参名 参数类型) is 变量声明; begin -- 数据同步、清洗、处理流程 end;
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;
| 对比项 | 函数(function) | 存储过程(procedure) |
|---|---|---|
| 返回值 | 必须有 | 没有 |
| 语法关键字 | function | procedure |
| 使用场景 | 计算并返回一个值 | 封装数据同步、处理流程 |
| 能否在 sql 中直接调用 | ✅ 可以(如 select 函数名()) | ❌ 不可以 |
是否必须有 return | ✅ 是 | ❌ 否 |
-- 实现 elim 函数:删除字符串中第一次出现的指定字符
-- 示例:elim('a-b-c', '-') → 'ab-c'-- 创建表 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;在 oracle 存储过程中,is(或 as)是必须的,不能省略。
create or replace procedure 过程名(参数)
is -- 或 as,必须存在,不能省略
begin
-- 过程体
end;
/在存储过程中,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 是否必需 |
|---|---|---|
| oracle | is 或 as | 必需 |
| sql server | as | 必需 |
| postgresql | as | 必需(但写法不同) |
| mysql | 不需要 | 不需要 |
总结:在 oracle 中创建存储过程,is 或 as 是必需的关键字,不能省略。如果没有任何变量声明,可以在 is 后直接写 begin。
到此这篇关于pl/sql 循环、自定义函数以及存储过程实例详解的文章就介绍到这了,更多相关pl/sql 循环 自定义函数存储过程内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论