博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle学习总结4-PL/SQL
阅读量:6145 次
发布时间:2019-06-21

本文共 5977 字,大约阅读时间需要 19 分钟。

一 PL/SQL

1.语法:

declare

begin

exception

end

2.变量类型:

char,varchar2,date,number,boolean,long,

%type:引用类型

%rowtype:记录

 

3.if语句

if 条件 then 语句1;

elsif 条件 then 语句2;

else 语句3

end if;

4.循环语句

loop

exit when 条件;

执行语句;

end loop;

 

5.游标(cursor):用来过程化处理一条或者多条记录

定义:cursor pc is select * from emp;

 

定义想要接收的值:pemp emp%rowtype;

 

打开游标:open pc;

 

接收游标的值:fetch pc into pemp;

 

游标结束方式:exit when pc%notfound

 

光标的属性:%isopen   %rowcount(影响的行数)

                 %found    %notfound

6.例外

使用:

exception

          when 异常名1 then 处理语句1;

          when 异常名2 then 处理语句2;

 

系统定义的例外:

no_data_found(没有找到数据)

too_many_rows(into值时匹配到多行数据)

zero_divide(被0除)

value_error(算术或者转换错误)

timeout_on_resource(等待资源发生超时,分布式系统中会遇到)

 

自定义异常:

         异常定义:no_emp_found exception;

         调用自定义异常:if 条件 then raise 自定义异常名;

自定义异常处理:

exception

         when 自定义异常名 then 处理语句;

 

 

二 PL/SQL操作

在cmd命令窗口显示:set serveroutput on

 

1.hello world

declarebegin   dbms_output.put_line('Hello world');end;

 

 

2.--得到7839的姓名和薪水

declarepename emp.ename%type;pesal emp.sal%type;begin   select ename,sal into pename,pesal from emp where empno='7839';   dbms_output.put_line(pename||'薪水是'||pesal);end;

 

 

或者

declarepemp emp%rowtype;begin   select * into pemp from emp where empno='7839';   dbms_output.put_line(pemp.ename||'薪水是'||pemp.sal);end;

 

3.-- 判断用户从键盘输入的数字(PL/SQL中会报错,sqldeveloper不会)

accept num prompt '请输入一个数字';declarepnum number := #begin   if pnum=0 then dbms_output.put_line('亲输入的是0');      elsif pnum=1 then dbms_output.put_line('亲输入的是1');      elsif pnum=2 then dbms_output.put_line('亲输入的是2');      else dbms_output.put_line('亲输入的是其他数字');    end if;end;

 

4.输出一个1-10的循环

declare   pnum number:=1;begin   loop        exit when pnum>10;        dbms_output.put_line(pnum);        pnum:=pnum+1;         end loop;end;

 

 

5. -- 查询并打印员工的姓名和薪水       注意连接符||,不能用+连接

declare   cursor pc is select * from emp;   pemp emp%rowtype;  begin   open pc;         loop              fetch pc into pemp;              exit when pc%notfound;                           dbms_output.put_line(pemp.ename||':'||pemp.sal);            end loop;    close pc;end;

 

 

 

6. -- 给员工涨工资,总裁1000 经理800 其他400

declare   cursor pc is select empno,job from emp;   pempno emp.empno%type;   pjob emp.job%type;begin   rollback;   open pc;   loop        --取数据        fetch pc into pempno,pjob;        exit when pc%notfound;               if pjob='PRESIDENT' then update emp set sal=sal+1000 where empno=pempno;           elsif pjob = 'MANAGER' then update emp set sal=sal+800 where empno=pempno;           else update emp set sal=sal+400 where empno=pempno;        end if;    end loop;        close pc;     commit;end;

 

 

7. -- 查询某个部门的员工姓名

declare   cursor pc(dno number) is select ename from emp where deptno=dno;   pename emp.ename%type;begin   open pc(20);--在这里传参        loop          fetch pc into pename;          exit when pc%notfound;          dbms_output.put_line(pename);        end loop;   close pc;end;

 

 

8. -- 系统例外

declare   i number;begin   i:=1/0;     exception   when zero_divide then dbms_output.put_line('1:0不能做分母');end;

 

 

9. -- 自定义例外查询50号部门的员工姓名

