/*
函数:可以有返回值得命名的PL/SQL子程序,必须有返回值
关键字:function return
*/
-- 函数1
create or replace function helloworld
return varchar2 -- 指定返回类型,不能给定长度
as
v_hello varchar2(50);
begin
v_hello := 'helloworld!';
return v_hello; --不可少的return
end;
-- 函数调用1
select helloworld from dual;
select helloworld() from dual;
-- 函数调用2
declare
v_re varchar2(50);
begin
v_re := helloworld(); -- 记住必须得接收函数的返回值哦
dbms_output.put_line(v_re);
end;
--函数2
create or replace function my_func(v_sal number)
return varchar2 --一定注意,此处不能加';'
as
v_sql varchar2(200);
v_msg varchar2(50);
v_min number;
v_max number;
begin
v_sql := 'select max(sal),min(sal) from emp';
execute immediate v_sql into v_max,v_min;
if v_sal > v_min and v_sal < v_max then
v_msg := '工资在正常范围内!';
else
v_msg := '不正常'; --不写的话,在java中相当于初始化为''
end if;
return v_msg;
end;
-- 调用
select my_func(1500) from dual;
declare
v_sal number := '&薪水:';
v_result varchar2(50);
begin
v_result := my_func(v_sal);
dbms_output.put_line(v_result);
end;
前面讲了存储过程和函数,游标与异常,这里开始讲一个程序包
/*
程序包:对相关存储过程,函数,变量,游标和异常等对象的封装
有声明和主体组成
优点:1.模块花;2.更轻松的应用程序设计;3.信息隐藏;4.性能更佳
*/
-- 程序包的声明:关键字:package is end
create or replace package my_pack
as
procedure packageTest(v_num number);
end my_pack; -- 也可以是 end;
-- 程序包的主体
create or replace package body my_pack
as
procedure packageTest(v_num number)
is -- as/is不能少,符合存储过程的创建
begin
dbms_output.put_line(v_num);
end;
end my_pack;
-- 程序包的调用
begin
my_pack.packageTest(500);
end;
-- 程序包也可以只用来声明,比如声明一个ref游标
create or replace package ref_pack
is
type ref_cur is ref cursor;
end;