Oracle Day5
P44 存储函数
与存储过程类似,功能没有存储过程强大。把输出参数以return的形式展现。
快速生成小技巧:在function文件夹右键new,输出函数名和参数等信息即可快速生成一个函数框架(存储过程也可)
简单举个例子:
create or replace trigger valid_Insert before insert on person declare cruday varchar2(10); begin select to_char(sysdate, 'day') into cruday from dual; if cruday in ('星期三') then raise_application_error(-20001, '星期三不允许插入数据'); end if; end valid_Insert;
建议使用存储过程而不是存储函数,因为存储函数只能有一个返回值,而存储过程可以有多个返回值(多个out参数)。
P45 java调用存储过程
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class test { public static void main(String[] args) { test(); } public static void test(){ String driver = "oracle.jdbc.OracleDriver"; String connStr = "jdbc:oracle:thin:@127.0.0.1:1521:orcl"; Connection conn = null; CallableStatement cs = null; try{ Class.forName(driver); conn = DriverManager.getConnection(connStr,"scott","1996"); cs = conn.prepareCall("{call addsal(?)}"); cs.setInt(1,7369); cs.execute(); }catch(Exception e){ e.printStackTrace(); }finally { try { if(cs!=null) cs.close(); if(conn!=null) conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } }
P46 触发器
触发器是一个与表相关联的,存储的plsql程序,监听着增删改三类语句。
常用于:数据确认,实施复杂的安全性检查,跟踪表上所做的数据操作,还有数据的备份与同步。
触发器的类型包括:
1.语句级触发器:在指定语句操作之前或之后触发
2.行级触发器:每一条记录都会触发
触发器的基本格式:
create (or replace) trigger 触发器名称
before/after
delete/insert/update of 列名 on 表名
begin plsql块
end 触发器名称
语句级触发器的两个例子:
例1:实现person表,每当有数据插入,都输出一句话“一条记录被插入了”
create or replace trigger insertTrigger before insert on person begin dbms_ouput.put_line('一条记录被插入'); end insertTrigger;
这样每次插入数据时,都会输出“一条记录被插入”。
例2:星期三不允许插入数据触发
create or replace trigger valid_Insert before insert on person declare cruday varchar2(10); begin select to_char(sysdate, 'day') into cruday from dual; if cruday in ('星期三') then raise_application_error(-20001, '星期三不允许插入数据'); end if; end valid_Insert;
行级触发器:
例1:涨工资校验
create or replace trigger valid_addsal before update of sal on myemp for each row begin if :new.sal<=:old.sal then raise_application_error(-20002,'未涨工资'); end if; end valid_addsal;