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 ...
随机推荐
- oslo_config中的DuplicateOptError坑
前言: 最近在重写公司的Cinder Driver,我们driver是按照OpenStack的要求,依赖一个叫oslo_config的一个包.这个包的作用就是让driver申明所依赖的选项(可以来自文 ...
- .Net程序员学用Oracle系列(22):分析函数(OVER)
1.函数语法 1.1.语法概述 1.2.窗口详解 1.2.1.ROWS 窗口 1.2.2.RANGE 窗口 2.函数用法 2.1.普通统计类函数 2.2.数据排序类函数 2.3.数据分布类函数 2.4 ...
- C — 对C语言的认识
有趣的C语言代码 看一下这段代码输出的是什么 #include <stdio.h> int main() { ; printf("%d\n", printf(" ...
- 学学简单的-------------javaScript基础
首先知道什么是JavaScript? JavaScript是一种描述性语言,也是一种基于对象和事件驱动的.并具有安全性的脚本语言. 2.JavaScript由三部分组成:①ecmascript ②Bo ...
- Java学习笔记 11/15:一个简单的JAVA例子
首先来看一个简单的 Java 程序. 来看下面这个程序,试试看是否看得出它是在做哪些事情! 范例:TestJava.java // TestJava.java,java 的简单范例 public ...
- NIO(二、Buffer)
目录 NIO(一.概述) NIO(二.Buffer) Buffer 前文讲了NIO与IO的区别,那么这一章开始讲述NIO下核心类 - Buffer类 上一章就说过,NIO的核心包括三个部分:通道(Ch ...
- curl javaSSm框架中传入json数组的格式方法
curl与java结合传入get.post,head请求, 比如: curl的地址: curl -l 127.0.0.1:8080/spacobj/core/do?acid=100 -H " ...
- 技术方案:在外部网址调试本地js(基于fiddler)
1 解决的问题 1) 场景1:生产环境报错 对前台开发来说,业务逻辑都在js中,所以报错90%以上都是js问题. 如果生产环境出现报错,但是测试环境正常.这时修改了代码没有环境验证效果, ...
- BootStrap入门教程 (三)
本文转自 http://www.cnblogs.com/ventlam/archive/2012/06/05/2524966.html 上讲回顾:Bootstrap的基础CSS(Base CSS)提供 ...
- UI自动化测试表单重要代码
public class frame { public static void main(String[] args) { // TODO Auto-generated method stub Sys ...