Oracle存储过程、触发器

[size=x-large][b]1、存储过程[/b][/size]

创建一个简单的存储过程:接收两个参数,插入到test_table表中
create or replace procedure proctest (a in VARCHAR2, b in VARCHAR2)
is
begin
insert into test_table (test_id, test_content) values (a, b);
end proctest;


创建一个带输出的存储过程:接收参数a,输出参数b
create or replace procedure proctest2 (a in VARCHAR2, b out VARCHAR2)
is
begin
insert into test_table(test_id) values (a);
select test_id into b from test_table where test_id=a;
end proctest2;


创建一个存储过程,使用For循环遍历游标:
create or replace procedure proc_test is
begin
Declare
Cursor myCur is select * from emp;
Begin
for varA in myCur
loop
update USER set user_type=varA.emp_type where user_code=varA.emp_code;
end loop;
End;
commit;
Exception
WHEN OTHERS
Then
rollback;
end proc_test;

--执行存储过程:
exec proc_test;
--删除存储过程:
DROP PROCEDURE proc_test;


当表名、字段名、数据库名作为存储过程的参数时,需要用动态sql,再用execute immediate来运行。
动态sql是一个字符串,用连接符||连接sql字符串(动态sql中的连接符||相当于java字符串的连接符+)。

java调用存储过程范例,见附件

存储过程一些资料:
http://www.cnblogs.com/sumsen/archive/2012/05/30/2525431.html
http://www.bitscn.com/pdb/oracle/200806/144607.html
http://www.cnblogs.com/hero4china/articles/base_rule_oracle_procedure.html
http://www.cnblogs.com/kkcheng/archive/2010/03/19/1689672.html
http://www.itpub.net/thread-1132571-1-1.html
http://tech.163.com/05/0707/09/1O24HIJ400091589.html
http://www.itpub.net/thread-1384981-1-1.html
http://www.cnblogs.com/superjt/archive/2013/06/09/3129403.html

java调用oracle存储过程 返回多个结果集:
http://blog.csdn.net/jzy23682891/article/details/10019721


[size=x-large][b]2、触发器[/b][/size]

oracle中创建触发器时加for each row时,是[b]行级触发器[/b],否则就是[b]语句级触发器[/b]。

行级(for each row)选项决定了触发器是行级还是语句级,如规定了for each row ,则触发器每影响表一行,就执行一次;否则,触发器仅仅在相应的语句被执行时触发一次,而不是针对每行。

行级触发器对DML语句影响的每个行执行一次,语句级触发器对每个DML语句执行一次。比如,如果在表中插入的数据为500行,那么这个表上的语句级触发器只执行一次,而行级触发器就要执行500次。语句触发器都只会针对指定语句激活一次。比如一条update语句,无论update了多少行,也只会调用一次update语句触发器。

对于行级触发器而言,当一个DML语句操作影响到表中的多行记录时,行级触发器会针对每一行执行一次。
在行级触发器中有一个特点,当创建before行级触发器时,可以在触发器中引用受到影响的行值,甚至可以在触发器中设置它们。
只有在行触发器中才能使用:new和:old来访问列的新值和旧值,语句级触发器不可以。

下面将在表上创建一个行级触发器,并使用序列生成主键值,这是非常常见的for each row触发器的用途。
create or replace trigger "trig_test"
before
insert on test
for each row
declare
-- local variables here
begin
select test_seq.nextval into :new.id from dual;
end trig_test ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值