当前位置:   article > 正文

oracle 快速入门之第四章 PLSQL编程

plsql编程

一:PLSQL基本概念:

1.PL:过程语言:类似Java语言的风格,可以在Oracle工具中打印输出,定义变量,
           顺序结构,选择结构,循环结构,游标,函数,同义词,存储过程,触发器等等
2.SQL:结构化查询语言
      数据定义语言|数据控制语言|事务控制语言|数据操纵语言
3.PL/SQL编程:是过程语言与结构化查询语言的结合。 

4.PLSQL(Procedure Language/SQL)是Oracle对sql语言的过程化扩展,在SQL的命令语言中增加了过程处理语句,如分支,循环等,使SQL语言有过程处理能力

注意:SQL语言能实现的,PL/SQL也可以实现

二:PLSQL的组成部分:

工具PLSQL Developer 的Test Window创建模板或者在SQL Window编写,在PLSQL中是不区分大小写的

3个部分:声明部分,可执行代码块部分,异常处理部分
其中可执行代码块部分是必须的,其它2个部分可以不写。
语法:
       declare
           ① 变量名 数据类型;--变量声明;
       begin--可执行部分的开始
          ②  逻辑代码;
         end;--可执行部分的结束
         
         ③异常处理部分

  • PL/SQL打印输出

  • Java打印输出
System.out.println("123");
  • oracle打印输出
  1. begin
  2. dbms_output.put_line('我是Oracle打印输出的结果');
  3. end;

注意事项:PL/SQL编程中的语句必须放入begin...end语句块中

  • PL/SQL变量的使用

  • 定义一个变量保存一个姓名,然后打印输出
  1. declare
  2. myname varchar2(100);
  3. begin
  4. --赋值 :=
  5. myname:='刘邦';
  6. dbms_output.put_line('myname = '||myname);
  7. end;

  • SQL语言能实现的操作PL/SQL也能实现

  • 查询7369的薪资  通过SQL语言实现
select sal from emp where empno = 7369;


重点:从某张表中查询到指定的结果然后into(赋值)给指定的变量名
语法:select ....into.....    

  • 通过PL/SQL编程查找7369的薪资   控制台打印输出
  1. declare
  2. --声明一个变量保存查找的薪资
  3. mysal number;
  4. begin
  5. select sal into mysal from emp where empno = 7369;
  6. --打印输出
  7. dbms_output.put_line('薪水为: '||mysal);
  8. end;

 在使用变量的同时可以合二为一

  1. declare
  2. myempno number:=7369;
  3. mysal number;
  4. begin
  5. select sal into mysal from emp where empno = myempno;
  6. --打印输出
  7. dbms_output.put_line('薪水为: '||mysal);
  8. end;

  • oracle中的输入器   &

  • 查找指定编号的薪资

  1. declare
  2. myempno number(10):='&输入员工编号';--编号
  3. mysal number(20);
  4. begin
  5. select sal into mysal from emp where empno = myempno;
  6. dbms_output.put_line(mysal);
  7. end;

三:PL/SQL编程中的数据类型

  1. 标量类型:number,varchar2,date,boolean

  2. 大数据类型:LOB   存储二进制文件(图片,视频等等)

  3. 属性类型:   %type   %rowtype 

  • %type 引用指定表中的指定字段的类型

  • %rowtype  引用指定表中的指定行的类型(类似java的对象)

  • 查找7369的薪水,薪水类型不确定
  1. declare
  2. myempno emp.empno%type:=7369;--假设empno是number类型 emp.empno%type = number
  3. mysal emp.sal%type;
  4. begin
  5. select sal into mysal from emp where empno = myempno;
  6. dbms_output.put_line(mysal);
  7. end;
  • 查找7499的所有信息
  1. declare
  2. myempno emp.empno%type:=7499;
  3. --根据行类型来定义一行的记录对象
  4. myemp emp%rowtype;
  5. begin
  6. select * into myemp from emp where empno = myempno;
  7. dbms_output.put_line(myemp.empno||' '||myemp.ename||' '||myemp.sal);
  8. end;

四:oracle中的选择结构:

  1. if结构  

  2. case结构

  • 定义一个变量保存一个数字,判断这个数字是否为偶数
  1. declare
  2. mynum number(10):='&请输入一个数字';
  3. begin
  4. if (mod(mynum,2) = 0) then
  5. dbms_output.put_line('偶数');
  6. else
  7. dbms_output.put_line('奇数');
  8. end if;--结束if语句
  9. end;
  • 大于3000 交税  等于3000继续努力   小于3000 回家挖田
  1. select ename,decode(sign(sal - 3000),'1','交税','-1','回家挖田','0','继续努力')
  2. from emp;
  • 通过IF实现  判断7369处于哪个级别
  1. declare
  2. myempno emp.empno%type:=7369;
  3. mysal emp.sal%type;
  4. begin
  5. select sal into mysal from emp where empno = myempno;
  6. --判断
  7. if (mysal > 3000) then
  8. dbms_output.put_line('交税');
  9. elsif (mysal = 3000) then
  10. dbms_output.put_line('继续努力');
  11. elsif (mysal < 3000) then
  12. dbms_output.put_line('回家挖田');
  13. end if;
  14. end;

  • case的使用
  1. begin
  2. case '&请输入'
  3. when 'A' then dbms_output.put_line('优秀');
  4. when 'B' then dbms_output.put_line('良好');
  5. when 'C' then dbms_output.put_line('一般');
  6. when 'D' then dbms_output.put_line('low');
  7. else
  8. dbms_output.put_line('鬼');
  9. end case;
  10. end;

