close rs;
1.过程 相当于创建一个构造方法
a.create [or replace 会替换存在的过程 ] procedure procedure_name(参数 no varchar2(20),...);
as|is 声明过程内部变量
begin
insert into emp values(参数);
end;
show error 找错
--相当于调用构造方法 有参数 赋值
调用:execute procedure_name(参数=>实参 no=>'1' ,。。。);可以直接按照位置赋值或者name=>'rongjie';
参数模式:in 输入 默认为输入状态,只接受值 不能过程内部赋值
out 输出 不接受输入的值,内部要赋值 实参为变量;
in out 既接受又返回 实参为变量
创建程序包
create or replace package pk_emp
as
name varchar2(20)
procedure getname(id int,name out varchar2);
funvtion getsal(id int) return int;
cursor cur_emp return emp%rowtype;
type ref_cur_type is rsf cursor;
end;
/
创建过程 返回结果集
create or replace procedure getEmp(rs out pk_emp.ref_cur_type)
as
begin
open rs for select * from emp;
end;
plsql调用
declare
cur pk_emp.ref_cur_type;
iemp emp%rowtype;
begin
getEmp(cur);
loop
fetch cur into iemp;
exit when cur%notfound;
dbms_output.put_line(iemp.ename);
end loop;
close cur;
end;/
1.什么叫触发器
a.特殊的存储过程[一组预编译的PLSQL块] erecute proc_name(xx)
b.操作触发后,由系统自动调用
c.触发针对的TABLE VIEW DATABASE SCHEMA[方案]。。。
d.对表的操作 insert update delete
2.类型
before|after 之前 emp insert trigger 一般用来对表操作
instead of 替代 view 一般用在视图上
before 检查数据的合法性 [报错]
after 完成完整性 sale表 增加一条 减库存
3.级别
语句级 不管影响多少行 只执行一次
行级 emp表中的update trigger 影响多少行 触发器就执行多少次 每一行执行一次
4.语法
create or replace trigger trigger_name
before|after insert on table_name
declare
begin
.....
end
//创建语句级触发器 修改操作时 触发
create or replace trigger tri_bu_uuseer
before update on uuser
declare
begin
dbms_output.put_line('update uuser');
end;
为序列赋值
:new.id=myseq.nextval;
//创建行级触发器 修改操作时 触发
create or replace trigger tri_bu_uuseer
before update on uuser
for each row --行级操作 循环 不加 就是语句级
declare
begin
dbms_output.put_line('before update uuser');
end;
在行级trigger中有两个变量 取 trigger所关联表的%rowtype
new与old可以保存表中的一条数据
[new 与old 只能在行级trigger中所有]
当用户对象trigger所关联的表操作,系统将新数据存入在new中 老数据存入在old中
create or replace trigger tri_b_test
before insert or update on t_test --增加修改操作都触发
for each row --行级操作 循环
declare
iafe int;
begin
iage:=:new.age;
if iage<16 or iage>66 then
raise_application_error(-20001,'年龄不符合要求');
end if;
end
create or replace trigger tri_b_test
before insert or delete on t_test --增加删除操作都触发
for each row
declare
iage int;
begin
if inserting then--如果增加为真 执行增加
iage:=:new.age;--取NEW里面的值
if iage<16 or iage>66 then
raise_application_error(-20001,'年龄不符合要求');
end if;
end if;
if deleting then
if :old.name='admin' then
raise_application_error(-20002,'不能删除管理员');
end if;
end if;
end
禁用触发器 alert table t_test表名 enable all triggers;
alter trigger TRIGGER_B_I_TEST 触发器名字 DISABLE;
***********
create or replace trigger tri_uuser --创建触发器
before insert or update or delete on uuser --执行这些操作触发
for each row --循环 行级
declare
iage int; --声明年龄参数
begin
if inserting then --如果是插入执行以下操作
iage:=:new.age;
if iage<16 or iage>66 then
raise_application_error(-20001,'年龄不符合要求'); --报错
end if;
end if;
end;
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |