oracle

来源:互联网 发布:sai绘画软件 mac 编辑:程序博客网 时间:2024/06/07 07:16
创建公有的 同义词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;






0 0