一、语句分类
DML(Date Manipulation Language)数据操纵语句,查询、修改表中的数据
SELECT 查询数据库表或视图数据 INSERT INTO 新增数据至表或视图 DELETE 删除表或视图中的数据 UPDATE 修改表或视图中的数据
注意:DML语句不会自动提交事务,所以如果是增删改操作的话需要在后面加入commit才能提交事务
DDL(Date Definition Language)数据定义语句,新建、删除、修改表
CREATE TABLE 创建表 ALTER TABLE 对表名、字段名、字段类型进行修改 DROP TABLE 删除表
注意:DDL语句会自动提交事务,所以DML语句可以进行回滚,但DDL不能进行回滚
DCL(Data Control Language)数据控制语句,用于用户权限的授予和收回
GRANT 给用户授予权限 REVOKE 撤销用户权限
TCL(Transaction Control Language)事务控制语句,维护数据的一致性
COMMIT 提交已经进行的数据库改变 ROLLBACK 回滚已经进行的数据库改变 SAVEPOINT 在事务上下文中设置保存点,方便定点回滚到该点
二、语句具体操作
1.DDL
--简单建表语句
create table test_a
(one varchar2(50),two varchar2(50),three number(10));
--一般建表语句(包含主键,空值,非空值,指定表空间)
create table test
(
id number(11) not null primary key,
one varchar2(50) not null,
two varchar2(50) default 'two',
three varchar2(50),
four number(11)
)
tablespace users
--修改表名
alter table test_a rename to test;
--修改字段名字
alter table test rename column tow to two;
--修改多个字段名字
alter table test rename column (two_new to two,three to three_new);
--修改字段类型
alter table test modify three number(11);
--修改多个字段类型
alter table test modify (three varchar2(50),four number(11));
--增加字段
alter table test add (one varchar2(50),five varchar2(50));
alter table test add four varchar2(50);
--删除字段
alter table test drop column one;
alter table test drop (one,five);
--删除表
drop table test;
2.DML
--插入所有数据
insert into test values('a','b',10,'c','d');
--插入部分数据
insert into test(two,four) values(1,2);
--删除数据
delete test where three=2
--更新数据
update test set one='one' where three=10;
--查询数据
select three, count(*)
from test
where one = 'a'
group by three
order by three desc;
3.DCL
--授予DBA权限给用户
grant dba to test
--撤销用户的DBA权限
revoke dba from test
--保存这个事务点
savepoint a
--回滚到保存过的事务点
rollback to a
注意:回滚只能对未提交的操作,如果已经提交过的操作会清除保存的事务点,所以如果是对DDL操作和授权、撤销权限等操作设置事务点事没有意义的
4.TCL
--提交事务
commit
--回滚所有事务
rollback
--回滚到某个事务点,该事务点后的操作将被清除
rollback a
三、PL/SQL
PL/SQL(Precudual Language/SQL)是一种构建在SQL之上的过程化语言,也就是说可以在编写的时候可以引进一些流程控制,比如if,case,while,for等。
基本结构如下:
DECLARE
--声明部分,可选
BEGIN
--执行部分,必选
EXCEPTION
--异常处理部分,可选
END;
/
1.数据类型
普通的varchar2,number都有,另有三个特殊的数据类型
- %TYPE 根据选定字段确定数据类型
- RECORD 存储选定的一行字段,需要先定义记录的字段成员
- %ROWTYPE 结合上面两个的特定,可以根据选定表确定各自字段的数据类型
2.常量与变量的定义
【变量名】【变量类型】【变量长度:=初始值】
【常量名】constant【常量类型】:=常量值
3.流程控制
条件判断
if condition then
语句;
elseif condition then
语句;
end if;
case a
when A then
语句;
when B then
语句;
else
语句;
end case;
循环
loop
语句;
exit when condition;
end loop;
while condition loop
语句;
end loop;
for i in I loop
语句;
end loop;
4.游标
显示游标需要在声明中声明游标,它的主要步骤包括声明游标,打开游标,读取游标和关闭游标4个步骤
declare
cursor c is select a(var_a in varchar2='A') from dual;
i varchar2;
begin
open c('A');
fetch c into i;
close c;
end;
/
游标的属性:
%found 布尔型,如果sql语句影响到了至少一行数据,那么就返回true;
%notfound 布尔型,遇上面的相反;
%rowcount 数字属性,返回SQL语句影响的行数
%isopen 布尔型,游标打开返回ture,关闭则返回false
而隐示游标是在BEGIN的执行语句时oracle自动创建的一个游标,如果使用它的属性,需要在前面加上sql
通过for循环不需要进行打开、关闭游标等操作也可以访问游标数据
for i in cursor_c loop
sql;
end loop
5.异常
常用的有
NO_DATA_FOUND
上面介绍的这些都是普通PL/SQL,都是匿名的,还有几种命名的块,其中包括过程、函数、触发器
四、存储过程
create or replace procedure name(var1 in type,var2 out type,var3 in out type) is
i int:=1;
begin
执行语句;
end name;
/
存储过程的特点就是可以传递参数,一共有三种参数传递方式
in 只可以传入参数
out 只可以传出参数,并且在调用过程的时候要预先定义变量接受传出的参数
in out 在程序开始的时候传入参数,结束的时候传出参数
五、函数
create or replace function name (var1 type) return type is
i int:=1
begin
函数
return ..
end;
/
函数也可以接受参数,但是与存储过程不同的是它必须定义返回的类型和在执行语句中返回值,所以同样的在调用函数的时候需要预先定义变量接收函数的返回值
六、触发器
- 语句级触发器:针对一条DML语句而引起的触发器,也就说无论语句影响了多少行,触发器值执行一次
- 行级触发器:DML语句的每一行都会引起的触发器执行一次
- 替换触发器:instead of,关键字与上面两个不同,而且它是定义在视图上的,目的是对视图中的各个基表记性操作
- 用户事件触发器:因为DDL或登录、退出等操作引起的触发器
七、程序包
程序包包括两部分:规范,包体
规范
create or replace package package_name is
各部分的声明
end package_name;
包体就是各部分的内容