19个实例学会plsql

--p1
begin
dbms_output.put_line('你好 世界');
end;

--p2 引入变量
declare
    age number default 90;
    height number := 175;
begin
    dbms_output.put_line('年龄'||age||'身高'||height);
end;

--p3 变量开始运算
declare
    age number default 90;
    height number := 175;
begin
    dbms_output.put_line('年龄'||age||'身高'||height);
    age := age + 20;
    dbms_output.put_line('20年后年龄'||age||'');
end;


--p4 引入表达式
declare
    age number default 90;
    height number := 175;
begin
    if age>70 then
        dbms_output.put_line('古稀之年');
    else
        dbms_output.put_line('风华正茂');
    end if;
end;

--p5 流程控制
declare
    age number default 90;
    height number := 175;
    gender char(2) := '';
begin
    if gender='' then
        dbms_output.put_line('你可以和女性结婚');
    end if;

    if height>170 then
        dbms_output.put_line('可以打篮球');
    else 
        dbms_output.put_line('可以踢足球');
    end if;

    if age<20 then
        dbms_output.put_line('年轻小伙');
    elsif age <= 50 then
        dbms_output.put_line('年轻有为');
    elsif age <=70 then
        dbms_output.put_line('安享天伦');
    else  
        dbms_output.put_line('佩服佩服');
    end if;

end;


--p6 计算1-100的和
declare
    i number :=0;
    total number :=0;
begin
    loop
        i := i+1;
        total := total + i;

        if i=100 then
            exit;
        end if;
    end loop;

    dbms_output.put_line('总和'||total);

end;

-- p7: 跳出loop的方法
declare
    i number :=0;
    total number :=0;
begin
    loop
        i := i+1;
        total := total + i;

        exit when i>=100;
    end loop;

    dbms_output.put_line('总和'||total);

end;

--p8 whlie循环
declare
    i number :=0;
    total number :=0;
begin

    while i<100 loop
        
        i := i+1;
        total := total + i;
        
    end loop;

    dbms_output.put_line('总和'||total);

end;



--p9 for 循环
begin

    --for 循环变量 in 起始值..结束值 loop
    --xxxxx
    --end loop;

    for i in 1..9 loop
    
        dbms_output.put_line(i);

    end loop;

    for i in reverse 1..9 loop
    
        dbms_output.put_line(i);

    end loop;

end;



--p10 没有返回值的"函数"
--做一个求面积的过程
--declare
--    area number;
--    procedure 过程名(参数名 类型,...) is
--    begin
--        主体
--    end;
--begin
--end;

declare 
    area number;
    procedure mian(a number,b number) is
    begin
    
        area := a * b;
        dbms_output.put_line(a||''||b||'的面积是'||area);
    
    end;
begin

    mian(5,4);
    mian(6,7);
    mian(3,7);

end;



--p11 做一个求面积的函数
--declare
--    area number;
--    function 过程名(参数名 类型,...) return 类型 is
--    begin
--        主体
--    end;
--begin
--end;

declare 
    area number;
    function mian(a number,b number) return number is
    begin
    
        area := a * b;
        
        return area;
    
    end;
begin

    dbms_output.put_line(mian(5,4));
    dbms_output.put_line(mian(3,7));
    dbms_output.put_line(mian(6,9));

end;


--p12 自定义变量类型 之记录类型

declare
    
    type student is record
    (
        sno char(5),
        name varchar2(10),
        age number
    );

    lisi student;

begin

    lisi.sno := 's1008';
    lisi.name := '李四';
    lisi.age := 19;

    dbms_output.put_line('我叫'||lisi.name||',我'||lisi.age||'岁,学号是'||lisi.sno);
end;




--p13 自定义类型之集合类型


declare 
 type answer is table of char(2);
 ans answer := answer('a','b','c','d');

begin

    dbms_output.put_line('共有'||ans.count()||'答案,分别是:');
    dbms_output.put_line(ans(1));
    dbms_output.put_line(ans(2));
    dbms_output.put_line(ans(3));
    dbms_output.put_line(ans(4));

end;

--p14 声明数据类型的第3个方法

declare
    age number;
    变量名 另一个变量%type;

    age 表名.列名%type; --声明和列一样的类型

    --简化声明record类型
    变量名 表名%rowtype;

begin
end;


--p15 测试一下rowtype

declare
    xg student%rowtype;
begin

    xg.sno := 123;
    xg.name := '小刚';

    dbms_output.put_line(xg.sno||xg.name);

end;



--p16 pl/sql操作数据库中的数据
--查询部门的名称及地区,及部门的总薪水与奖金

declare 

    depart dept%rowtype;
    total_sal number;
    total_comm number;

    procedure deptinfo(dno number)
    is
    begin
        select dname,loc into depart.dname,depart.loc from dept where deptno=dno;
        select sum(sal),sum(comm) into total_sal,total_comm from emp where deptno=dno;

        dbms_output.put_line('部门名称:'||depart.dname||''||depart.loc);
        dbms_output.put_line('这个部门每月工资及奖金各是'||total_sal||''||total_comm);
    end;

begin

    deptinfo(80);
    deptinfo(30); 
end;



--p17 引入异常处理

declare 

    depart dept%rowtype;
    total_sal number;
    total_comm number;

    procedure deptinfo(dno number)
    is
    begin
        select dname,loc into depart.dname,depart.loc from dept where deptno=dno;
        select sum(sal),sum(comm) into total_sal,total_comm from emp where deptno=dno;

        dbms_output.put_line('部门名称:'||depart.dname||''||depart.loc);
        dbms_output.put_line('这个部门每月工资及奖金各是'||total_sal||''||total_comm);
    end;

