pl/sql 笔记之存储过程、函数、包、触发器(下)
CREATE OR REPLACE FUNCTION get_salary(
dep_id IN employees.department_id%TYPE DEFAULT 10, -- 输入参数, 可以设置默认值
emp_count OUT NUMBER -- 输出参数
)
RETURN NUMBER -- 返回值类型
IS
v_sum NUMBER; BEGIN SELECT sum(salary), COUNT(*) INTO v_sum, emp_count
FROM employees
WHERE department_id = dep_id;
RETURN v_sum; -- 返回值
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('No data found');
WHEN OTHERS THEN
dbms_output.put_line('Other Exception'); END;
执行、删除存储函数
-- 执行该函数
DECLARE
v_sum NUMBER;
v_count NUMBER;
BEGIN
v_sum := get_salary(80, v_count);
-- v_sum := get_salary(dep_id => 80, emp_count => v_count);
dbms_output.put_line('80号部门工资总数: ' || v_sum || ',人数:' || v_count);
END; -- 删除
DROP FUNCTION get_salary;
CREATE OR REPLACE PROCEDURE query_emp_salary(
v_empid employees.employee_id%TYPE,
v_name OUT employees.last_name%TYPE,
v_sal OUT employees.salary%TYPE
)
AS BEGIN SELECT last_name, salary INTO v_name, v_sal
FROM employees
WHERE employee_id = v_empid;
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('No data found');
WHEN OTHERS THEN
dbms_output.put_line('Other Exception'); END;
-- 执行该存储过程
DECLARE
v_1 employees.employee_id%TYPE;
v_2 employees.last_name%TYPE;
BEGIN
query_emp_salary(60, v_1, v_2);
dbms_output.put_line('name: : ' || v_1 || ',salary:' || v_2);
END; -- 删除
DROP PROCEDURE query_emp;
-- demo_pack 包定义:
CREATE OR REPLACE PACKAGE demo_pack
AS
deptRec departments%ROWTYPE; -- 声明游标
FUNCTION add_dept(dept_no NUMBER, dept_name VARCHAR2) -- 声明函数
RETURN NUMBER;
PROCEDURE query_dept(dept_no IN NUMBER); -- 声明存储过程
END demo_pack;
-- demo_pack 包主体:
CREATE OR REPLACE PACKAGE BODY demo_pack
AS -- 创建 add_demp 函数
FUNCTION add_dept(dept_no NUMBER, dept_name VARCHAR2)
RETURN NUMBER
AS
empno_remaining EXCEPTION; -- 声明异常
PRAGMA exception_init(empno_remaining, -1); -- -1位违反唯一约束错误
BEGIN
INSERT INTO departments(department_id, department_name)
VALUES(dept_no, dept_name);
IF SQL%FOUND THEN
RETURN 1;
END IF;
EXCEPTION
WHEN empno_remaining THEN
RETURN 0;
WHEN OTHERS THEN
RETURN -1;
END add_dept; -- 创建 query_dept 存储过程
PROCEDURE query_dept(dept_no IN NUMBER)
AS
BEGIN
SELECT * INTO deptRec FROM departments WHERE department_id = dept_no;
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('no_data_found exception');
WHEN OTHERS THEN
dbms_output.put_line('Other exception');
END query_dept; BEGIN
NULL;
END demo_pack;
DECLARE
v1 NUMBER;
BEGIN v1 := demo_pack.add_dept(900, 'dept-A'); IF v1 = -1 THEN
dbms_output.put_line(SQLCODE || ': ' || SQLERRM);
ELSIF v1 = 0 THEN
dbms_output.put_line('部门存在啊');
ELSE
dbms_output.put_line('SUCCESS');
demo_pack.query_dept(900);
dbms_output.put_line('ID: ' || demo_pack.deptRec.department_id ||
', dept-name: ' || demo_pack.deptRec.department_name );
END IF;
END;
BEFORE INSERT
BEFORE INSERT FOR EACH ROW
AFTER INSERT
AFTER INSERT FOR EACH ROW BEFORE UPDATE
BEFORE UPDATE FOR EACH ROW
AFTER UPDATE
AFTER UPDATE FOR EACH ROW BEFORE DELETE
BEFORE DELETE FOR EACH ROW
AFTER DELETE
AFTER DELETE FOR EACH ROW
CREATE OR REPLACE TRIGGER del_emp_trigger
BEFORE DELETE ON employees FOR EACH ROW BEGIN INSERT INTO emp_temp(employee_id, first_name, last_name)
VALUES(:old.employee_id, :old.first_name, :OLD.last_name); END;
-- 删除视图数据非法
DELETE FROM emp_view WHERE employee_id = 100 -- 解决方法: INSTEAD OF 触发器 CREATE OR REPLACE TRIGGER emp_view_del
INSTEAD OF DELETE ON emp_view FOR EACH ROW
BEGIN
DELETE FROM employees WHERE employee_id = :old.employee_id;
END emp_view_del;
ALTER TRIGGER emp_view_delete DISABLE(ENABLE);
pl/sql 笔记之存储过程、函数、包、触发器(下)的更多相关文章
- 【Java EE 学习 29 上】【PL/SQL】【存储过程】【存储函数】【触发器】
一.PL/SQL简介 1.概念:PL/SQL语言是Oracle数据库专用的一种高级程序设计语言,是对标准SQL语言进行了过程化扩展的语言. 2.功能:既能够实现对数据库的操作,也能够通过过程化语言中的 ...
- 查看SQL SERVER 加密存储过程,函数,触发器,视图
原文:查看SQL SERVER 加密存储过程,函数,触发器,视图 create PROCEDURE sp_decrypt(@objectname varchar(50))ASbeginset noc ...
- MySQL mysqldump 导入/导出 结构&数据&存储过程&函数&事件&触发器
———————————————-库操作———————————————-1.①导出一个库结构 mysqldump -d dbname -u root -p > xxx.sql ②导出多个库结构 m ...
- 在PL/SQL中调用存储过程--oracle
在oracle10中写好了存储过程,代码如下: CREATE OR REPLACE Procedure Proc_Insert ( sName in varchar2, sAge in int, sE ...
- PL/SQL Developer 在windows7 64位系统下连Oaracle11g64位系统的解决经验
PL/SQL Developer 在windows7 64位系统下连Oaracle11g64位系统的解决经验 一.问题现象及解决方法 现象: 1.PL/SQL 无法登录64位数据库 2.在PL/SQL ...
- Oracle PL/SQL异常、存储过程和触发器
一.异常 1.处理异常 (1)除数不为0 declare b number; begin b:; exception when zero_divide then dbms_output.put_lin ...
- oracle-游标-存储过程-函数-包
一.存储过程 不可以在insert,update,delete中直接使用,可以有return但代表的是退出过程 过程有三种类型:不返回值,可以返回多个值,参数有三种类型,分别如下: in:只输入,不返 ...
- pl/sql 笔记之基础(上)
由于公司中使用 oracle,而本人对存储过程一直也懵懵懂懂,故一周时间学习了一遍 pl/sql,在此记下笔记!!! 一.前提,pl/sql 是啥? 1.PL/SQL是一种高级数据库程序设计语言,该语 ...
- PL SQL笔记(三)
loop then .. exit; end if; end loop; select to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') from dual; sel ...
随机推荐
- ACM 比大小
比大小 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 给你两个很大的数,你能不能判断出他们两个数的大小呢? 比如123456789123456789要大于-1234 ...
- 通过 Composer Github Packagist制作发布共享PHP包
参考来源: https://laravel-china.org/topics/1002 https://rivsen.github.io/post/how-to-publish-package-to- ...
- 1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区(题解第一弹)
1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: ...
- 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路
1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 3 ...
- css中设置div垂直水平居中的方法
设置要水平垂直居中的div的position为absolute,left:50%;margin-left为负的这个元素宽度的一半,同理,top:50%;margin-top为负的这个元素的高度的一半. ...
- Android px、dp、sp之间相互转换 系统默认12 sp
px 就是像素 sp=dpX字体比例(1.25f) 一.dp(或者dip device independent pixels) 一种基于屏幕密度的抽象单位.在每英寸160点的显示器上,1dp=1px ...
- 来谈一谈------JavaScript对象
1.window常用的属性: ①history ②location 2.history对象的方法: ①back() ②forward() ③go() 3.location对象的属性: ①host() ...
- ThoughtWorks 一道面试题及解法
前两天面试ThoughtWorks,有一道家庭作业题,题目如下: Problem Two: Conference Track Management You are planning a big pro ...
- iOS开发之Run Loop
1.概述 (1) Run Loop提供了一种异步执行代码的机制,不能并行执行任务. (2) 在主队列中,Main Run Loop直接配合任务的执行,负责处理UI事件.计时器,以及其它内核相关事件. ...
- UIImageView帧动画相关属性和方法
@property(nonatomic,copy) NSArray *animationImages; 需要播放的序列帧图片数组(里面都是UIImage对象,会按顺序显示里面的图片) @propert ...