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;

 

posted @ 2021-04-14 18:51  菅兮徽音  阅读(42)  评论(0编辑  收藏  举报