Oracle编程( 其三)


一、PL/SQL编程语言
pl/编程语言是对sql语言的扩展,使得sql语言具有过程化编译的特性。pl/编程语言比一般的过程化编程语言,更加灵活高效。pl/编程语言主要用来编写存储过程和存储函数
1、声明方法

赋值操作 : (:=)或者(into查询语句)两种方式赋值。
例:引用型变量(type)和记录型变量(rowtype)的使用

set serveroutput on
declare
i number(2) :=10;
s varchar2(10) :='小明';
ena emp.ename%type;-- 引用型变量
emprow emp%rowtype;--记录型变量
begin
dbms_output.put_line(i);
dbms_output.put_line(s);
select ename into ena from emp where empno=7499;
dbms_output.put_line(ena);
select * into emprow from emp where empno=7499;
dbms_output.put_line(emprow.ename||'的工作为:' ||emprow.job);
end;

Oracle编程( 其三)

2、pl/sql中的if判断语句

通用句式:(条件语句中必须要以end if结束,并且只有这里加分号、可以省去elsif和else,类似于java)

declare
begin
if then
elsif then
else
end if;
end;

例:
输入小于18的数字,输出未成年
输入小于40大于18的数字,输出中年人
输入大于40的数字,输出老年人

set serveroutput on
declare
x number(3):=&xx;
begin
if x<18 then
dbms_output.put_line('未成年');
elsif x<40 then
dbms_output.put_line('中年人');
else
dbms_output.put_line('老年人');
end if;
end;

Oracle编程( 其三)

3、pl/sql中的loop循环

三种循环方式输出1-10
1、while循环

set serveroutput on
declare
i number(2):=1;
begin
while i<11 loop
dbms_output.put_line(i);
i :=i+1;
end loop;
end;

2、exit循环(重点掌握)

set serveroutput on
declare
i number(2):=1;
begin
loop
exit when i>10;
dbms_output.put_line(i);
i:=i+1;
end loop;

end;
3、for循环

set serveroutput on
declare
i number(2):=1;
begin
for i in 1..10 loop
dbms_output.put_line(i);
end loop;
end;

三种循环输出结果相同:
Oracle编程( 其三)

3、游标(cursor)

游标:可以存放多个对象,多行记录。

例:输出emp表中所有员工的姓名。

set serveroutput on
declare
cursor c1 is select * from emp;
emprow emp%rowtype;
begin
open c1;
loop
fetch c1 into emprow;
exit when c1%notfound;
dbms_output.put_line(emprow.ename);
end loop;
close c1;
end;

Oracle编程( 其三)
例:给制定部门员工涨工资

set serveroutput on
declare
cursor c2(eno emp.deptno%type) is select empno from emp where deptno=eno;
en emp.empno%type;
begin
open c2(10);
loop
fetch c2 into en;
exit when c2%notfound;
update emp set sal=sal+100 where empno=en;
commit;
end loop;
close c2;
end;

查询emp表中部门号为10的员工信息
Oracle编程( 其三)

再一次查询emp表就会发现给部门号为10的涨了100工资。
Oracle编程( 其三)

4、存储过程(procedure)

存储过程:提前已经编译好的一段pl/sql语言,放置在数据库端,可以直接被调用。(这一段pl/sql一般都是固定步骤的业务)
例:给指定员工涨100工资

create or replace procedure p1(eno emp.empno%type)
is

begin
update emp set sal=sal+500 where empno=eno;
commit;
end;

Oracle编程( 其三)
or replace作用:没有时 --> 创建这个过程。有重名时 --> 替换为现在的。(保证能够每次都创建、使用or replace时,其它用户在该函数上的权限不会丢失和变化)

测试p1:

declare

begin
p1(7499);
end;

out类型参数使用方法:
例:使用存储过程来计算年薪

create or replace procedure p_yearsal(eno emp.empno%type,yealsal out number)
is
s number(10);
c emp.comm%type;
begin
select sal*12,nvl(comm,0) into s,c from emp where empno=eno;
yealsal := s+c;
end;

Oracle编程( 其三)
测试P_YEARSAL:

declare
yealsal number(10);
begin
p_yearsal(7499,yealsal);
dbms_output.put_line(yealsal);
end;

Oracle编程( 其三)

in 和 out 类型参数的区别是什么?
凡是涉及到into查询语句赋值、:= 操作的参数,都必须使用out来修饰。

