匿名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_prois 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)isbeginupdate 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 --返回值类型ISv_sal emp.sal%TYPE;BEGINselect sal into v_sal from emp where ename='chen';RETURN v_sal;EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_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_packageisv_num number:=0;--定义全局变量、常量、游标、异常和数据类型function package_fn return number;--定义公共的存储过程或者函数子程序,在包体中定义其具体代码end first_package;--定义包体create or replace package body first_packageis 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中的重载规则类似