Oracle中 关于数据库存储过程和存储函数的使用
存储过程没有返回值。存储函数有返回值
创建存储过程
用CREATE PROCEDURE命令建立存储过程和存储函数。
语法
create [or replace] PROCEDURE过程名(参数列表)
AS
PLSQL子程序体;
存储过程示例为指定的职工在原工资的基础上长10%的工资
/
为指定的职工在原工资的基础上长10%的工资,并打印工资前和工资后的工资
/
SQL> create or replace procedure raiseSalary(empid in number)
as
pSal emp.sal%type;--保存员工当前 工资
begin
--查询该员工的工资
select sal into pSal from emp where empno=empid;
--给该员工涨工资
update emp set sal = sal1.1 where empno=empid;
--打印涨工资前后的工资
dbms_output.put_line('员工号:' || empid || '涨工资前
' || psal || '涨工资后' || psal1.1);
end;
1 /
Procedure created
--存储过程调用
--方法一
SQL> set serveroutput on
SQL> exec raisesalary(7369);
员工号:7369涨工资前
800涨工资后880
方法二
set serveroutput on
begin
raisesalary(7369);
end;
/
PL/SQL procedure suessfully pleted
存储函数
函数(Function)为一命名的存储程序,可带参数,并返回一计算值。函数和过程的结构类似,但必须有一个RETURN子句,用于返回函数值。函数说明要指定函数名、结果值的类型,以及参数类型等。
建立存储函数的语法
CREATE [OR REPLACE] FUNCTION函数名(参数列表)
RETURN 函数值类型
AS
PLSQL子程序体;
示例查询某职工的年收入。
SQL> //
/
查询某职工的总收入
/
create or replace function queryEmpSalary(empid in number)
return number
as
pSal number; --定义变量保存员工的工资
pComm number; --定义变量保存员工的奖金
begin
select sal,m into psal,pm from emp where empno = empid;
return psal12+nvl(pm,0);
end;
/
Function created
l 函数的调用
SQL> declare
v_sal number;
begin
v_sal:=queryEmpSalary(7934);
dbms_output.put_line('salary is:'|| v_sal);
end;
/
salary is:15600
PL/SQL procedure suessfully pleted
SQL> begin
dbms_output.put_line('salary is:'|| queryEmpSalary(7934));
end;
/
salary is:15600
PL/SQL procedure suessfully pleted
触发器
数据库触发器是一个与表相关联的、存储的PL/SQL程序。每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。
触发器的类型
语句级触发器
在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行。
行级触发器(FOR EACH ROW)
触发语句作用的每一条记录都被触发。在行级触发器中使用old和new伪记录变量,识别值的状态。
创建触发器
CREATE [or REPLACE] TRIGGER 触发器名
{BEFORE | AFTER}
{DELETE | INSERT | UPDATE [OF列名]}
ON 表名
[FOR EACH ROW [WHEN(条件) ] ]
PLSQL 块
示例1限制非工作时间向数据库插入数据
SQL> create or replace
trigger securityEmp
before insert on emp
declare
begin
if to_char(sysdate,'day')in('星期四','星期六','星期日')
or to_number(to_char(sysdate,'hh24'))not between 8 and 18 then
raise_application_error(-20001,'不能在非工作时间插入数据。');
end if;
end;
/
Trigger created
触发语句与伪记录变量的值
触发语句 |
:old |
:new |
Insert |
所有字段都是空(null) |
将要插入的数据 |
Update |
更新以前该行的值 |
更新后的值 |
delete |
删除以前该行的值 |
所有字段都是空(null) |
示例2确认数据(检查emp表中sal的修改值不低于原值)
SQL> create or replace trigger checkSal
before update of sal on emp
for each row
declare
begin
if :new.sal<:old.sal then
raise_application_error(-20001,'更新后的薪水比更新前小');
end if;
end;
/
Trigger created
运行后结果
SQL> update emp set sal=260 where empno=7499;
update emp set sal=260 where empno=7499
ORA-20001: 更新后的薪水比更新前小
ORA-06512: 在 "SCOTT.CHECKSAL", line 4
ORA-04088: 触发器 'SCOTT.CHECKSAL'执行过程中出错
触发器
触发器可用于
• 数据确认
• 实施复杂的安全性检查
• 做审计,跟踪表上所做的数据操作等
查询触发器、过程及函数
• Select from user_triggers;
• Select from user_source;
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程