2009-11-26 oracle学习日志——oracle编程基础(3)

--函数用于返回特定的数据,当建立函数时,在函数头部必须包含return自居 ,
--而在函数体内必须包含return语句返回的数据。我们可以使用
--create function 来建立函数,实际案例:
--输入雇员的姓名,返回该雇员的年薪
create or replace function swh_fun1(swhName varchar2)
return number is
annual_sal number(7,2);
begin
select sal*12+nvl(comm,0)*12 into annual_sal from emp where ename=swhName;
return annual_sal;
end;


--包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成
--使用create or relace package来创建包
--创建一个包swh_package
--声明该包有一个过程update_sal
--声明该包有一个函数annual_sal
create package swh_package is
procedure update_sal(name varchar2,newsal number);
function annual_sal(name varchar2) return number;
end;
--包的规范只包含了过程和函数的说明,
--但是没有过程和函数的实现代码。包体用于实现包规范中的过程和函数
--建立包体使用create or replace package body

--给包swh_package 实现包体
create or replace package body swh_package is
procedure update_sal(name varchar2,newsal number)
is
begin
update emp set sal=newsal where ename=name;
end;
function annual_sal(name varchar2)
return number is
annual_salary number;
begin
select sal*12+nvl(comm,0)*12 into annual_salary from emp where ename=name;
return annual_salary;
end;
end;

--触发器是指隐含的执行的存储过程。当定义触发器时,必须指定
--触发的事件和触发的操作,常用的触发事件包括insert,update,delete,语句,
--而触发操作实际就是一个pl/sql块,可以使用
--create or replace trigger来建立触发器


--在编写pl/sql程序时,可以定义变量和常量;标量类型(scalar)
--符合类型(composite),参照类型(reference),lob(large object——
--标量定义举例
--①定义一个变长的字符串
v_ename varchar2(10);
--②定义一个小数
v_sal number(6,2)
--③定义一个小数并给一个初始值为5.4:=是PL/SQL的赋值号
v_sal2 number(6,2):=5.4
-- ④定义一个日期类型的数据
v_hiredate date;
--⑤定义一个布尔变量,不能为空,初始值为flase
v_valid boolean not null default flase;


--如何使用标量
--下面以输入员工号,显示雇员姓名、工资、个人所得税(税率为
--0.03为例来说明变量的使用

declare
c_tax_rate number(3,2):=0.03;
--定义三个变量
--用户名、工资、个人所得税
v_ename varchar2(5);
v_sal number(7,2);
v_tax number(5,2);
begin
select ename,sal into v_ename,v_sal from emp where empno=&no;
--计算
v_tax:=v_sal*c_tax_rate;
dbms_output.put_line('雇员名是'||v_ename||' 工资是'||v_sal||'个人所得税是'||v_tax);
end;

--⑥使用%type,%type的类型是和表的类型和长度一致
--使用形式 标示符名 表名.列名%type
declare
c_tax_rate number(3,2):=0.03;
--定义三个变量
--用户名、工资、个人所得税
v_ename emp.ename%type;
v_sal emp.sal%type;
v_tax number(5,2);
begin
select ename,sal into v_ename,v_sal from emp where empno=&no;
--计算
v_tax:=v_sal*c_tax_rate;
dbms_output.put_line('雇员名是'||v_ename||' 工资是'||v_sal||'个人所得税是'||v_tax);
end;


--符合变量(composite)用于存放多个值的变量
-- ①pl/sql记录
--类似于高级语言的结构体
declare
--定义一个pl/sql记录类型emp_record_type,该类型包含三个数据,分别是name,salary,title
type emp_record_type is record(name emp.ename%type,salary emp.sal%type,title emp.job%type);
--定义了一个swh_record变量,这个变量的类型是emp_record_type
emp_record emp_record_type;
begin
select ename,sal,job into emp_record from emp where empno=7788;
dbms_output.put_line('员工名:'||emp_record.name||' 薪水是:'||emp_record.salary||' 职务是:'||emp_record.title);
end;
--②pl/sql表
--想对于高级语言中的数组
declare
--定义了一个pl/sql表类型swh_table_tupe,该类型是用于存放emp.ename%type
--index by binary_integer表示下标是整数
type swh_table_type is table of emp.ename%type index by binary_integer;
--定义了一个swh_table变量,该变量的类型是swh_table_type
swh_table swh_table_type;
begin
select ename into swh_table(-1) from emp where empno=7788;
dbms_output.put_line('员工名:'||swh_table(-1));
end;
--参照变量
--参照变量是指用于存放数组值指针的变量。
--参照变量--ref cursor 游标变量 使用游标时,当定义游标时不需要
--指定相应的select语句,但是当使用游标时需要指定select语句,这样一个游标
--就与一个select语句结合了
--请使用pl/sql编写一个块,可以输入部门号,并显示该部门所有员工姓名和他的工资
declare
--定义游标类型
type swh_emp_cursor is ref cursor;
--定义一个游标变量
swh_cursor swh_emp_cursor;
--定义变量
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
--执行
--把swh_cursor和一个select结合
open swh_cursor for select ename,sal from emp where deptno=&no;
--循环取出
loop
fetch swh_cursor into v_ename,v_sal;
--判断是否swh_cursor为空
exit when swh_cursor%notfound;
dbms_output.put_line('名字:'||v_ename||' 工资:'||v_sal);
end loop;
--关闭游标
close swh_cursor;
end;

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/240707/viewspace-1029102/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/240707/viewspace-1029102/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值