博客
关于我
PL/SQL编程语言(2)
阅读量:402 次
发布时间:2019-03-05

本文共 3454 字,大约阅读时间需要 11 分钟。

游标、异常、存储过程、函数与触发器

游标

游标是PL/SQL中用来操作数据库结果集的重要工具,类似于JDBC中的ResultSet。它允许我们逐行处理数据库中的数据。

游标的语法

cursor 游标名 [(参数名,数据类型)] is select 语句;

游标的使用步骤

  • 打开游标并执行查询

    open 游标名;
  • 从游标中获取数据

    fetch 游标名 into 变量名;
  • 关闭游标

    close 游标名;
  • 处理游标结束

    exit when 游标名%notfound;
  • 游标的示例

    输出所有员工的姓名

    declare    cursor vrows is        select * from emp;    vrow emp%rowtype;begin    open vrows;    loop        fetch vrows into vrow;        dbms_output.put_line(vrow.ename);        exit when vrows%notfound;    close vrows;end;

    输出指定部门的员工姓名

    declare    cursor vrows(vdeptno number) is        select * from emp where deptno = vdeptno;    vrow emp%rowtype;begin    open vrows(20);    loop        fetch vrows into vrow;        dbms_output.put_line(vrow.ename);        exit when vrows%notfound;    close vrows;end;

    使用for循环遍历游标

    declare    cursor vrows is select * from emp;begin    for vrow in vrows loop        dbms_output.put_line('姓名:'||vrow.ename||' 工资:'||vrow.sal);    end loop;end;

    系统引用游标

    -- 声明一个游标vrows sys_refcursor;-- 打开游标并执行查询open vrows for select * from emp;

    异常

    在PL/SQL中,异常是用来处理数据库操作中可能出现的错误。常见的异常类型包括:

  • zero_divide:除零错误
  • value_error:类型转换错误
  • no_data_found:空指针错误
  • too_many_rows:找到的行数超过预期
  • others:捕获所有未定义的异常
  • 异常的语法

    declare    i number;    vrow emp%rowtype;begin    -- 例子    select * into vrow from emp where empno=1234567;exception    when too_many_rows then        dbms_output.put_line('找到了多行记录,但是赋值给了一行');    when no_data_found then        dbms_output.put_line('没有找到记录');    when value_error then        dbms_output.put_line('类型转换错误');    when zero_divide then        dbms_output.put_line('除零错误');    when others then        dbms_output.put_line('未知错误');end;

    自定义异常

    -- 声明自定义异常no_emp_found exception;-- 抛出自定义异常raise no_emp_found;

    存储过程

    存储过程是将一段PL/SQL代码封装到数据库中,方便复用和管理。常见用途包括:

  • 提高代码复用性
  • 提高SQL执行效率
  • 存储过程的语法

    create [or replace] procedure 存储过程名称(参数名 参数类型) is    begin        -- 业务逻辑    end;

    示例:给员工涨薪

    create or replace procedure proc_updatesal(vempno in number, vcount in number) is    vsal number;begin    -- 查询涨薪前的工资    select sal into vsal from emp where empno = vempno;    -- 打印涨薪前的工资    dbms_output.put_line('涨薪前:'||vsal);    -- 涨薪    update emp set sal = vsal + vcount where empno = vempno;    -- 打印涨薪后的工资    dbms_output.put_line('涨薪后:'||(vsal + vcount));    -- 提交事务    commit;end;

    调用方式

    -- 调用存储过程call proc_updatesal(7369, 10);

    函数

    函数是将一段PL/SQL代码封装到数据库中,方便调用。与存储过程不同,函数有返回值。

    函数的语法

    create [or replace] function 函数名称(参数名 参数类型) return 返回类型 is    begin        -- 业务逻辑    end;

    示例:获取员工年薪

    create or replace function func_getyearsal(vempno number) return number is    vyearsal number;begin    select sal*12 + nvl(comm, 0) into vyearsal from emp where empno = vempno;    return vyearsal;end;

    调用方式

    -- 调用函数declare    yearsal number;begin    yearsal := func_getyearsal(7369);    dbms_output.put_line('年薪:'||yearsal);end;

    触发器

    触发器是数据库执行insertupdatedelete操作时,可以自动执行一段PL/SQL代码。

    触发器的语法

    create [or replace] trigger 触发器名称 before|after insert|update|delete on 表名 [for each row] is    begin        -- 业务逻辑    end;

    示例:触发器用于数据校验

    create or replace trigger tri_checkbeforeinsert beforeinsert on emp is    vday varchar2(20);begin    select trim(to_char(sysdate, 'day')) into vday from dual;    if vday = 'saturday' then        raise_application_error(-20000, '老板周六不在,不能插入数据!');    end if;end;

    行级触发器示例

    create or replace trigger tri_test3 beforeupdate on emp for each row is    begin        dbms_output.put_line('行级触发器:'||:new.sal||' 旧的记录:'||:old.sal);    end;update emp set sal = sal - 10;

    通过以上内容,可以清晰地了解PL/SQL中的游标、异常、存储过程、函数和触发器的使用方法及其各自的特点。

    转载地址:http://pphwz.baihongyu.com/

    你可能感兴趣的文章
    Node第一天
    查看>>
    node编译程序内存溢出
    查看>>
    Node读取并输出txt文件内容
    查看>>
    node防xss攻击插件
    查看>>
    noi 1996 登山
    查看>>
    noi 7827 质数的和与积
    查看>>
    NOI-1.3-11-计算浮点数相除的余数
    查看>>
    NOI2010 海拔(平面图最大流)
    查看>>
    NOIp2005 过河
    查看>>
    NOIP2011T1 数字反转
    查看>>
    NOIP2014 提高组 Day2——寻找道路
    查看>>
    noip借教室 题解
    查看>>
    NOIP模拟测试19
    查看>>
    NOIp模拟赛二十九
    查看>>
    Nokia5233手机和我装的几个symbian V5手机软件
    查看>>
    Non-final field ‘code‘ in enum StateEnum‘
    查看>>
    none 和 host 网络的适用场景 - 每天5分钟玩转 Docker 容器技术(31)
    查看>>
    None还可以是函数定义可选参数的一个默认值,设置成默认值时实参在调用该函数时可以不输入与None绑定的元素...
    查看>>
    Vue.js 学习总结(16)—— 为什么 :deep、/deep/、>>> 样式能穿透到子组件
    查看>>
    NOPI读取Excel
    查看>>