// 查询并打印员工的姓名和薪水
declare// 定义光标
cursor cemp isselect ename, sal from emp;
pename emp.ename%type;
psal emp.sal%type;
begin// 打开光标
open cemp;
loop
// 取出当前记录
fetch cemp into pename, sal;
// 如果没有取到记录,则退出循环
exit when cemp%notfound;
dbms_output.put_line(pename||'的薪水是'||psal);
end loop;
// 关闭光标
close cemp;
end;
// 带参数的光标
// 查询某个部门的员工姓名
declare// dno number 表示形参
cursor cemp(dno number) isselect ename from emp where deptno=dno;
pename emp.ename%type;
beginopen cemp(20);
loop
fetch cemp into pename;
exit when cemp%notfound;
dbms_output.put_line(pename);
end loop;
close cemp;
end;
2.5 异常
系统定义异常
no_data_found: 没有找到数据;
too_many_rows: select...into 语句匹配多个行;
zero_divide: 被零除;
value_error: 算术或转换错误;
timeout_on_resource: 在等待资源时,发生超时;
3. 存储过程和存储函数
概念
存储在数据库中供所有用户程序调用的子程序叫存储过程,存储函数;
存储过程
// 创建存储过程
create [or replace] PROCEDURE 过程名(参数列表)
AS
PLSQL 子程序体;
// 给指定的员工涨100, 并且打印涨前和涨后的薪水create or replace procedure raiseSalary(eno in number)
as// 定义变量,用来保存涨前的薪水
psal emp.sal%type;
begin
// 得到涨前的薪水select sal into psal from emp where empno=eno;
// 涨100
update emp set sal=sal+100where empno=eno;
// 输出
dbms_output.put_line('涨前: '||psal||' 涨后:'||(psal+100));
end sayHelloWorld;
// 调用存储过程// 第一种方式exec raiseSalary(7556);
// 第二种方式begin
raiseSalary(7556);
raiseSalary(7839);
commit;
end;
// 创建存储函数
CREATE [OR REPLACE] FUNCTION 函数名(参数列表)
RETURN 函数值类型
AS
PLSQL 子程序体;
4. 包结构和包体
// 需求: 在 out 参数中使用游标// 查询某个部门中所有员工的所有信息// 申明包结构
CREATER OR REPLACE PACKAGE MYPACKAGE AS// 自定义类型, "ref cursor"表示为游标类型type empcursor is ref cursor;
// 定义存储过程, 即查询某个部门中所有员工的信息procedurequeryEmpList(dno in number, empList out empcursor);END MYPACKAGE;
// 创建包体
CREATE OR REPLACE PACKAGE BODY MYPACKAGE AS// 对存储过程的实现procedurequeryEmpList(dno in number, empList out empcursor)ASbeginopenempListforselect * fromempwheredeptno=dno;end queryEmpList;
END MYPACKAGE;
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 如何打造一个高并发系统?
· 【译】我们最喜欢的2024年的 Visual Studio 新功能