匿名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中的重载规则类似