1.匿名代码块
declare
--申明变量的地方
begin
--sql语句的地方
end
2.变量
命名规范:使用大小驼峰命名,或者使用连字符
格式:变量名 数据类型 := 初始值
将查询结果赋值给变量:select 列明 into 变量名 from 表名 where confident
代码块中的select语句有且仅有一条查询结果,否则报错
3.可以将表中的字段的变量类型使用 字段名%type 引用出来给变量使用;表格所有列使用 表名%rowtype引用
4.自定义类型
type 自定义变量名 is record(
变量名1 数据类型1,
变量名2 数据类型2,
...
);
5.输入输出
输出:dbms_output.putline(输出类容)
输入:使用 :=&提示语句 来输入,字符串带引号
6.分支判断
if 判断条件 then
sql语句
elsif 判断条件 then
sql语句
....
else
sql语句
end if;
7.动态sql
execute immediate 'sql语句‘ into 输出的变量 using in 条件输入的变量名字
8.循环控制
1.for 循环
for i in 循环的数据(列表,查询结果等) loop
sql语句
end loop;
2.while循环
while 判断条件 loop
sql 语句
end loop;
3.loop循环
loop
sql语句
exit when 循环结束条件
sql语句
end loop;
循环控制语句
exit 跳出整个循环
continue 跳出本次循环
9.游标
静态游标
--声明游标
cursor 游标名字 is select语句
--打开游标
open 游标名字
--移动游标指针
fetch 游标名字 into 变量名
--关闭游标
close 游标名字
动态游标:先声明,但是不赋值,使用时再使用select语句赋值,动态游标除了声明方式和静态不一样,其他操作一致
type 动态游标类型 is ref cursor ;
上条语句定义的动态游标类型 游标名称;
隐形游标 sql
sql%found 判断有操作的数据返回true
sql%notfound 判断没有操作的数据返回true
sql%rowcount 返回影响的行数
sql%isopen 判断显性游标是否打开
10.异常处理
declare
--声明变量的地方
begin
--正常代码的地方
exception
when other then:
出现异常后执行的代码
end;
自定义异常:raise_application_error(异常编号(-20000到-20999),异常描述)
常见异常:
access_into_null(ora-06530):未定义对象
collection_not_found(ora-06592):集合元素未初始化
dup_val_on_index(ora-00001):唯一索引上有重复的值
too_many_rows(ora-01422):select into时结果超过一行
zero_divide(ora-01476):除数为0
11.存储过程
是一个由名称的代码块,存储过程可以在以后被反复的调用
使用存储过程的场景:
1.为了减少表格对服务器的访问次数,减少sql对硬盘的读写次数,将经常使用的sql写到存储过程中
2.固定的操作,如每天给表格中添加分区
3.比较复杂的操作,可以使用多个sql来写,就可以使用存储过程来写
4.对表格数据的抽取、操作和存储,可以把etl过程写入存储过程
语法:
create or repalce procedure 存储过程的名字(参数名称 in/out 参数的数据类型) is
--声明变量的地方
begin
--编写代码的地方
end
调用:
call 存储过程名() --适合无参的存储过程
declace
begin
存储过程名() --适合有参的存储过程
end;
12.自定义函数
create or replace function 函数名称(输入参数 参数类型) return 返回的数据类型 is
--声明变量的地方
begin
--写代码的地方
end;
函数和存储过程的区别:
1.存储过程可以没有参数,函数很少没有存储过程
2.函数返回值用return,存储过程使用out
3.存储过程可以使用call或者在代码块中调用,函数是dql和dml语句中调用的
4.函数中不能执行DDL、TCL、DML语句,存储过程中是可以的
13.触发器
触发器不需要调用,在操作表时会自动调用
:new.列名 影响后的数据
:old.列明 影响前的数据
1.前置触发器:使用before来修饰,一般用于数据校验
2.后置触发器:使用after来修饰,一般用来备份数据
3.创建语法:
create or replace trigger 触发器名字 before/after
update or insert or update on 表名
for each row
declare
--声明变量的地方
begin
--代码编写的地方
end;
14.拉链表
在一个表格中,使用一个开始时间和结束时间来记录数据变化的表格
一般情况下,在修改主表的时候通过触发器来修改拉链表中的数据
15.数据的包
包的规范:专门用来声明在包里面的存储过程和函数的概念
语法:
create or replace package 包名 is
--声明存储过程
procedure 存储过程名字(参数)
--声明函数
function 函数名称 (参数)return 返回值类型
end 包名;
包体:对已经声明好的存储过程和函数进行代码逻辑的完善
create or replace package body 包体的名 is
--声明存储过程
procedure 存储过程名字(参数)is
begin
--代码逻辑
end;
--声明函数
function 函数名称 (参数)return 返回值类型 is
begin
--代码逻辑
end;