declare   cursor pc is select ename from emp where deptno=50;   pename emp.ename%type;     no_emp_found exception;begin   open pc;        fetch pc into pename;     if pc%notfound then  raise no_emp_found;     end if;   close pc;     exception         when no_emp_found then dbms_output.put_line('没有记录');         when others then dbms_output.put_line('其它异常');end;

 

 

10.瀑布模型

         需求分析-概要设计-详细设计-编程-测试-上线

 

11.-- 1980198119821987入职员工的个数

--思路,计数器,遍历的时候,判断年份,是哪一年就给哪一年的计数加1

--sql语句

--变量

 

declare   cursor pc is select to_char(hiredate,'yyyy') from emp;   theyear varchar2(20);   count80 number:=0;   count81 number:=0;   count82 number:=0;   count87 number:=0;begin   open pc;   loop        fetch pc into theyear;        exit when pc%notfound;        if theyear='1980' then count80:=count80+1;        elsif theyear='1981' then count81:=count81+1;        elsif theyear='1982' then count82:=count82+1;        else count87:=count87+1;        end if;          end loop;     close pc;     dbms_output.put_line(count80+count81+count82+count87||'---'||count80||'---'||count81||'---'||count82||'---'||count87);end;

 

 

12. -- 工资从低往高,每个员工涨10%工资,但所有员工总工资不能超过5万元,输出涨工资的人数和涨后的工资总额

--遍历的sql语句:select * from emp order by sal;

--退出遍历条件:1结束2总工资超过5W

--变量  遍历变量工资员工no 工资总额涨工资总人数

 

declare   cursor pc is select empno,sal from emp order by sal;   pempno emp.empno%type;   psal emp.sal%type;     countNum number:=0;   totalSal number;begin   rollback;   select sum(sal) into totalSal from emp;   open pc;   loop        exit when totalSal>50000;        fetch pc into pempno,psal;        exit when pc%notfound;        if totalSal<50000  then                if totalSal+psal*0.1<50000 then                      update emp set sal=sal*1.1 where empno=pempno;                      totalSal:=totalSal+psal*0.1;                      countNum:=countNum+1;                end if;        end if;   end loop;   close pc;   dbms_output.put_line('涨薪人数'||countNum||',总工资'||totalSal);   commit; end;

 

 

 

 

13.

 

 

--sqlselect deptno from dept

--sql: select sal from emp where deptno=dno;

 

--变量:count0 count3 count6 totalSal

declare    cursor pc0 is select deptno from dept;    cursor pc1(dno number) is select sal from emp where deptno=dno;       dno dept.deptno%type;    psal emp.sal%type;    count0 number;    count3 number;    count6 number;    totalSal number;begin    --外循环确定遍历的部门号    open pc0;    loop         fetch pc0 into dno;         --重置变量         count0:=0;         count3:=0;         count6:=0;         totalSal:=0;         exit when pc0%notfound;         open pc1(dno);         loop--内循环根据条件设置或统计值              fetch pc1 into psal;                  exit when pc1%notfound;              totalSal:=totalSal+psal;              if psal<3000 then count0:=count0+1;              elsif psal<6000 then count3:=count3+1;              else count6:=count6+1;              end if;         end loop;         close pc1;         --在新的一张表中,存这些数据         insert into msg values(dno,count0,count3,count6,totalSal);    end loop;    close pc0;    commit; end;

 

 

 

转载于:https://www.cnblogs.com/mlbblkss/p/6986586.html

你可能感兴趣的文章
在soapui上踩过的坑
查看>>
MySQL的字符集和字符编码笔记
查看>>
ntpd同步时间
查看>>
must implement java.io.Serializable hessian
查看>>
Microsoft Licenses Flash Lite for Windows Mobile Users
查看>>
HDOJ 2020 绝对值排序
查看>>
HDOJ/HDU 2560 Buildings(嗯~水题)
查看>>
Maven编译时跳过Test
查看>>
Spring Boot 整合Spring Security 和Swagger2 遇到的问题小结
查看>>
[20170628]12C ORA-54032.txt
查看>>
除以2
查看>>
高可用集群原理解析
查看>>
Nginx配置URL转向tomcat
查看>>
极客Web前端开发资源大荟萃#001
查看>>
让div固定在某个位置
查看>>
Java开发环境Docker镜像
查看>>
从无到有,WebService Apache Axis2初步实践
查看>>
任务调度(一)——jdk自带的Timer
查看>>
UIKit框架(15)PCH头文件
查看>>
整理看到的好的文档
查看>>