pl/sql块的基本语法

创建一个触发器:

 create or replace trigger trig
   after insert--触发器时间
   on emp--在哪一个表上创建的触发器,触发对象
   for each row--说明创建的是行级别的触发器
   begin
   dbms_output.put_line('触发器执行了');
   end;
我们在sql窗口测试结果
SQL> insert into emp(empno) values('9998');
 
触发器执行了
 
1 row inserted
删除一个触发器:

SQL> drop trigger trig;
 
Trigger dropped
---下面我们创建一个存储的过程:
create or replace procedure output_date is
   begin
   dbms_output.put_line(sysdate);
   end output_date;
   /
 
Procedure created
 
SQL> exec output_date();
 
28-12月-16
 
PL/SQL procedure successfully completed
 
创建存储过程的语法:

create or replace procedure 存储过程名

is|as

begin

//执行语句

end 存储过程名;

--创建一个带有参数的存储过程:

create or replace procedure get_Ename(v_empno in emp.empno%type,v_ename out emp.ename%type)
as
begin
  select ename into v_ename from emp where empno = v_empno; --变量赋值 
exception
when no_data_found then 
raise_application_error(-20001,'ID不存在!');
end get_Ename;
--调用带有参数的存储过程

declare
name emp.ename%type;
begin
get_Ename(7369,name);
dbms_output.put_line(name);
end;
pl/sql异常处理:,

自己创建异常

DECLARE
   exception_name EXCEPTION;
BEGIN
   IF condition THEN
      RAISE exception_name;
   END IF;
EXCEPTION
   WHEN exception_name THEN
   statement;
END;
---异常处理的例子
/*

创建一个存储过程,实现是通过输入员工的编号查看员工的姓名,工资,奖金
1.1.如果员工是不存在的进行异常处理
1.2如果说工资高于4000进行异常处理
1.3如果奖金没有或者为0进行异常提示处理

*/

declare
SALMORE EXCEPTION;--声明异常
ZEROCOMM exception;--声明异常
num emp.empno%type;
v_empno emp.empno%type;
v_row emp%rowtype;
begin 
v_empno:=#
select * into v_row from emp where empno=v_empno;
if v_row.sal<4000 and v_row.comm!=0 then
dbms_output.put_line('姓名'||v_row.ename||'  '||'工资:'||v_row.sal||'  '||'奖金'||v_row.comm);
elsif v_row.sal>4000 then
  raise SALMORE;--在怎样的情况下生成异常
  else
  raise ZEROCOMM; --生成异常
 end if;
exception
 when no_data_found then
 dbms_output.put_line('该员工编号不存在');
 when SALMORE then--处理异常
 dbms_output.put_line('工资高于4000');
 when ZEROCOMM then--处理异常
 dbms_output.put_line('奖金为0');
end;
--循环loop的应用例子:

/*
对每个员工的的薪水进行判断,如果说该员工的薪水是高于其所在的部门的平均的水平,则将其薪水减去50元输出更新前后的薪水
 员工的姓名和所在部门的编号
*/
--5
 declare
 avg_sal number;--number变量类型
 v_deptno dept%rowtype;--rowtype变量类型
 v_sal emp%rowtype;
 cursor c_deptno--创建游标
 is
 select * from dept;
 cursor c_sal(emp_deptno emp.deptno%type)--创建带参数的游标
 is
 select * from emp where deptno=emp_deptno;
 begin
  open c_deptno;--打开游标
  loop
  exit when c_deptno%notfound;
  fetch c_deptno into v_deptno;--使用游标
  select nvl(avg(sal),0) into avg_sal from emp where deptno=v_deptno.deptno;--select语句给变量赋值
  open c_sal(v_deptno.deptno);
    loop
     exit when c_sal%notfound;
     fetch c_sal into v_sal;--fetch循环
     if v_sal.sal>avg_sal then--if判断
     dbms_output.put_line('员工姓名:'||v_sal.ename||'    '||'部门编号'||v_sal.deptno||'    '||
     '前薪水'||v_sal.sal||'    '||'后薪水'||trunc(v_sal.sal-50));
     else
      dbms_output.put_line('员工姓名:'||v_sal.ename||'    '||'部门编号'||v_sal.deptno||'    '||
     '前薪水'||v_sal.sal||'    '||'平均薪水'||trunc(avg_sal));
     end if;--结束if条件判断
    end loop;--结束循环
    close c_sal;
  end loop;
  close c_deptno;--关闭游标
 end;








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值