在这里讲一下包的概念,
二话不说上个例子
包头:
create or replace package pck_test is procedure proc_report_salary(name nvarchar2,v_class_name out nvarchar2); function func_report_salary(v_month nvarchar2, v_year nvarchar2) return number; end pck_test;
包体:
create or replace package body pck_test is
--存储过程
procedure proc_report_salary ( name nvarchar2, v_class_name out nvarchar2 ) is --v_class_name nvarchar2(50) ; begin v_class_name:='初始值'; select class_name into v_class_name from t_user_class_info inner join t_user_info on t_user_class_info.class_id=t_user_info.class_id where t_user_info.user_name=name; end; --函数 function func_report_salary ( v_month nvarchar2, v_year nvarchar2 ) return number is PRAGMA AUTONOMOUS_TRANSACTION; d1 number; d2 number; v_id number; begin select count(*) into d1 from t_user_info where user_month=v_month; select sum(user_id) into d2 from t_user_info where user_year=v_year; select rid.nextval into v_id from dual; insert into tab_report_list(sid,d1,d2)values(rid.nextval,d1,d2); commit; return v_id; EXCEPTION WHEN no_data_found THEN commit; v_id:=0; WHEN OTHERS THEN commit; v_id:=0; end ; end pck_test;
包类似于程序里面的写出接口,实现接口的概念,但是需要注意的是由于不同的编译工具写法也导致了不同,如果是SQL PLUS在包头和包体之间可以使用“/”,如果是plsql则包头和包体要放在两个sql windows里面写,不然会报错,使用包可以更好的管理你的函数和存储过程以及函数或者变量等,调用的时候有点像程序里面类调用方法的感觉,例子如下:
declare v_ret nvarchar2(50); begin
--类.方法(参数)可以使用这样的方式去想 pck_test.proc_report_salary('小明',v_ret); dbms_output.put_line(v_ret); end;
如果你是想要单独的写一个函数或者存储过程,你可以吧包体里面的函数或者存储过程部分单独拿出来加上create[or repleace] 放在一个新建页面执行即可。
接下来看一下自定义的复合类型的写法:
记录类型:
就是说这个类型可以是emp表里面姓名,薪水,标题,工作的字段类型。
调用的时候有类似于
var_record emp_record_type;
var_record.name:='张三'
这样的方式进行赋值
数组类型:
游标:(参考类型的一种)
其中的loop是循环的语法
自定义例外类似于程序里面的自定义try catch,另外注意的是,最好在每个函数和存储过程里面都有定义常见的异常和例外保证程序的完整性。
自定义例外如下: