oracle系列2:pl/sql

一、简介:

pl/sql是面向过程语言与sql语言的结合,它在sql语言中扩充了面向过程的程序结构,如变量和类型、控制语句、过程和函数、对象类型和方法等,实现将过程结构与sql的无缝集成,从而为用户提供了一种功能强大的结构化程序设计语言。

二、pl/sql的组成:

1、数据定义语言(DDL):用于执行数据库任务,对数据库及其中的各种对象进行创建、删除、修改等操作

语句 功能
create 创建数据库或数据库对象
alter 修改数据库或数据库对象
drop 删除数据库或数据库对象

2、数据操作语言(DML):用于操作数据表中的数据,如查询、修改、增加等操作

语句 功能
select 检索表或视图中的数据
insert 插入数据到表或视图中
update 修改表或视图中的数据
delete 删除表或视图中的数据

3、数据控制语言(DDL):用于安全管理,确定哪些用户可以查看或修改数据库中的数据

语句 功能
grant 授予权限
revoke 收回权限

三、使用pl/sql的好处:

有利于客户/服务器环境应用的运行。对于客户/服务器环境来说,真正的瓶颈在网络上。无论网络的传输速度有多快,只要客户端与服务器进行大量的数据交换,应用运行的效率肯定会受到影响。如果使用pl/sql进行编程,将这种具有大量数据处理的应用放在服务器端执行,就可以节省数据在网络中的传输时间。

四、pl/sql编程案例:

1、检查学生表中的某个记录是否存在,存在就更新,如果不存在就插入记录

/*定义变量*/
declare
    xh varchar2(6):='123456';
    xm varchar2(8):='张三';
    zxf number(2):=45;

/*逻辑块*/
begin
    /*更新学生表*/
    update xsb set xsb.xm=xm,xsb.zxf=zxf where xh='123456';
    /*检查记录是否存在,如果不存在就插入记录*/
    if sql%notfount then
        insert into xsb values(xh,xm,zxf);
    end if;
end

2、如果“计算机基础”课程的平均成绩高于75分,则输出“平均成绩高于75分”,否则输出“平均成绩低于75分”

declare
    v_avg number(4,2);

begin
    select avg(score) into v_avg
    from xsb,cjb,kcb
    where xsb.id=cjb.xid and cjb.id=kcb.cid 
    and kcb.name="计算机基础";

    if v_avg>75 then
        dbms_output.put_line('平均成绩高于75');
    else 
        dbms_output.put_line('平均成绩低于75');
    end if;

end;

3、求10的阶乘

//1、用for循环求10的阶乘

declare
    n number:=1;
    i number;

begin
    for i in 2..10
        loop
          n:=n*i;
        end loop;
     dbms_output.put_line(to_char(n));   
end;            


//2、用wile循环求10的阶乘

declare
    n number:=1;
    i number;

begin
    while i<=10
     loop
        n:=n*i;
        i:=i+1;
     end loop;
     dbms_output.put_line(to_char(n));   
end;           


//3、用loop循环求10的阶乘

declare
    n number:=1;
    i number:=2;

begin
    loop
        n:=n*i;
        i:=i+1;
        if i>10   then
             exit;
        end if;
    end loop;
    dbms_output.put_line(to_char(n)); 
end;                        

五、在pl/sql中自定义函数

参数的三种模式:

in:表示该参数是输入给函数的参数

out:表示该参数在函数中赋值,并可以传给函数调用程序

inout:表示该参数既可以传值也可以赋值

1、创建函数,根据课程id计算学生的平均成绩

create or replace function abc(cid in char) //参数模式为in,则表示该参数是输入给函数的参数
    return number; //返回值类型是number型
as
    avger number; //定义返回值变量

begin
    select avg(成绩) into avger
    from cjb where cjb.cid=cid 
    group by cjb.cid;
    return(avger);
end;

2、调用函数

declare
    cid char:='20180205';

begin
    abc(cid);    //调用函数
end;

3、删除函数

drop function abc;