子程序和程序包-2
/*
注意:當(dāng)建立函數(shù)時在函數(shù)頭部必須要帶有return子句,在函數(shù)體內(nèi)至少要包含一個return子句。
*/
1.不帶任何參數(shù)的函數(shù)
--案例01:新建不帶參數(shù)的函數(shù)
create or replace function getuser
return varchar2
is
v_user varchar2(10);
begin
select username into v_user from user_users;
return v_user;
end;
--調(diào)用函數(shù)的方法1:
declare
v1 varchar2(10);
begin
v1:=getuser;
dbms_output.put_line('getuser函數(shù)的結(jié)果為:' ||' ' ||v1);
end;
--調(diào)用函數(shù)的方法2:
select getuser from dual;
----調(diào)用函數(shù)的方法3:
set serveroutput on
exec dbms_output.put_line('getuser函數(shù)的結(jié)果為:' ||getuser);
?
2.帶有輸入?yún)?shù)的函數(shù)
--案例02:新建帶IN參數(shù)的函數(shù)
create or replace function getname(sno varchar2)
return varchar2? /*返回類型后面是不能使用精度值的,只是表示返回的數(shù)據(jù)類型*/
is?
name varchar2(12);
begin
select ename into name from emp where empno=sno;
return name;
exception
when too_many_rows then
dbms_output.put_line('返回值的行數(shù)太多!');
when others then
dbms_output.put_line('執(zhí)行g(shù)etname函數(shù)出現(xiàn)以外錯誤!');
end;
--調(diào)用函數(shù)的方法1:
declare
?nm varchar(12);
begin
nm:=getname('7369');
dbms_output.put_line('輸出的值是:'||nm);
end;
--調(diào)用函數(shù)的方法2:
?select getname(7788) from dual;
--調(diào)用函數(shù)的方法3:
set serveroutput on
exec dbms_output.put_line('getname函數(shù)的結(jié)果為:' ||getname(7788));
?
3.帶有out參數(shù)的函數(shù)
create or replace function get_info
(
name varchar2,
title out varchar2
)
return varchar2
as
deptname dept.dname%type;
begin
select a.job, b.dname into title, deptname from emp a, dept b
where a.deptno=b.deptno and upper(a.ename)=upper(name);
return deptname;
exception
when no_data_found then
raise_application_error(-20000, '這個員工不能存在!');
end;
--調(diào)用函數(shù)
/*
這里需要申明兩個變量,一個用來接受out參數(shù)的結(jié)果;一個用來接受函數(shù)返回的結(jié)果。
*/
declare
job varchar2(20);
dname varchar2(20);? --用來接受函數(shù)的結(jié)果
begin
dname:=get_info('scott',job);
dbms_output.put_line('getinfo is : ' ||dname ||' ;' ||job );
end;
?
4.帶有 IN OUT參數(shù)的函數(shù)
create or replace function in_out_fun
(
num01 number,
num02 in out number
)
return number
as
v_result number;
v_remain number;
begin
v_result:=num01/num02;
v_remain:=mod(num01,num02);
num02:=v_remain;
return v_result;
exception
when zero_divide then
raise_application_error(-20000, '不能排除0');
end;
--調(diào)用函數(shù)
declare
n02 number;
fun_result number;
begin
n02:=30;
fun_result:=in_out_fun(100, n02);
dbms_output.put_line(n02 ||';'||'?? '||fun_result);
end;
?
/*
sql中調(diào)用函數(shù)的限制:
1.在sql語句中只能調(diào)用存儲函數(shù)不能調(diào)用客戶端的函數(shù)
2.在sql語句中只能調(diào)用帶有輸入?yún)?shù)的函數(shù)不能調(diào)用out和in out的函數(shù)
3.sql中調(diào)用的函數(shù)不能在insert、update、delete中調(diào)用
*/
?
轉(zhuǎn)載于:https://www.cnblogs.com/javatec03/archive/2012/03/16/2404853.html
總結(jié)
- 上一篇: linux局域网内根据ip查询主机名
- 下一篇: 中弘股份退市怎么回事 A股首例“跌破面