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 重建二叉树
重建二叉树 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数 ...
- 2102: [Usaco2010 Dec]The Trough Game
2102: [Usaco2010 Dec]The Trough Game Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 117 Solved: 84[ ...
- SEO-关键词密度与友情链接交换技巧
关键词密度 关键词密度 关键词密度与关键词频率所阐述的实质上是同一个概念,用来量度关键词在网页上出现的总次数与其他文字的比例,一般用百分比表示.相对于页面总字数而言,关键词出现的频率越高,关键词密度也 ...
- Android中的几种多线程实现
有以下几种方式: 1)Activity.runOnUiThread(Runnable) 2)View.post(Runnable) ;View.postDelay(Runnable , long) 3 ...
- Spark2.1集群安装(standalone模式)
机器部署 准备三台Linux服务器,安装好JDK1.7 下载Spark安装包 上传spark-2.1.0-bin-hadoop2.6.tgz安装包到Linux(intsmaze-131)上 解压安装包 ...
- Hibernate之关联映射(一对多和多对一映射,多对多映射)
~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习以下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...
- 【树莓派】Linux自动配置IP
由于需要配置多台树莓派设备,但需要将IP配置为静态IP,而一台一台手动执行比较慢,所以写了一份脚本,sudo 执行即可. 将下面内容复制在家目录下,命名为auto.sh 然后执行 sudo sh au ...
- 开源 & 在线免费使用:升讯威 周报系统
这个周报系统大约写于2015年,缘起当时所带的开发团队需要逐步建立或完善一些项目管理方法. 在调研了网上的诸多项目管理或周报/日报管理系统之后,并没有找到符合当时情况的系统,这里最大的问题不是网上既有 ...
- iOS--通过MOB平台实现第三方登录与分享
适合刚开始接触第三方登录与分享的IOS小白!! 这两天看了一下有关IOS第三方登录与分享的一些知识,发现在QQ开放平台与微信开放平台实现这些功能很繁琐,不容易实现,在导师的推荐下,找到了这样一个平台 ...
- 大数据时代日志分析平台ELK的搭建
A,首先说说ELK是啥, ELK是ElasticSearch . Logstash 和 Kiabana 三个开源工具组成.Logstash是数据源,ElasticSearch是分析数据的,Kiaba ...