当前位置:主页 >> Oracle >> 正文
函数、包体、触发器全扫描(5)
阅读:837 输入:2014-11-25 05:09:12

第三十四讲
1.上次提出的no_data_found在update中将失效,因为手册中是只限select into
当一定要用update table set时,可以加上select * w从而达到用select * into之效果。
2.函数,
其地位与sum(),max()是一样的。其语法是:
create function 函数名(参数)
return 返回数据类型 is
定义变量
begin
end;
快速入门:输入用户名,返回年薪
create function f1(in_vename varchar2)
return number is
v_annual_sal number;
begin
select (sal+nvl(comm,0))*13 into v_annual_sal from emp where ename=in_vename;
return v_annual_sal;
end;
--在控制台调用 select f1('SMITH');
2.2 在java中调用方法
String sql="select fun1('smith') from dual";
调用dual是因为,函数中已注明调用哪个表
3.包
包只是用来声明过程或函数的
此处包如同java的package
语法:
create package 包名 is
声明函数
function 函数名(参数)
return 返回类型
--声明过程
procedure 过程名


没有begin end,有点像java的接口。
第三十五讲
create or replace package myp1
is
procedure pro1 (v_in_ename varchar2,v_in_newsal number);
function fun1(v_in_ename varchar2) return number;
end;


调用方法:
myp1.即可调用 ,但此时未实现,只是声明 


2.包体,是用来实现包的有is,end
create or replace package body q包名is 
procedure 过程名(变量名)
------
快速入门包体
create package body myp1 is
procedure pro1(v_in_ename varchar2,v_in_newsal number) is
begin
update emp set sal=v_in_newsal where ename=v_in_ename;
end;
--实现函数
funtion fun1(v_in_ename varchar) return number is
begin
select (sal+nvl(comm,0)*13 into v_annual_sal form emp where ename=v_in_ename);
return v_annual_sal;


调用时,要加方案名
java中,String sql="{call scott.myp1.fun1()}";
end;
end;


3.触发器
4.讲pl/sql的语法,细讲
赋值很奇怪:=
v_sal number(6,2):=5.4;
create procedure pro1(v_in_empno in number) is
v_ename varchar(32);
v_sal number;
v_tax number
begin
select ename,sal into v_ename,v_tax from emp where empno=v_in_empno;
--计算,个人所得税
v_tax:=v_tax*t_tax_rate;
dbms_output.put_line(v_ename||'工资是='||v_sal||'个人所得税是='||v_tax);
end;