oracle函数和存储过程示例

时间:2022-02-14 17:20:27

Function:

 --为了使产生的uuid符合rfc 4122的标准(http://tools.ietf.org/html/rfc4122),例如:a8f662b8-6e7a-13fe-e040-970a437c6bd7
--函数
CREATE OR REPLACE
FUNCTION get_uuid
RETURN VARCHAR
IS
guid VARCHAR (50);
BEGIN
guid := lower(RAWTOHEX(sys_guid()));
RETURN
substr(guid,1,8)||'-'||substr(guid,9,4)||'-'||substr(guid,13,4)||'-'||substr(guid,17,4)||'-'||substr(guid,21,12);
END get_uuid;

Procedure:

--功能:结转.比如当前日期为8月31日,8月是没有数据的,需将七月份的数据拷贝一份作为8月份的

 1 create or replace procedure carryover
(syear IN OUT varchar2,smonth IN OUT varchar2) --注意: 参数是需要结转的年月,而非结转到的年月
is
cursor t_rows(ssyear varchar2,ssmonth varchar2) is select t.* from FYS_SCH_LVYOU2 t where t.remarks=ssmonth and t.year=ssyear;
tmonth varchar2(10);
t_row t_rows%rowtype;
begin
dbms_output.enable(100000);
if syear is null and smonth is null then --没有参数时,则默认上个月的年月
tmonth:=to_char(add_months(sysdate,-1),'yyyy-mm');
syear:=substr(tmonth,1,4);
smonth:=substr(tmonth,6,2);
end if; --dbms_output.put_line('from:'||syear||'/'||smonth); --打印 需要结转的年月 for t_row in t_rows(syear,smonth)
loop
tmonth:=to_char(add_months(to_date(t_row.year||'-'||t_row.remarks,'yyyy-mm'),1),'yyyy-mm');--结转到的年月
--dbms_output.put_line(' to:'||tmonth); --打印 结转到的年月
insert into FYS_SCH_LVYOU2 values( get_uuid(), --UUID,自定义函数,用于格式化sys_guid()
substr(tmonth,0,4), --year
t_row.classification,
t_row.num,
substr(tmonth,6,2), --month
t_row.remarks1,
t_row.remarks2,
t_row.remarks3,
t_row.remarks4,
t_row.remarks5,
t_row.remarks6,
t_row.remarks7,
t_row.remarks8,
t_row.remarks9,
t_row.remarks10
);
end loop; if syear='' then --如果是2016年之前的话,需要结转上一年的
syear:=to_char(to_number(syear)-1);
carryover(syear,smonth); --改变参数,重新调用此存储过程
end if; commit;
exception
when others then rollback;
end;