5、存储函数(function)

存储过程和存储函数的参数都不能带长度
存储函数的返回值类型不能带长度

例:通过存储函数实现计算指定员工的年薪
在oracle中,null与数字相加减,结果为null。所以需要nvl()函数将comm去除null值。

create or replace function f_yearsal(eno emp.empno%type) return number
is
s number(10);
begin
select sal*12+nvl(comm,0) into s from emp where empno =eno;
return s;
end;

Oracle编程( 其三)
测试函数(F_YEARSAL):
函数在调用的时候,返回值需要接收

declare
s number(10);
begin
s:=f_yearsal(7499);
dbms_output.put_line(s);
end;

Oracle编程( 其三)

存储过程和存储函数的区别:

    语法区别:
    关键字不一样(存储函数比存储过程多了两个return)本质区别:
    存储函数有返回值,存储过程没有返回值。
    如果存储过程想实现有返回值的业务,我么就必须用out类型的参数。
    即便是存储过程使用了out类型的参数,本质也不是真的有了返回值。
    而是在存储过程内部给out类型参数赋值,再执行完毕后,我们直接拿到输出类型的值。

案例需求:查询出员工姓名,员工所在部门名称。(我们可以使用存储函数有返回值的特性,来自定义函数.存储过程不能用来自定义函数。)

1、传统方式来实现:

select e.ename,d.dname
from emp e,dept d
where e.deptno=d.deptno;

2、使用存储函数来实现提供一个部门编号,输出一个部门名称。

create or replace function fdna(dno dept.deptno%type) return dept.dname%type
is
dna dept.dname%type;
begin
select dname into dna from dept where deptno=dno;
return dna;
end;

Oracle编程( 其三)

测试(fdna存储函数来实现案例需求):

select e.ename,fdna(e.deptno)
from emp e;

Oracle编程( 其三)

6、触发器(trigger)

指定一个规则,在我们增删改操作的时候只要满足,自动触发,无需调用

1、语句级触发器:不包含for each row
Oracle编程( 其三)

例:插入一条记录,输出一个新学生入学

reate or replace trigger t1
after
insert
on student
declare

begin
dbms_output.put_line('一个新员工入职!');
end;

触发t1触发器

insert into student values('1111111','王延新','女',18,'04');
commit;

Oracle编程( 其三)

2、行级触发器:包含for each row

加for each row目的:为了使用: a、 :old 对象、b、:new 对象、c、一行记录。

例:不能给员工降薪
raise_application_error(-20001~-20999之间,‘错误提示信息’);

create or replace trigger t2
before
update
on emp
for each row
declare

begin
if :old.sal>:new.sal then
raise_application_error(-20001,'不能给员工降薪');
end if;
end;

Oracle编程( 其三)
触发t2:

update emp set sal=sal-1 where empno=7499;
commit;

触发器实现主键自增

分析:在用户做插入操作之前,拿到即将插入的数据,给主键列赋值

create or replace trigger auid
before
insert
on student
for each row
declare

begin
select s_person.nextval into :new.pid from dual;
end;

Oracle编程( 其三)
使用auid实现主键自增

insert into person (pname) value('a');
commit;

Oracle编程( 其三)

原创:https://www.panoramacn.com
源码网提供WordPress源码,帝国CMS源码discuz源码,微信小程序,小说源码,杰奇源码,thinkphp源码,ecshop模板源码,微擎模板源码,dede源码,织梦源码等。

专业搭建小说网站,小说程序,杰奇系列,微信小说系列,app系列小说

Oracle编程( 其三)

免责声明,若由于商用引起版权纠纷,一切责任均由使用者承担。

您必须遵守我们的协议,如果您下载了该资源行为将被视为对《免责声明》全部内容的认可-> 联系客服 投诉资源
www.panoramacn.com资源全部来自互联网收集,仅供用于学习和交流,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。 敬请谅解! 侵权删帖/违法举报/投稿等事物联系邮箱:2640602276@qq.com
未经允许不得转载:书荒源码源码网每日更新网站源码模板! » Oracle编程( 其三)
关注我们小说电影免费看
关注我们,获取更多的全网素材资源,有趣有料!
120000+人已关注
分享到:
赞(0) 打赏

评论抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

您的打赏就是我分享的动力!

支付宝扫一扫打赏

微信扫一扫打赏