oracle复习笔记之PL/SQL程序所要了解的知识点(4)
非预定义异常:
declare e_deleteid_exception exception; pragma exception_init(e_deleteid_exception,-2292); begin delete from employees where employee_id = 100; exception when e_deleteid_exception then dbms_output.put_line('违反了完整性约束,故不能删除此用户'); when others then dbms_output.put_line('出现其它的异常了'); end;
用户自定义异常:
declare e_sal_hight exception; v_sal employees.salary%type; begin select salary into v_sal from employees where employee_id = 100; if v_sal > 10000 then raise e_sal_hight; end if; exception when e_sal_hight then dbms_output.put_line('工资太高了'); when others then dbms_output.put_line('出现其它的异常了'); end;
通过select...into...查询某人的工资,若没找到则打印出“未找到此数据”:
declare v_sal employees.salary%type; begin select salary into v_sal from employees where employee_id = 1001; exception when no_data_found then dbms_output.put_line('未找到此数据'); when others then dbms_output.put_line('出现其它的异常了'); end; 更新指定员工工资,如工资小于300,则加100,对NO_DATA_FOUND异常,TOO_MANY_ROWS进行处理。 declare v_sal employees.salary%type; begin select salary into v_sal from employees where employee_id = 1001; if v_sal < 300 then update employees set salary = salary + 100 where employee_id =101; end if; exception when no_data_found then dbms_output.put_line('未找到此数据'); when too_many_rows then dbms_output.put_line('输出的行数太多了'); when others then dbms_output.put_line('出现其它的异常了'); end;
自定义异常:
更新指定员工工资,增加100;若指定员工不在,则抛出异常:NO_RESULT;
declare no_result exception; begin update employees set salary = salary + 100 where employee_id = 1001; if sql%notfound then raise no_result; end if; exception when no_result then dbms_output.put_line('查无此数据,更新失败'); when others then dbms_output.put_line('出现其它异常'); end;
存储过程:
写个简单的hello_world存储函数
create or replace function hello_world return varchar2 is (相当于declare,可以在其后面定义变量、记录、游标) begin return 'helloworld'; end; 存储函数的调用: begin dbms_output.put_line(hello_world); end; 或者: select hello_world from dual;
带参数的存储函数:
create or replace function hello_world1(v_logo varchar2) return varchar2 is begin return 'helloworld'||v_logo; end; 调用: select hello_world1('shellway') from dual 或者: begin dbms_output.put_line(hello_world1('shellway')); end;
定义一个获取系统时间的函数:
create or replace function get_sysdate return varchar2 is begin return to_char(sysdate,'yyyy-MM-dd HH24:mi:ss'); end;
定义带参数的函数,两个数相加
create or replace function add_param(v_num1 number,v_num2 number) return number is v_num3 number(10); begin v_num3 := v_num1 + v_num2; return v_num3; end; 调用: select add_param(2,5) from dual; 或者: begin dbms_output.put_line(add_param(5,4)); end;
定义一个函数:获取给定部门的工资总和,要求:部门号定义为参数,工资总额为返回值:
create or replace function get_sal(dept_id number) return number is v_sumsal number(10) := 0; cursor salary_cursor is select salary from employees where department_id = dept_id; begin for c in salary_cursor loop v_sumsal := v_sumsal + c.salary; end loop; return v_sumsal; end; 调用: select get_sal(80) from dual;
定义一个函数:获取给定部门的工资总和 和 该部门的员工总数(定义为OUT类型的参数)。
要求:部门号定义为参数,工资总额定义为返回值。
create or replace function get_sal(dept_id number,total_count out number) return number is v_sumsal number(10) := 0; cursor salary_cursor is select salary from employees where department_id = dept_id; begin total_count := 0; for c in salary_cursor loop v_sumsal := v_sumsal + c.salary; total_count := total_count + 1; end loop; return v_sumsal; end; 调用: declare v_count number(4); begin dbms_output.put_line(get_sal(80,v_count)); dbms_output.put_line(v_count); end;