创建一个触发器:
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;