PL/SQL_异常

 --第一个PL_SQL程序

set serveroutput on;

declare
v_s1 varchar2(10) := 'HelloWorld';
v_i number := 1;

begin
  dbms_output.put_line(v_s1);
  dbms_output.put_line(v_i);
end;
/


/*

  在PL_SQL中定义变量,常量,然后给变量,常量赋值
  最后在控制台输出常量和变量的值
  最后在控制台输出常量和变量的值

*/
declare
v_i number := 1;
c_c constant number := 10; --声明常量

begin
  v_i := 20;
  dbms_output.put_line('i的值是:' || v_i);
end;
/


/*
  定义变量v_name,数据类型为varchar2(50),
  通过查询员工表,将员工编号为1001的员工的姓名,
  使用select into 给v_name赋值,并输出变量的值

*/
declare
v_name varchar2(20) := '小张';
v_name emp.ename%type;  --%type:表示获取属性的类型

begin
  --查询1001的姓名给v_name赋值
  select ename into v_name from emp where empno =7782;
  dbms_output.put_line(v_name);
end;
/


/*
  使用PL_SQL程序向部门表插入一条记录,然后给部门编号为10的员工工资涨1000块钱
*/
begin
  --insert into dept values(50,'文艺部','三楼');
  update emp set sal=sal+1000 where empno=7369;
  --commit;
  end;


--查询EMP表中是否存在记录,存在则显示记录数,否则显示没有记录
declare
  v_count number;
begin
  select count(empno) into v_count from emp;
  if v_count>0 then
    dbms_output.put_line('记录数:'||v_count);
    else
       dbms_output.put_line('没有记录');
       end if; 
  end;


/*
  如果“SCOTT”雇员的工资低于 2000 ,就给该员工工资增加 10% 。      -------------作业1
  如果该雇员的工资低于 3000 ,就给该员工工资增加 5% 。否则增加 1 %。

*/
 select sal from emp where ename='SCOTT';
declare
v_sal emp.sal%type;
begin
  select sal into v_sal from emp where ename='SCOTT';
  
  if v_sal<2000 then
    update emp set sal=v_sal*1.1 where ename='SCOTT';
    dbms_output.put_line('增加10%'||v_sal);
    elsif v_sal<3000 then
       update emp set sal=v_sal*1.05 where ename='SCOTT';
       dbms_output.put_line('增加5%');
       else
         update emp set sal=v_sal*1.01 where ename='SCOTT';
       end if; 
       --COMMIT;
  end;
  
  
  --方法2
   select sal from emp where ename='SCOTT';
declare
v_sal emp.sal%type;
begin
  select sal into v_sal from emp where ename='SCOTT';
  
  if v_sal<2000 then
    update emp set sal=v_sal*1.1 where ename='SCOTT';
    dbms_output.put_line('增加10%'||v_sal);
    elsif v_sal<3000 then
       update emp set sal=v_sal*1.05 where ename='SCOTT';
       dbms_output.put_line('增加5%');
       else
         update emp set sal=v_sal*1.01 where ename='SCOTT';
       end if; 
       --COMMIT;

  end;

----------------------------------------------------------------------------------------------------------------------


declare
  v_count number;
begin
  select count(empno) into v_count from emp;
  case
    when v_count>0 then
    dbms_output.put_line('记录数:'||v_count);
    else
       dbms_output.put_line('没有记录');
       end case; 

  end;


--使用无条件循环loop打印1001-1005员工的姓名
declare
  v_num number := 1001;
  v_name emp.ename%type;
begin
  loop
    if v_num>1005 then
      exit;   --不满足条件时,退出循环
      end if;
      select ename into v_name from emp where empno=v_num;
       dbms_output.put_line('姓名:'||v_name);
      v_num :=v_num + 1;
      
    end loop;
end;


--使用无条件循环向部门表中插入10万条记录,编号从100开始
declare
  v_num dept.deptno%type := 60;
begin
  loop
    if v_num>71 then
      exit;   --不满足条件时,退出循环
      end if;
      
      insert into dept values(v_num ,'文艺部','三楼');
     v_num := v_num + 1;
      
    end loop;
end;


/*
    使用while循环向部门表中插入10万条记录,编号从100开始
*/
declare
    v_num number := 100;
begin
  while v_num<100100 loop
     insert into dept values(v_num ,'文艺部','三楼');
     v_num := v_num+1;
    end loop;
    commit;
end;


--使用for循环将部门表中编号从100到100100的记录删除
declare
    v_num number;
begin
  for v_num in 61 .. 71 loop
    delete from dept where deptno=v_num;
  end loop;
end;

/*

  找出员工表中工资第二大的员工               ---------------------------作业2

*/                                   


select * from emp order by sal desc;

select rownum as rn,e.* from emp e where sal = (
       select max(sal) from emp where sal<>(

              select max(sal) from emp));

-----------------------------------------------------------------------------------------------------------------


declare
--v_empno emp.empno%type;
v_ename emp.ename%type;
v_maxsal emp.sal%type;
v_msal emp.sal%type;
v_count number;  
v_i number := 1;
v_rn number;
begin
  select max(sal) into v_maxsal from emp;
  dbms_output.put_line('最大成绩:'||v_maxsal);
  select max(sal) into v_msal from emp where sal <> v_maxsal;
   dbms_output.put_line('次大成绩:'||v_msal);
   select count(*) into v_count from emp where sal = v_msal;
   
   for v_i in 1 .. v_count loop
     --PL_SQL与SQL语句的嵌套
     select ename into v_ename  from(select rownum as rn, ename from emp where sal = v_msal) where rn = v_i;  
     dbms_output.put_line('姓名'||v_ename);
     end loop;
end;


-----------方法2
declare
v_empno emp.empno%type;
v_ename emp.ename%type;
v_max emp.sal%type;
v_second emp.sal%type;
v_count number;  
v_i number;
v_temple number;
begin
  select count(*) from v_count from emp;
  v_max:=0;
  v_second:=0;
  for v_i in 1 .. v_count loop
    select sal into v_tempsal from (select rownum as rw,e.* from emp e) where rw = v_i;
    if v_tempsal > v_max then
      v_second := v_max;
      v_max :=v_temple;
      elsif v_templ
end;
  


--------------------------------------------------------------
declare
v_i number := 1;
begin
  if v_i = 1 then
    dbms_output.put_line('aaaaaa'); --不能为空
    else
      dbms_output.put_line('bbbbbbb');
      end if;
end;

-------------------------------------------------- 异常------------------------------------------------------------------------



--向员工表插入1001记录,如果违反唯一约束添加,使用非预定义异常输出错误信息
declare
  --声明一个异常对象
  err_pk exception;
  --通知编译器使用exception_init()将异常对象与oracle错误代码绑定
  pragma exception_init(err_pk,-00001);
  
begin
    insert into emp(empno,ename) values(1111,'2222');
    exception
      when err_pk then
        dbms_output.put_line('插入重复记录,请重新插入');
    commit;
end;


---自定义异常

--查询‘SCOTT’的工资,如果工资小于10000,使用自定义异常,输出异常信息
declare
    err_sal exception; --声明异常对象
    v_sal number;
begin
  select sal into v_sal from emp where ename = 'SCOTT';
  if v_sal<10000 then
    raise err_sal;  --抛出异常对象
    end if;
    exception
      when err_sal then
        dbms_output.put_line('工资太低了,该涨工资了'); 
end;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值