Oracle学习总结5-存储过程,存储函数,触发器

二.存储过程与存储函数:procedure

1.hello world

create or replace procedure hello_world is

begin

  dbms_output.put_line(‘hello world‘);

end hello_world;

2. --给指定员工涨100工资,并打印涨前涨后的薪水(存储过程)

create or replace procedure raiseSalary(eno in number) is

     psal emp.sal%type; 

begin

  select sal into psal from emp where empno=eno;

  update emp set sal=sal+100 where empno=eno;

  dbms_output.put_line(‘涨前:‘||psal||‘涨后:‘||(psal+100));

end raiseSalary;

3. --查询某个员工的年收入(存储函数)

 create or replace function queryEmpIncome(eno in number) return number is

  income number;

begin

  select sal*12+nvl(comm,0) into income from emp where empno=eno; 

  return income;

end queryEmpIncome;

4. --查询某个员工的姓名薪水和职位

create or replace procedure queryEmpInformation(eno in number,pename out varchar2,psal out number,pjob out varchar2) is

begin

       select ename,sal,job into pename,psal,pjob from emp where empno=eno;

end queryEmpInformation;

5. --查询某个员工的年收入的java调用(存储函数调用)

//存储函数调用

    @Test

    public void testFunction(){

        String sql = "{?=call queryEmpIncome(?)}";

        Connection conn = null;

        CallableStatement call = null;

        try {

            conn=JDBCUtils.getConnection();

            call=conn.prepareCall(sql);

            //返回值声明

            call.registerOutParameter(1, OracleTypes.NUMBER);

            //对于in参数,赋值

            call.setInt(2,7839);

            //执行

            call.execute();

            //输出

            double income=call.getDouble(1);

            System.out.println(income);

        } catch (Exception e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }finally{

            JDBCUtils.release(conn, call, null);

        }

    }

6. --查询某个员工的姓名薪水和职位的java调用(存储过程调用)

@Test

    public void testProcedure(){

        String sql = "{call queryEmpInformation(?,?,?,?)}";

        Connection conn = null;

        CallableStatement call = null;

        try {

            conn=JDBCUtils.getConnection();

            call=conn.prepareCall(sql);

            //对于in参数,赋值

            call.setInt(1,7839);

            //对于out参数,申明

            call.registerOutParameter(2, OracleTypes.VARCHAR);

            call.registerOutParameter(3, OracleTypes.NUMBER);

            call.registerOutParameter(4, OracleTypes.VARCHAR);

            //执行

            call.execute();

            //输出

            String name=call.getString(2);

            double sal=call.getDouble(3);

            String job=call.getString(4);

            System.out.println(name+"---"+sal+"---"+job);

        } catch (Exception e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }finally{

            JDBCUtils.release(conn, call, null);

        }

    }

7.返回多列-使用光标实现。Plsql中建立包和体的结构。然后再由java中的resultset接收

Plsql中:

包:

create or replace package mypackage is

       type empcursor is ref cursor;

       procedure queryEmpList(dno in number,empList out empcursor);

end mypackage;

体:

create or replace package body mypackage is

       procedure queryEmpList(dno in number,empList out empcursor)

                 as

                 begin

                         open empList for select * from emp where deptno=dno;

                 end;

end mypackage;

java调用:

//存储函数调用,返回光标类型的

    @Test

    public void testCursor(){

        String sql = "{call mypackage.QUERYEMPLIST(?,?)}";

        Connection conn = null;

        CallableStatement call = null;

        ResultSet rs = null;

        try {

            conn = JDBCUtils.getConnection();

            call = conn.prepareCall(sql);

            //对于in参数,赋值

            call.setInt(1,20);

            //对于out参数,申明

            call.registerOutParameter(2, OracleTypes.CURSOR);

            //执行

            call.execute();

            //取出结果

            rs = ((OracleCallableStatement)call).getCursor(2);

            while(rs.next()){

                //取出一个员工

                String name = rs.getString("ename");

                double sal = rs.getDouble("sal");

                System.out.println(name+"\t"+sal);

            }

        } catch (Exception e) {

            e.printStackTrace();

        }finally{

            JDBCUtils.release(conn, call, rs);

        }      

    }

三.触发器(trigger)

1. 插入员工时候触发

create or replace trigger firsttrigger

  after insert on emp

declare

begin

  dbms_output.put_line(‘成功插入新员工‘);

end firsttrigger;

2. --不允许在非工作时间插入数据

create or replace trigger securityemp

  before insert on emp 

declare

begin

  if to_char(sysdate,‘day‘) in (‘星期六‘,‘星期日‘)

     or to_number(to_char(sysdate,‘hh24‘)) not between 9 and 17 then

      raise_application_error(-20001,‘禁止在非工作时间插入新员工‘);

   end if; 

end securityemp;

3. --不允许降薪

create or replace trigger checksalary

  before update on emp 

  for each row

declare

begin

  if :new.sal<:old.sal then

     raise_application_error(-20002,‘涨后的薪水不能少于涨前的薪水。涨前:‘||:old.sal||‘   涨后:‘||:new.sal);

    end if;

