事务的特点(ACID)
A(atomacity)原子性:事务是一个整体,组成事务的处理语句形成一个逻辑单元,不能只执行其中的一部分。
C(consistency)一致性:事务执行前后数据库是一致的(数据库的完整约束)
I(isolation)隔离性:一个事务的处理不会影响另一个事务的处理,相互之间是隔离的
D(durability)持久性:事务处理的效果可以被永久性保存下来
注意:一个事务要吗成功要吗失败不会一部分成功一部分失败的
事务的结束
(1)显示结束:执行了commit或者rollback
(2)隐式提交:执行完了ddl或者dcl语句或者exit退出
(3)隐式回滚:系统异常关闭,死机断电
事务的四种隔离级别
为了避免并发是产生数据的脏读、不可重复读还有幻读的问题设置了数据库的四种隔离级别
readuncommited 允许事务读取未被其它事务提交的变更的数据,此隔离级别上述四种问题均会出现
readcommited 只允许事务读取被其它事务提交的变更的数据,此隔离级别可以避免脏读但还会出现其它三种问题
repeatable read 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其它是事务对这个字段进行更新,此
隔离级别可以避免脏读和不可重复读但其它两个问题依然存在
serializable 确保事务可以从一个表中读取到相同的行,在这个无持续期间,不允许其它事务对该表进行操作,此隔离级别可
以处于所有问题
存储过程
存储过程是值存储在数据库中提供所有用户程序调用的子程序,是存储在数据库中的一条sql语句
(1)存储过程的创建
create [or replace] procedure 存储过程名字[(参数列表)]
as
pl/sql子程序体
注意:参数列表中格式为:参数名 in(out) 参数类型,其中in为要输入的参数,out为存储过程要返回的
(2)存储过程的使用
set severoutput on;
exec 存储过程名([参数]);
或者用begin
存储过程名();
end;的pl/sql块
--无参数无返回值的过程
create or replace procedure nine
as
i number:=0;
begin
WHILE (i<=9) LOOP
DECLARE J NUMBER(10):=1;
BEGIN
WHILE (J<=i) LOOP
DBMS_OUTPUT.put(I||'*'||J||'='||(i*J)||' ');
J:=J+1;
END LOOP;
DBMS_OUTPUT.put_line('');
i:=i+1;
END;
END LOOP;
end;
--调用过程
set serveroutput on;
--execute nine();
begin
nine();
end;
--有参数无返回值的过程
create or replace procedure newnine
(num1 in number,num2 in number )
as
i number:=1;
begin
while i<=num1 loop
declare j number(10):=1;
begin
while j<=num2 loop
dbms_output.put(i||'*'||j||'='||j*i||' ');
j:=j+1;
end loop;
dbms_output.put_line(' ');
i:=i+1;
end;
end loop;
end;
--调用带参数的过程
set serveroutput on;
execute newnine(5,6);
--有参数有返回值的
create or replace procedure mycardid
(cardid out char)
as
num number(8);
myid char(9);
begin
select dbms_random.value(10000000,99999999) into num from dual;
select to_char(num) into myid from dual;
cardid:=substr(myid,1,4)||' '||substr(myid,5,4);
dbms_output.put_line(cardid);
end;
--调用过程
set serveroutput on;
declare
newmyid char(9);
begin
mycardid(newmyid);
end;
触发器
(1)触发器是是一个与表相关联的,存储的pl/sql程序,每当发出一个特定的数据操作语句(insert,update,delete)在指定的表上发出时,oracle都会自动的触发定义的语句序列
(2)触发器的类型:语句级的触发器在指定的操作语句之前或者之后执行一次,不管这条语句影响了多少行
行级触发器是在每一条语句之前或者之后执行时,都会触发。需要注意的是只有行级触
发器中可以使用:old和:new伪记录变量,识别值的状态
(3)触发器的创建
CREATE [or REPLACE] TRIGGER 触发器名
{BEFORE | AFTER}
{DELETE | INSERT | UPDATE [OF 列名]}
ON 表名
[FOR EACH ROW [WHEN(条件) ] ]
PLSQL 块
(4)触发语句与伪记录变量的值
触发语句 |
:old |
:new |
Insert |
将要插入的数据 |
|
Update |
更新以前该行的值 |
更新后的值 |
delete |
删除以前该行的值 |
drop sequence pid;
create sequence pid;
drop table student;
create table student(
id int primary key,
name varchar2(10) not null
);
insert into student values(pid.nextval,'张三');
create or replace trigger stuid
before insert on student
for each row
declare
myid int;
begin
select pid.nextval into myid from dual;
:new.id:=myid;
end;
insert into student(name) values('王五');
(5)查询触发器函数及过程
select * from user_triggers;
select * from user_source;
函数的创建
函数为一个命名的存储过程,可带参数,并返回一个计算值,函数和过程的结构类似但必须有一个return子句,用户返回函数值
(1)函数的创建过程
CREATE [OR REPLACE] FUNCTION 函数名(参数列表)
RETURN 函数值类型
AS
PLSQL子程序体;
(2)函数的调用
可以当作表达式来使用,出现表达式的地方均可以使用函数
例:select 函数名()from dual;
--函数的创建
create or replace function f1
return varchar2--注意必须有返回,且指定返回类型
as
begin
return 'hello';
end;
--函数的调用
select f1() from dual;
set serveroutput on;
begin
dbms_output.put_line(f1());
end;
--带参数的函数创建
create or replace function mrstr(str varchar2)
return varchar2
as
v_str varchar2(20);
begin
v_str:=regexp_replace(str,' ','');
return v_str;
end;
--带参数的函数的调用
select mrstr(' t r ')||'lzl' from dual;
set serveroutput on;
begin
dbms_output.put_line(mrstr(' za r')||'lzl');
end;
(3)如果只有一个返回值用存储函数,如果有多个返回过程就使用存储过程