oracle 快速入门之第四章 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打印输出
begin
  dbms_output.put_line('我是Oracle打印输出的结果');
  end;

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

  • PL/SQL变量的使用

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

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

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


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

  • 通过PL/SQL编程查找7369的薪资   控制台打印输出

declare
--声明一个变量保存查找的薪资
 mysal number;
begin
  select sal into mysal from emp where empno = 7369;
  --打印输出
  dbms_output.put_line('薪水为: '||mysal);
  end;

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

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

  • oracle中的输入器   &

  • 查找指定编号的薪资

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

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

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

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

  3. 属性类型:   %type   %rowtype 

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

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

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

四:oracle中的选择结构:

  1. if结构  

  2. case结构

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

  • case的使用
begin
  case '&请输入'
    when 'A' then dbms_output.put_line('优秀');
    when 'B' then dbms_output.put_line('良好');
    when 'C' then dbms_output.put_line('一般');
    when 'D' then dbms_output.put_line('low');
    else
      dbms_output.put_line('鬼');
    end case;
  end;

五:PL/SQL循环结构: 

  1.  loop  

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

  •  while(true){} 

  1. for

  •  for...in

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

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

  • 1-100的和
declare
mynum number(10):=1;
mysum number(10):=0;
begin
  <<myloop>>
  loop
      mysum:=mysum+mynum;
      mynum:=mynum+1;
      exit myloop when mynum = 101;
    end loop;
    dbms_output.put_line(mysum);
  end;

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

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

六:异常处理

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

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

    when no_data_found then
      dbms_output.put_line('提供的编号不存在');
  end;

重点:

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

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

  • 判断一个年龄是否在指定的区间(18-36)
declare
myAgeException exception; --自己定义异常
myAge number(20):=45;
begin
  if (myAge < 20 or myAge > 36) then
    raise myAgeException;
    else
      dbms_output.put_line('年龄为: '||myAge);
    end if;
    --捕捉异常
    exception
      when myAgeException then
         dbms_output.put_line('年龄不在指定的范围内');
  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
create or replace function returnSum(mynum number)
return number is
mysum number:=0;--保存和
begin
  for i in 1..mynum loop
    mysum:=mysum+i;
    end loop;
   return mysum;
  end;

--调用
select returnSum(100) from dual;
  • 封装一个函数  根据指定的编号查找对应的工资

create or replace function getSalByEmpno(myempno emp.empno%type)
return emp.sal%type is
mysal emp.sal%type;
begin
  select sal into mysal from emp where empno = myempno;
  return mysal;
  end;


--调用
select getSalByEmpno(7369) from dual;


版权声明:本文为qq_61313896原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。