--sql window中写存储过程(本例对dept_copy表的操作)
create
or
replace
procedure
p_update_dept(
l_remarker
in
number,
--0增,1删,2改
l_deptno
in
number,
l_dname
in
varchar2,
l_loc
in
varchar2,
l_result
out
varchar2
--传出参数
)
is
begin
l_result :=
'0000'
;
if l_remarker = 0
then
--0 增加
insert
into
dept_copy
values
(l_deptno,l_dname,l_loc);
elsif l_remarker = 1
then
--1删除
delete
from
dept_copy p
where
p.deptno = l_deptno;
elsif l_remarker = 2
then
--2修改
update
dept_copy p
set
p.loc = l_loc,p.dname = l_dname
where
p.deptno = l_deptno;
end
if;
commit
;
exception
when
others
then
rollback
;
l_result:=
'1111'
;
end
;
-----------------------------------------------
--调用存储过程(主要是java中调用)
-- test window中调用存储过程(可在output选项卡中看到执行返回的结果,对哪个表操作,看哪个表也能看出来。)
declare
-- Local variables here
l_result varchar2(4);
--返回值的长度是好写上
begin
-- Test statements here
p_update_dept(0,99,
'ACCOUNTING'
,
'NEW YORK'
,l_result);
--p_update_dept为存过程名称,括号里为存储过程定义的参数。
dbms_output.put_line(l_result);
end
;
========================触发器小例子===================
--行级触发器,一个表中数据发生变化时同时修改另一个表中对应字段的值
create
or
replace
trigger
trig2
after
update
on
dept_copy
for
each row
--针对每一行
begin
update
emp_copy e
set
e.deptno = :NEW.deptno
where
e.deptno = :old.deptno;
end
;
/*当表dept_copy的deptno字段发生变化,修改对应表emp_copy的deptno字段的值
*/
-- 当执行更新下表时触发器被触发
update
dept_copy d
set
d.deptno = 99
where
d.deptno = 10;
---------------------------------------------------
---语句级触发器(用的较少)
create
or
replace
trigger
t_emp_copy
before
insert
or
delete
or
update
on
emp_copy
begin
if inserting
then
insert
into
emp_copy_log
values
(seq_emp_copy_log.nextval,
'insert'
,
user
, sysdate);
elsif deleting
then
insert
into
emp_copy_log
values
(seq_emp_copy_log.nextval,
'delete'
,
user
, sysdate);
elsif updating
then
insert
into
emp_copy_log
values
(seq_emp_copy_log.nextval,
'update'
,
user
, sysdate);
end
if;
end
;
当然这只是些小例子,真正开发中用到的比这难多了,不过把原理搞清楚,都不难