区别:
1. 返回值的区别,函数有1个返回值,而存储过程是通过参数返回的,可以有多个或者没有 2.调用的区别,函数可以在查询语句中直接调用,而存储过程必须单独调用. 函数一般情况下是用来计算并返回一个计算结果而存储过程一般是用来完成特定的数据操作(比如修改、插入数据库表或执行某些DDL语句等等)例子:
--①游标的使用:获取 SAP当天某个零件的收货信息说明 参数:零件号,收货日期
/*
格式: 第一次收货日期+时间+数量 、第二次收货日期+时间+数量 、第二N次收货日期+时间+数量
*/
function getShxx( myMNUMBER varchar2, myday date) return varchar2 is
myresult varchar2(8000);
cursor mycursor is
select '订单号('||x.VGBEL||')订单行号('||x.VGPOS||')时间('||x.ERZET||')到货'||x.RFMNG||'个' as w
from t2i_sq10 x
where x.MATNR=myMNUMBER
and to_char(myday,'yyyy-mm-dd')=x.ERDAT;
myrow mycursor%rowtype;
begin
myresult := ' ';
for myrow in mycursor loop
myresult :=myresult || myrow.w ||';';
end loop;
return myresult;
end;
/*②exception的使用:
从SAP的SQ11接口中得到零件最新的仓库信息
*/
function getWarhouse(myMNUMBER varchar2) return varchar2 is
myresult varchar2(8000);
begin
select LGFSB || '{f*}' || LGPLA
into myresult
from t2i_sq11
where id = (select max(id)
from t2i_sq11 x
where x.MATNR = myMNUMBER
group by MATNR);
return myresult;
exception
when no_data_found then
myresult := '{f*}';
return myresult;
end;
/*③返回值为结果集的使用:
*/
procedure test(myMNUMBER varchar2 ,Resultdata out myCursorType,flag out varchar2) is
-- TYPE myCursorType IS REF CURSOR /*这句话需要在包的开始里面定义*/;
begin
open Resultdata for
select LGFSB || '{f*}' || LGPLA
from t2i_sq11
where id = (select max(id)
from t2i_sq11 x
where x.MATNR = myMNUMBER
group by MATNR);
flag :='ok';
end;
/*④块的使用,及打印函数dbms_output.put_line(myresult);
见图4-1,4-2
*/
declare
myresult varchar2(8000);
begin
select LGFSB || '{f*}' || LGPLA
into myresult
from t2i_sq11
where id = (select max(id)
from t2i_sq11 x
where x.MATNR = 'A120032J-D0200'
group by MATNR);
dbms_output.put_line(myresult);
exception
when no_data_found then
myresult := '{f*}';
dbms_output.put_line(myresult);
end;