begin
    deptinfo(80);
    deptinfo(30);
exception
    when NO_DATA_FOUND then
       dbms_output.put_line('没有数据');
    when others then
       dbms_output.put_line('其他错误');
end;



--p18:递归过程或函数
--求1->N的和,N允许输入

declare
    m number;
    total number;

    function qiuhe(n number) return number
    is
    begin

        if n>1 then
            return n + qiuhe(n-1);
        else 
            return 1;
        end if;

    end;

begin

    dbms_output.put_line(qiuhe(10));

end;

--p19 存储过程/存储函数
create function qiuhe(n number) return number
is
begin

    if n>1 then
        return n + qiuhe(n-1);
    else 
        return 1;
    end if;

end;

 

触发器例子

-- g 商品表
create table g
(gid number,
gname varchar2(20),
cnt number
);

insert into g values (seq1.nextval,'',10);
insert into g values (seq1.nextval,'',8);
insert into g values (seq1.nextval,'',7);
insert into g values (seq1.nextval,'',6);


-- o 订单表
create table o (
oid number,
gid number,
much number
);



监视:o表
动作: insert
触发: update g
时间:after 


create trigger 触发器名字
触发时间
监视的动作 on 表名[监视地点]
begin

    触发后的动作

end;


create trigger t1
after insert on o
begin
    update g set cnt=cnt-new.much where gid=new.gid;
end;

create trigger t2
after insert on o
for each row
begin
    update g set cnt=cnt-:new.much where gid=:new.gid;
end;


--表级触发器
create trigger t3
after delete on goods
begin
    dbms_output.put_line('有人触发我');
end;

--行级触发器
create trigger t4
after delete on goods
for each row
begin
    dbms_output.put_line('有人触发我');
end;

--before发生的触发器,有机会改sql语句的值
create trigger t5
before insert on o
for each row

declare
tmp number;

begin

    select cnt into tmp from g where gid=:new.gid;

    if :new.much > tmp then
    
        :new.much := tmp;
    
    end if;

    update g set cnt=cnt-:new.much where gid=:new.gid;
    
end;

 

转载于:https://www.cnblogs.com/Chary/p/10438565.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PL/SQL编程 pl/sql(procedural language/sql)是Oracle在标准的sql语言上的扩展。pl/sql不仅允许嵌入式sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误。这样使得他的功能变的更强大。缺点是移植性不好。 编写一个存储过程,向表中添加数据。 1. create table mytest (name varchar2(30),passwd varchar2(30)); 2. create or replace procedure xxc_pro1 is begin insert into mytest values ('小红','m123'); end; 3. 调用过程 exec 过程名(参数1,参数2…)或call 过程名参数1,参数2…) ① exec xxc_pro1; 或者是 ② call xxc_pro1; pl/sql可以做什么? 块:包括过程、函数、触发器、包。 编写规范: 1. 注释 --:单行注释 eg:select * from emp where empno=7788;--取得员工信息 /*……*/多行注释 2. 表示符号(变量)的命名规范: ① 当定义变量时,建议用v_作为前缀:v_ename ② 当定义常量时,建议用c_作为前缀:c_rate ③ 当定义游标时,建议用_cursor作为后缀:emp_cursor ④ 当定义例外时,建议用e_作为前缀:e_error 块(block)是pl/sql的今本程序单元,编写pl/sql程序实际上就是在编写pl/sql块;pl/sql块由三部分组成:定义部分,执行部分,例外处理部分。 declare --可选部分 /*定义部分:定义常量,变量,游标,例外,复杂数据类型*/ begin --必选部分 /*执行部分:要执行的pl/sql语句和sql语句*/ exception --可选部分 /*例外处理部分:处理运行的各种错误*/ 实例1:只包含执行部分的pl/sql块 SQL> set serveroutput on --打开输出 SQL> begin 2 dbms_output.put_line('hello'); 3 end; 4 / 说明:dbms_output是oracle提供的包,该包包含一些过程,put_line就是其中之一。 实例2:包含定义部分和执行部分 SQL> declare 2 v_ename varchar2(5); 3 begin 4 select ename into v_ename from emp where empno = &no; 5 dbms_output.put_line('雇员名'||v_ename); 6 end; 7 / 说明:&:从控制台输入变量,会弹出一个对话框。 实例3.同时输出雇员名和工资 SQL> declare 2 v_ename varchar2(20); 3 v_sal number(10,2); 4 begin 5 select ename,sal into v_ename,v_sal from emp where empno=&no; 6 dbms_output.put_line('雇员名:'||v_ename||' 工资:'||v_sal); 7 end; 8 / 包含定义,执行,和例外处理的pl/sql块。 实例4.当输入的员工号不存在时 SQL> declare 2 v_ename varchar2(20); 3 v_sal number(10,2); 4 begin 5 select ename,sal into v_ename,v_sal from emp where empno =&no; 6 dbms_output.put_line('雇员名:'||v_ename||' 工资:'||v_sal); 7 exception --异常处理部分 8 when no_data_found then 9 dbms_output.put_line('请输入正确的员工号!'); 10 end; 11 / 以上为块的基础,下面来介绍块的各个组成:过程,函数,触发器,包。 过程 过程用于执行特定的操作,当执行过程的时候,可以指定输入参数(in),也可以指定输出参数(out)。通过在过程中使用输入参数,可以讲数据输入到执行部分,通过使用输出参数,可以将执行部分的数据输出到应用环境,在pl/sql中可以使用create procedure命令来创建过程。 编写一个存储过程,可以输入雇员名和新工资来改变员工工资。 --案例 create or replace procedure xxc_pro3(newname in varchar2,newsal in number) is begin update emp set sal=newsal where ename=newname; end;

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值