end checksalary;
时间: 2024-10-06 20:22:05

Oracle学习总结5-存储过程,存储函数,触发器的相关文章

PL/SQL&amp;存储过程||存储函数&amp;触发器

plsql 有点:交互式  非过程化   数据操纵能力强   自动导航语句简单   调试简单   想率高 声明类型的方式 1.基本类型 2.引用变量 3.记录型变量 基本格式 declare 声明 begin exception end 判断语句 if:..then... else end if: 循环 loop 退出条件   exit when ...; end loop: 光标 cursor ---resltSet 返回多行数据 格式 cursor 表明 oper 打开 fetch 去一行光

Oracle学习(十二):存储过程/存储函数

1.知识点 --第一个存储过程 /* 打印Hello World create [or replace] PROCEDURE 过程名(參数列表) AS PLSQL子程序体: 调用存储过程: 1. exec sayHelloWorld(); 2. begin sayHelloWorld(); sayHelloWorld(); end; / */ create or replace procedure sayHelloWorld<span style="white-space:pre"

oracle学习笔记之存储过程与存储函数

存储过程与存储函数说明:存储函数有返回值!存储过程没有返回值! 指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 什么时候用存储过程/存储函数 原则:如果只有一个返回值,用存储函数:否则,就用存储过程. 1.创建存储过程 用CREATE PROCEDURE命令建立存储过程.语法如下: create [or replace] PROCEDURE 过程名[(参数列表)] AS     变量声明 PLSQL子程序体: 1)存储过程入门: create or replace proced

Oracle学习(四)_SQL函数

--第一部分:SQL基础 --ch1 简单查询 --ch2 查询基本概念 --ch3 数据过滤 --第二部分:多表操作 --ch4 集合理论 --ch5 内连接 --ch6 外连接 --ch7 子查询 --第三部分:数据分组 --ch8 简单统计 --ch9 数据分组 --ch10 分组数据过滤 --第四部分:SQL函数 --ch11 内置函数 --ch12 case表达式 --第五部分:DML语句 --ch13 插入数据 --ch14 修改数据 --ch15 删除数据 ------------

oracle存储过程和存储函数&amp;触发器

oracle存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程,存储函数 存储过程和存储函数的相同点:完成特定功能的程序 存储过程和存储函数的区别:是否用return语句返回值 =========================创建和使用存储过程============================= 用create procedure命令建立存储过程和存储函数 语法: create [or replace] procedure 过程名(参数列表) as PLSQL子程序

触发器---存储过程---存储函数

删除触发器:慎用触发器,不用就删除 触发器的特性: 1.有begin end体,begin end;之间的语句可以写的简单或者复杂 2.什么条件会触发:I.D.U 3.什么时候触发:在增删改前或者后 4.触发频率:针对每一行执行 5.触发器定义在表上,附着在表上. 也就是由事件来触发某个操作,事件包括INSERT语句,UPDATE语句和DELETE语句:可以协助应用在数据库端确保数据的完整性. 注意:cannot associate a trigger with a temporary tabl

oracle 存储过程,存储函数,包,

http://heisetoufa.iteye.com/blog/366957 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的.和PL/SQL程序相比,存储过程有很多优点,具体归纳如下: * 存储过程和函数以命名的数据库对象形式存储于数据库当中.存储在数据库中的优点是很明显的,因为代码不保存在本地,用户可以在任何客户机上

Oracle的基本语法,存储函数及触发器

1.PL/SQL    PL/SQL是Oracle对 ql语言的过程化扩展,指在 SQL 命令语言中增加了过程处理语句,使SQL语言具有过程处理能力.把 SQL 语言的数据操纵能  力与过程语言的数据处理能力结合起来,使得 PLSQL 面向过程但比过程语言简单.高效.灵活和实用.   基本语法结构:        [declare]   -- 声明变量        begin       -- 代码逻辑        [exception] -- 异常处理        end;    注意:

MySQL 存储过程 存储函数 概念示例

一个存储过程是一个可编程的函数,它可以在MySQL中创建并保存.它是由一些SQL语句和一些特殊的控制结构语句组成. 当希望在不同的应用程序或平台上执行相同的函数,或者封装特定的功能时,存储过程是一个非常有用的方式.数据库中的存储过程可以看做是对编程中面向对象方法的模拟. 基本示例total_ordres delimiter // create procedure total_orders (out total float) BEGIN     select sum(amount)  into t

oracle学习-PL SQL 存储过程中循环、触发器

PL SPL 提供了3中不同类型的循环结构 -- 实例:索引 loop_counter从1开始,到10 结束,循环共执行10次 FOR loop_counter IN 1 .. 10 LOOP ...可执行语句... END LOOP; -- 索引loop_counter从10开始,到1结束,循环共执行10次: FOR loop_counter IN REVERSE 1 .. 10 LOOP ...可执行语句... END LOOP; -- 循环的执行范围取决于变量或者表达式的值: FOR ca