Oracle基础03

1.PL/SQL编程语言(划重点)

PL/SQL是Oracle对sql语言的过程化扩展,指在sql命令中增加了过程处理语句(分支、循环等)使sql具有了逻辑判断的能力

 

1>基础语法:

--基础语法
declare --说明部分

begin --程序开始

  dbms_output.put_line('Hello World');--打印语句,逻辑处理部分       
                 
end; --程序结束

 

2>说明变量:char、varchar2,date,number,boolean,long

--常量和变量的定义
declare
 
  varl varchar2(20) :='aa';--定义语句(变量名 类型)
  married boolean :=true;--赋值语句:=
  psal number(7,2) :=12.20;
  my_name emp.ename%type :='bb';--引用类型,此处的类型为emp表中ename的类型
  emp_rec emp%rowtype;--记录型变量,相当于emp表的一整行
    
begin

  select * into emp_rec from emp where ename='SCOTT';--另一种赋值方式 into变量名

  dbms_output.put_line(varl);
  dbms_output.put_line(psal);
  dbms_output.put_line(my_name);
  dbms_output.put_line(emp_rec.ename||'he money is'||emp_rec.sal);
  
end;

 

3>if语句

--if语句
--accept num prompt '请输入一个数字';--接受键盘输入
       --num:是一个地址值,在该地址上保存了输入的值
declare 
  pnum number := 0;  

begin
  
  if pnum = 0 then dbms_output.put_line('is 0');
  elsif pnum = 10 then dbms_output.put_line('is 10');
  elsif pnum = 20 then dbms_output.put_line('is 20');
  else dbms_output.put_line('is 30');
  end if;--结束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>游标(光标)

相当于java中的ResultSet(返回结果集),PL/SQL中用到多条记录时使用可以返回多条数据

 

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

declare 
   --定义光标(游标)
   cursor cemp is select ename,sal from emp;
   pename emp.ename%type;
   psal   emp.sal%type;
begin
  --打开
  open cemp;

  loop
       --取当前记录
       fetch cemp into pename,psal;
       --exit when 没有取到记录;
       exit when cemp%notfound;
       
       dbms_output.put_line(pename||'的薪水是'||psal);
  end loop;

  --关闭
  close cemp;
end;

带参数光标

-- 查询某个部门的员工姓名
declare 
   --形参
   cursor cemp(dno number) is select ename from emp where deptno=dno;
   pename emp.ename%type;
begin
   --实参
   open cemp(20);
   loop
        fetch cemp into pename;
        exit when cemp%notfound;
        
        dbms_output.put_line(pename);

   end loop;
   close cemp;
end;
/

 

6>例外(异常)

异常时程序设计语言提供的一种功能,用来增强程序的健壮性和容错性

异常:系统异常,自定义异常

常见异常类型:no_data_found(没有找到数据),too_many_rows(select ..into匹配多个行),zero_divide(被零除),value_error (算术或者转换错误)timeout_on_resource(等待资源时超时)

declare
   pnum number;
begin
  pnum := 1/0;
  
exception
  when zero_divide then dbms_output.put_line('1:0不能做分母');
                        dbms_output.put_line('2:0不能做分母');
  when value_error then dbms_output.put_line('算术或者转换错误');                      
  when others then dbms_output.put_line('其他例外');
end;
/

 

7>存储过程Procedure

是在大型数据库中一组为了完成特定功能的SQL语句,经编译后存储在数据库中,存储过程也就是一段特定的PL/SQL代码

create or replace procedure sayhelloworld
as
   --说明部分
begin
   dbms_output.put_line('Hello World');
end;
/

 

8>存储函数Function

与存储过程类似,但存储函数具有一个返回值,在返回多个值时使用存储过程(使用输出函数out返回),返回一个值时使用存储函数

注意:一般来讲过程和函数的区别在于函数可以有一个返回值;而过程没有返回值。但是过程和函数都可以通过out指定一个或多个输出参数从而实现返回多个值

--查询某个员工的年收入
create or replace function queryEmpIncome(eno in number) 
return number
is
       --定义变量保存月薪和奖金
       psal emp.sal%type;
       pcomm emp.comm%type;
begin
       --得到月薪和奖金
       select sal,comm into psal,pcomm from emp where empno=eno; 
       
       --返回年收入
       return psal*12+nvl(pcomm,0);
end queryEmpIncome;
/

带参数的存储函数

--给指定的员工涨100,并且打印涨前和涨后的薪水
create or replace procedure raiseSalary(eno in number)
is
       --定义变量保存涨前的薪水
       psal emp.sal%type;
begin
       --得到涨前的薪水
       select sal into psal from emp where empno=eno;
       
       --涨100
       update emp set sal=sal+100 where empno=eno;
       
       --不用commit,谁调用谁commit 
       dbms_output.put_line('涨前:'||psal||'   涨后:'||(psal+100));
end raiseSalary;
/

猜你喜欢

转载自blog.csdn.net/langao_q/article/details/82979752