/*

  函数:可以有返回值得命名的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;