oracle从入门到精通(7)
1 锁
2 事务
3 PL/SQL编程
4 存储过程
--------------------------------------------------------
锁的两种分类方式:
按照的锁的范围可分为: 表级行与行级锁
表级锁:-- 若对表加了表级锁,在锁没有解开之前,其他用户不允许修改表中的任何信息
行级锁: --- 若对表加了行级锁,除了正在操作的这一条数据,不允许被其他用户修改,其他数据允许被其他用户修改
表级锁的语法:
lock table 表名 in exclusive mode;
行级锁的语法:
lock table 表名 in row exclusive mode;
----------------------------------------------------------------------------------------
按照锁的力度,可分为: 共享锁与排它锁
排它锁: 如果对表加了排它锁,其他用户就不能再对表加任何锁,除非排它锁被解开
lock table 表名 in exclusive mode; --- 排它锁
-----------------------------------------------------------------
共享锁 :如果用户对表加了共享锁,其他用户也可以对表加锁,但是只能加:--共享锁
如果用户对表加了共享锁,就代表这张表对于其他用户而言,是只读的,只有当锁被解开,才能对表进行修改
--共享锁的语法:
lock table 表名 in share mode;
---对表加锁的目的 为了保证数据的准确性
drop table bank;
create table bank
(
accecssName varchar2(20),--帐户名称
amount number(11) check (amount>=10) --帐户余额
)
insert into bank values('张三',10);
insert into bank values('李四',201);
select * from bank;
update bank set amount=amount+200 where accecssName='张三';
update bank set amount=amount-200 where accecssName='李四';
commit;---是用于提交的命令;
--用于进行数据的回滚,之前没有提交的操作,全部都会回滚
rollback;
---事务:在数据库中,执行的一批sql语句,要么都要成功,如果有一条失败,整个操作要全部失败
如果一批语句全部操作成功,才commit;如果有一条语句操作失败,就应该全部回滚 rollback;
drop table bank;
create table bank
(
accecssName varchar2(20),--帐户名称
amount number(11) check (amount>=10) --帐户余额
)
insert into bank values('张三',10);
insert into bank values('李四',201);
savepoint one;
update bank set amount=amount+200 where accecssName='张三';
update bank set amount=amount-200 where accecssName='李四';
--未提交的数据,全部回滚
rollback;
--回滚所有没有保存的数据
rollback to one;
select * from bank;
--提交所有数据
commit;
commit;--提交数据
rollback;---回滚数据
savepoint 名称;--设置保存点(用于回滚到指定处)
rollback to 保存点;
回滚的时候:所有没有提交的数据,都会被回滚
回滚到某一保存点,只会回滚指定数据
----------------------------------------------
PL/SQL
什么是PL/SQL语句;
PL/SQL Procedure Language / Structured Query Language
PL/SQL: 过程化语言/结构化查询语言
这一类型的语句,主要用于编写: 函数、存储过程、触发器、游标
-----------------------------------------------------------------------
PL/SQL语句的基本语法:
declare
--此处用于声明各种类型的变量、常量
begin
--此处用于编写各种PS/SQL语句
end;
------------------------------------------------------------------------
如果语句不需要声明变量、常量,可以省略掉declare
示列:
begin
dbms_output.put('这是第一条测试语句');
dbms_output.put('这是第二条测试语句');
dbms_output.put_line('');
end;
dbms_output.put_line();--用于输入一句字符,并且换行
dbms_output.put('这是第一条测试语句'); --输入一条语句,但是不换行
---示例2
declare
amount number(20);
begin
amount:=&请输入要循环的次数;
for i in 1..amount
loop
dbms_output.put_line(i);
end loop;
end;
--
示例:
declare
k number(10):=1;
begin
while(k<10)
loop
dbms_output.put_line(k);
k:=k+1;
end loop;
end;
---
示例: ---if ...else 结构
declare
score number(11) :=98;
begin
if(score>=90)
then dbms_output.put_line('优秀');
else
dbms_output.put_line('要继续努力');
end if;
end;
-- 类似于switch的结构
declare
score number:=28;
begin
case
when score>=90 then dbms_output.put_line('优秀');
when score>=80 then dbms_output.put_line('良好');
when score>=60 then dbms_output.put_line('及格');
when score<50 then dbms_output.put_line('不及格');
end case;
end;
------------------------------
select * from infs;
truncate table infs;
create sequence infs_seq;
------------------------------
begin
for i in 3..10
loop
insert into infs values(infs_seq.nextval,'name'||i);
end loop;
commit;
end;
-------
示例:
declare
i number(11);
j number(11);
begin
for i in 1..10
loop
for j in 1..i
loop
dbms_output.put('*');
end loop;
dbms_output.put_line('');
end loop;
end;
declare
i number(11);
j number(11);
k number(11);
begin
for i in 1..10
loop
for j in 1..10-i
loop
dbms_output.put(' ');
end loop;
for k in 1..2*i-1
loop
dbms_output.put('*');
end loop;
dbms_output.put_line('');
end loop;
end;
select * from infs;
--------------------------------
begin
-- update infs set name='bruce' where id=10;
delete from infs where id=17;
commit;
end;
-----------------------------------PL/SQL语句中的查询
declare
username varchar2(20);
mid number(10);
begin
mid:=&请输入要查询的编号;
select name into username from infs where id=mid;
dbms_output.put_line('查询的结果是:'||username);
end;
begin
-----------------------------------------
存储过程: 提前编写好一些要执行的命令,存在数据库中并不运行,当我们调用这些存储过程的时候,存在于数据库中
的这些语句,就会马上运行
-------
存储过程的基本语法:
create or replace procedure 存储过程名称
as
begin
--此处用于写各种存储过程语句;
end;
---------------------------------------------------------------
示例:
create or replace procedure my_pc
as
begin
dbms_output.put_line('ok');
end;
---调用存储过程
begin
my_pc();
end;
------------------------------------------------------------------
drop sequence inf_seq;
create sequence inf_seq;
create table inf
(
id number primary key,
name varchar2(20),
age number(11)
)
create or replace procedure inf_pc
as
begin
for i in 1..100
loop
insert into inf values(inf_seq.nextval,'name'||i,23);
end loop;
commit;
end;
select * from inf;
--调用存储过程 --第一种调用方式
begin
inf_pc();
end;
truncate table inf;
-------存储过程分为:
不带参数的存储过程
带参数的存储过程:
输入参数
输出参数
输入输出参数