PL/SQL函数和过程

匿名PL/SQL函数块
--每次使用进行编译,不存储进数据库,不能在其他PL/SQL块中调用;

过程、函数、包和触发器
--带名块,存储在数据库中,能在其他块中调用;
函数有返回值,存储过程不需要返回值

存储过程
CREATE OR REPLACE PROCEDURE /*创建或者更新*/ first_pro/*(可以加参数列表如: num [ IN | OUT | IN OUT ] NUMBER)*/  
IS
  v_now_date date;
BEGIN
  v_now_date:=SYSDATE;
  DBMS_OUTPUT.PUT_LINE(v_now_date);
END first_pro;--名字可加可不加

execute first_pro();--执行过程或函数

create or replace procedure secound_pro
is
  v_empno emp.empno%type:=9527;
  v_ename emp.ename%type:='chen';
  v_job emp.job%type:='programer';
  v_mgr emp.mgr%type:=08;
  v_hiredate emp.hiredate%type:=to_date('2014-4-28','yyyy-MM-dd');
  v_sal emp.sal%type:=3800;
  v_comm emp.comm%type:=1000;
  v_deptno emp.deptno%type:=8;
begin
  insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)values(v_empno,v_ename,v_job,v_mgr,v_hiredate,v_sal,v_comm,v_deptno);
end secound_pro;

execute secound_pro();

create or replace procedure three_pro(no in emp.empno%type)
is
begin
update emp set sal=1900 where empno=no;
end three_pro;

execute three_pro(9527);

DROP PROCEDURE first_pro;--删除存储过程

函数
CREATE OR REPLACE FUNCTION  first_fn/*(可以加参数列表如: num [ IN | OUT | IN OUT ] NUMBER)*/
--函数中尽量避免使用out和 in out参数模式
RETURN NUMBER --返回值类型
IS
v_sal emp.sal%TYPE;
BEGIN
select sal into v_sal from emp where ename='chen';
RETURN v_sal;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('no data!');
RETURN null;
END first_fn;

--调用函数:函数具有返回值,所以函数不同于存储过程可以成为一条独立的语句,函数则是作为表达式的一部分存在
select first_fn sal from dual;
--或者
VAR salary NUMBER;
EXEC :salary:=first_fn;
PRINT salary;
--或者在DBMS_OUTPUT.PUT_LINE中打印
EXEC DBMS_OUTPUT.PUT_LINE('salary is '||first_fn);
--删除函数
DROP FUNCTION first_fn;


--创建包
create or replace package first_package
is
v_num number:=0;--定义全局变量、常量、游标、异常和数据类型
function package_fn return number;--定义公共的存储过程或者函数子程序,在包体中定义其具体代码
end first_package;
--定义包体
create or replace package body first_package
is
  function package_fn return number is
  v_sal emp.sal%type;
  begin
    select max(sal) into v_sal from emp;
    return v_sal;
  end package_fn;
end first_package;
--包的调用执行
execute DBMS_OUTPUT.PUT_LINE('num in package is '||first_package.v_num);
execute DBMS_OUTPUT.PUT_LINE('max salary is '||first_package.package_fn);
--删除包和包体
drop package first_package;
drop package body first_package;

包中存在重载,规则和java中的重载规则类似

猜你喜欢

转载自equals.iteye.com/blog/2062614
今日推荐