五:PL/SQL循环结构: 

  1.  loop  

  • loop循环 (涉及到嵌套需要命名  结束循环)
  1. while

  •  while(true){} 

  1. for

  •  for...in

注意:loop循环 (涉及到嵌套需要命名  结束循环)

  • 打印输出1-100
  1. declare
  2. mynum number(20):=1;
  3. begin
  4. loop
  5. dbms_output.put_line(mynum);
  6. --递增+1
  7. mynum:=mynum+1;
  8. --满足条件就结束
  9. exit when mynum = 101;
  10. end loop;
  11. end;
  1. declare
  2. mynum number(20):=0;
  3. begin
  4. loop
  5. dbms_output.put_line(mynum);
  6. --满足条件就结束
  7. exit when mynum = 100;
  8. --递增+1
  9. mynum:=mynum+2;
  10. end loop;
  11. end;

  • 1-100的和
  1. declare
  2. mynum number(10):=1;
  3. mysum number(10):=0;
  4. begin
  5. <<myloop>>
  6. loop
  7. mysum:=mysum+mynum;
  8. mynum:=mynum+1;
  9. exit myloop when mynum = 101;
  10. end loop;
  11. dbms_output.put_line(mysum);
  12. end;

  • 1-100的偶数和
  1. declare
  2. mynum number(10):=1;
  3. mysum number(10):=0;
  4. begin
  5. <<myloop>>
  6. loop
  7. if (mod(mynum,2) = 0) then
  8. mysum:=mysum+mynum;
  9. end if;
  10. mynum:=mynum+1;
  11. exit myloop when mynum = 101;
  12. end loop;
  13. dbms_output.put_line(mysum);
  14. end;
  • 使用while循环输出1-100
  1. declare
  2. mynum number(10):=1;
  3. begin
  4. while (mynum <= 100) loop
  5. dbms_output.put_line(mynum);
  6. mynum:=mynum + 1;
  7. end loop;
  8. end;

  • 使用for循环输出1-100的和
  1. begin
  2. for i in 1..100 loop
  3. dbms_output.put_line(i);
  4. end loop;
  5. end;
  1. declare
  2. mysum number(10):=0;
  3. begin
  4. for i in 1..100 loop
  5. if(mod(i,2)=0) then
  6. mysum:=mysum+i;
  7. end if;
  8. end loop;
  9. dbms_output.put_line(mysum);
  10. end;

六:异常处理

异常(Exception)处理:当给定的语句执行后,如果找不到数据或者结果以预期的结果不匹配(行数)
plsql中提供了2中预设义异常:数据未找到异常,行太多异常
1.数据未找到异常(no_data_found):提供的字段在数据表中查找不到
2.行太多异常(too_many_rows):匹配的结果过多。
3.try...catch(){}

  • 打印输出250的薪水
  1. declare
  2. myempno emp.empno%type:=250;
  3. mysal emp.sal%type;
  4. begin
  5. select sal into mysal from emp where empno = myempno;
  6. dbms_output.put_line(mysal);
  7. --异常处理部分
  8. exception
  9. when no_data_found then
  10. dbms_output.put_line('提供的编号不存在');
  11. end;
  1. declare
  2. mysal emp.sal%type;
  3. begin
  4. select sal into mysal from emp;
  5. dbms_output.put_line(mysal);
  6. --异常处理部分
  7. exception
  8. when too_many_rows then
  9. dbms_output.put_line('行太多异常');
  10. end;
  • 同时处理多个异常
  1. declare
  2. mysal emp.sal%type;
  3. begin
  4. select sal into mysal from emp;
  5. dbms_output.put_line(mysal);
  6. --异常处理部分
  7. exception
  8. when too_many_rows then
  9. dbms_output.put_line('行太多异常');
  10. when no_data_found then
  11. dbms_output.put_line('提供的编号不存在');
  12. end;

重点:

自定义异常     exception  定义异常   raise  抛出异常

步骤
1.声明      异常名称  exception;
2.抛出       raise 异常名称;
3.捕捉      excetpion when 异常名称 then  输出异常结果提示;

  • 判断一个年龄是否在指定的区间(18-36)
  1. declare
  2. myAgeException exception; --自己定义异常
  3. myAge number(20):=45;
  4. begin
  5. if (myAge < 20 or myAge > 36) then
  6. raise myAgeException;
  7. else
  8. dbms_output.put_line('年龄为: '||myAge);
  9. end if;
  10. --捕捉异常
  11. exception
  12. when myAgeException then
  13. dbms_output.put_line('年龄不在指定的范围内');
  14. end;

七:函数

函数就是方法   方法就是函数
方法的核心:封装代码,方便调用

  1. 语法:

  2. create [or replace] function 函数名称[(参数1,参数2,....)]

  3. return 结果类型 is|as

  4. 声明部分不需要使用declare去定义

  5. begin

  6.   语句块;

  7.   end;

  • 封装求和的方法  1-10  1-100  1-1000
  1. create or replace function returnSum(mynum number)
  2. return number is
  3. mysum number:=0;--保存和
  4. begin
  5. for i in 1..mynum loop
  6. mysum:=mysum+i;
  7. end loop;
  8. return mysum;
  9. end;
  10. --调用
  11. select returnSum(100) from dual;
  • 封装一个函数  根据指定的编号查找对应的工资

  1. create or replace function getSalByEmpno(myempno emp.empno%type)
  2. return emp.sal%type is
  3. mysal emp.sal%type;
  4. begin
  5. select sal into mysal from emp where empno = myempno;
  6. return mysal;
  7. end;
  8. --调用
  9. select getSalByEmpno(7369) from dual;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/482359
推荐阅读
相关标签
  

闽ICP备14008679号