oracle
创建公有的 同义词create public synonym nemp for scott.emp;
游标:针对多行数据,提供单行数据处理 ResultSetString
1.ResultSet rs=stmt.executeQuery("select * from emp");
rs.next();
rs.getString(1);
由一个指针和这个指针所指向的内存空间组成
通过移动指针实现对结果集遍历
sqlserver:自动提交 update insert delet commit;
oracle :隐式事务 upadate 自动开启一个事务 commit/rollback
2.静态cursor
显示游标:定义一个cursor开始与结束
隐式: 在oracle 做update insert delete 都隐式游标的方式在执行ref游标
a.游标 属性
%isopen cursor_name%isopen//这个游标是否打开
%found 游标是否取到数据 查询到为true
%notfound 游标没有取到数据 没查到为true
显示游标:显示的定义一个游标 4个步骤:
1.申声明一个游标
iemp emp%rowtype;//iemp可以保存emp表中的一条记录
游标名
cursor cur_emp is select * from emp; 指向一个结果集
2.打开一个游标
open cur_emp;
3.取数
循环游标
loop
fetch cur_mep into 变量 iemp //指针向下移动一
exit when cur_emp%notfound;//判断游标是否取到值;
dbms_output.put_line('XXXX');
end loop;
4.关闭游标
close cur_emp;
for循环游标
静态:在声明游标就定义其关联的查询语句
ref 在定义游标变量,不关联select
在程序执行的过程中,可以动态的关联的select语句
1.定义一个ref游标类型
ref_cursor_type是一个游标类
强类型:变量只能返回固定类型
type ref_cursor_type is ref cursor [return emp%rowtype];
弱类型:变量可以引用不同的结果集
type ref_cursor_type is ref cursor
变量名 数据类型
rs ref_cursor_type;
2.打开游标
open rs for select * from emp;
loop
fetch rs into emp
...
end loop;
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;
|