PL/SQL函数跟过程
PL/SQL函数和过程
匿名PL/SQL函数块
--每次使用进行编译,不存储进数据库,不能在其他PL/SQL块中调用;
过程、函数、包和触发器
--带名块,存储在数据库中,能在其他块中调用;
函数有返回值,存储过程不需要返回值
存储过程
函数
包
包中存在重载,规则和java中的重载规则类似
匿名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中的重载规则类似