zoukankan      html  css  js  c++  java
  • Oracle 笔记(五)

    1、              Oracle的自定义函数

    2、              Oracle的触发器

    3、              Oracle的存储过程

    知识点一:自定义函数

    语法:create [or replace] function 函数名(参数)

                  return返回值类型—必须

                  is

           --变量的声明

    begin

           --执行语句

           --return 返回变量

           --exception 异常块(return 异常编号)

                  end;

    Java:

    int add(int no1,int no2)

    {

       int sum = no1+no2;

       return sum;

    }

    Oracle

    --编写一个简单的自定义函数

    createorreplacefunction fun_add(no1 number,no2 number)

    returnnumber

    is

    v_sum number;

    begin

      v_sum := no1+no2;

    return v_sum;

    exception

    whenothersthen

    return-1;

    end;

    调用函数

    方式一:

    select fun_add(50,50) from dual;

    方式二:

    declare

    v_no1 number(2);

    v_no2 number(2);

    v_sum number(3);

    begin

      v_no1 :=50;

      v_no2 :=50;

      v_sum := fun_add(v_no1,v_no2);

     

    if v_sum =-1then

         dbms_output.put_line('输入的数据有误!');

    else

           dbms_output.put_line(v_sum);

    endif;

     

    exception

    whenothersthen

          dbms_output.put_line('输入的数据有误!');

    end;

    知识点二:触发器 trigger(DML触发器)

    语法:

    create[or replace]  trigger tri_名字

    after|before

    insert|delete|update

    on 表名

    [for each row]—行级触发器

    begin

           --执行语句块

    end;

    案例:删除emp表数据的时候,让emp_bak表自动备份

    --删除emp_bak表数据的时候,让emp_bak01表自动备份

    createorreplacetrigger  tri_delemp

    afterdelete

    on emp_bak

    foreachrow

    begin

    insertinto emp_bak01(empno,ename,job,mgr,hiredate,sal,comm,deptno)

    values(:old.empno,:old.ename,:old.job,:old.mgr,:old.hiredate,:old.sal,

    :old.comm,:old.deptno);

    end;

    案例:创建userinfo(userid,uname,upw),userid自动+1实现

    步骤一:创建一个表

    createtable userinfo(

    userid number(4) primary key,

    uname varchar2(10)notnullunique,

    upw varchar2(10)notnull

    )

    步骤二:创建序列

    create sequence seq_userid;

    步骤三:创建触发器

    createorreplacetrigger tri_userid

    beforeinsert

    on userinfo

    foreachrow

    begin

    select seq_userid.nextval into:new.userid from dual;

    end;

    步骤四:启动触发器

    insert into userinfo(uname,upw) values('lily','123456');

    案例:实现更改userinfo表的名字这个字段的时候,对原来数据进行备份,备份到userinfo_bak表中

    知识点三:存储过程procedure

    语法:

    create or replace procedure pro_存储过程名称(输入参数 in,输出参数 out)

    as

       --变量的声明

    begin

       --执行过程

       --exception异常处理过程

    end;

    案例:定义存储过程,完成userinfo表的插入功能(完成账户注册这个功能)

    --完成userinfo表的插入功能

    createorreplaceprocedure pro_userreg(

    v_uname in userinfo.uname%type,v_upw in userinfo.upw%type)

    as

    begin

    insertinto userinfo(uname,upw)values(v_uname,v_upw);

    end;

    执行存储过程

    方法一:命令行执行

    execute pro_userreg('jack','123456');

    方法二:plsql执行

    begin

      pro_userreg('jack','123456');

    end;

    方法三:应用程序Java,C#,php调用存储过程

    案例二:定义存储过程完成登录

    --定义存储过程完成登录

    createorreplaceprocedure pro_userlog(

    v_uname userinfo.uname%type,v_upw userinfo.upw%type, v_result outnumber)

    as

    begin

    selectcount(*)into v_result from userinfo where

      uname = v_uname and upw = v_upw;

    end;

    declare

    v_uname userinfo.uname%type;

    v_upw userinfo.upw%type;

    v_result number(1);

    begin

      v_uname :='jack';

      v_upw :='123456';

     

      pro_userlog(v_uname,v_upw,v_result);

     

    if v_result =1then

        dbms_output.put_line('登陆成功!');

    else

           dbms_output.put_line('登陆失败!');

    endif;

     

    end;

     2017-10-31 18:37:14

  • 相关阅读:
    QDUOJ LC的课后辅导 单调递增栈
    蓝桥杯 时间问题
    区间sum 和为k的连续区间-前缀和
    康托展开-全排列的编码与解码
    康托展开-全排列应用
    背包之01背包、完全背包、多重背包详解
    HDU
    辗转相除求最大公约数与最小公倍数
    快速幂(反复平方法)
    HDU
  • 原文地址:https://www.cnblogs.com/angelye/p/7762953.html
Copyright © 2011-2022 走看看