分页伪分页
rownum 结果集序列,数据库提供的一列,动态改变,不能和order by同一层使用
在order by 之前,结果集就已经出来了,rownum就已经产生了
rownum 动态查询的,不能使用>,使用等于也只能是=1
oracle 的分页将rownum查询出来固化,作为结果集固定的一列,然后再根据这一列查询
select rownum as rn,emp.* from emp;
select * from (select rownum as rn,emp.* from emp) temp where rn between 7 and 9;
如果是排序和分页一起使用
使用排序后的结果进行分页时排序字段一定要唯一,如果字段不能唯一可以使用组合排序,否则会出现重复的情况
1.数据过滤和排序
2.查询rownum 给别名固化
3.根据别名分页
集合查询
union 去重合并(每一列都一样去除重复)
union all 合并所有
将两个查询结果集合并起来,并集查询
A union B
A union all B
A/B是完整的查询语句,A,B两个查询结果集列,列类型要一致才能合并
视图
将查询语句作为一个对象保存到数据库,并且给数据库取个名字
视图的使用类似表,使用视图将查询结果集按临时表来使用
创建视图
create [or replace] view v_name as select sql 语句
视图使用场景
1.简化sql语句
2.用于数据库数据同步,多平台数据交互
将视图的权限赋值给用户
grant select on v_avg_dept(视图名) to 用户
索引
作用:快速定位
查一条数据,数据库会先去索引这个数据的位置在哪里
查询数据时使用索引必须保证where 条件的列具有索引
索引可以加快查询速度,但是不是越多越好
1.索引占用空间
2.对表的更新操作可能会修改索引,索引越多,更新操作越慢
什么样的列适合建立索引,唯一列
创建索引
数据库会自动给主键和唯一键创建索引
创建单列索引
create index i_name on table_name(列名);
创建组合索引
create index i_name on table_name(列名,...)
索引列的顺序是可选范围越大放在越前。
组合索引按顺序查找,查询时条件只有一个时,组合索引前的列走索引
函数索引
create index i_name on table_name(函数)
索引查询时!=不走索引,其他= > < 走索引
like '%条件%' 不走索引
like '条件' 走索引
like '条件%' 走索引
序列
就是一组序号,但也是和表,视图等属于oracle数据库的对象
创建
create sequence seq_name;
获取序列下一个值
seq_name.nextval
获取序列当前值(如果序列还没有使用过,则没有当前值)
seq_name.currval
序列和表没有关系,两个对象1
oracle 编程
语法结构
declare 变量定义
begin
语句块
dnms_output.put_line('helloworld');
end
变量定义
变量名 变量类型
多个变量使用;
变量简单类型
数据库的列有什么类型,变量就有什么类型
varchar2
number
date
连接符号 ||
赋值符号 :=
动态赋值 into
select 列名... into 变量名...
赋值时有且只有一条数据
异常处理
declare 变量定义
begin
异常扑获
exception
when others then
dbms_output.put_line(sqlerrm)
end
sqlerrm 异常信息关键字
no_data_found 找不到数据异常
others 扑获所有异常
变量名 表.字段%type 变量名和指定的字段类型一致
变量名 表%rowtype 定义表行对象
record 自定义数据类型
语法 type record_name is record(
列名 变量类型,
列名 变量类型,
...
);
数组
语法:
type name is table of 类型 index by binary_integer;
定义数组变量
数组对象(下标):=值
数组对象.count 数组数据的个数
分支
if 条件 then
end if
if else
if elsif elsif else
循环1
loop
循环体
exit when 退出条件
end loop;
循环2
while 循环条件 loop
循环体
end loop;
循环3
for index in (reverse倒序) 1..10 loop
循环体
end loop;
游标
查询多个数据,是数据在内存中的体现
取值关键字 fetch 每次取值会将指针向下移并取出值
使用游标
1>定义一个游标
cursor v_c(游标名) is select语句
2>定义一个变量,用于接收从游标中取出的行对象
v_emp v_c%rowtype
3>打开游标,游标加载数据
open v_c;
4>从游标中取值
fetch v_c info v_emp;
5>关闭游标,释放内存
close v_c
v_c%notfound 没有数据返回true
v_c%found 有数据返回true
for 循环输出时不需要打开和关闭游标
事务需要手动提交
在代码块中不能直接创建表需要使用execute执行
v_sql='sql语句';
execute immediate v_sql;
参数占位符 : 占位符的名字随意,参数按照顺序传值
v_sql='update emp set ename=:updateName where empno=:empNo';
execute immediate v_sql using V_emp_name,V_empno;
带参游标
cursor v_c(形参名 形参类型,...) is select * from emp where 条件=形参名;
open v_c(参数);
close v_c;
for v_info in v_c(参数)
loop
end loop;
动态游标
游标在定义时不知道查询什么数据
定义一个动态游标类型
type v_cursor is ref cursor; 定义一个动态游标类型
v_c v_cursor 定义游标类型变量
v_enanme emp.ename%type 定义从游标中取出数据的变量
v_sal emp.sal%type 定义从游标中取出数据的变量
open v_c for slelct ename,sql from emp;
loop
fetch v_c into v_name,v_sal;
end loop;
批量取值
open v_c for slelct ename,sql from emp;
loop
fetch v_c bulk collect into v_names,v_sals limit 5;
end loop;
存储过程
将编程语句块取个名字,以对象的形式存储在数据库。
语法
创建存储过程
create [or replace] procedure p_name
is
begin
--
end
调用过程
declare
begin
过程名
end
带参存储过程
create [or replace] procedure 过程名(参数名 参数类型)
is
begin
end;
调用带参数的过程
declare
begin
过程名(参数);
end;
default 10表示有缺省值可以不传参
传参时可以顺序传参或是指定形参传参(形参=>参数值)
存储过程返回值 又叫输出参数
形参定义中使用out关键字定义输出参数 参数名 out 参数类型 不写out默认就为in
create [or replace] procedure 过程名(参数名 out 参数类型)
is
begin
end;
函数
和存储过程类似,但是,函数一定要有返回值
创建函数
create or replace function 函数名(形参名 形参类型...)
return 返回值类型
is 定义变量
begin
end;
定时任务
1>系统的定时任务
一般指的是守护进程,监控进程
2>代码中的定时任务(Spring的定时任务) 对文件进行操作或者和别的平台对接只能用代码定时任务
其他业务方面的定时任务,可以使用数据库定时任务替代
3>数据库的定时任务
业务上的定时任务也可以使用spring定时任务代替
存储过程日志记录
1>日志记录的位置
存储过程开始,存储过程结束,异常
2>数据
定时任务调用的是存储过程
1>准备一个无参的存储过程
2>创建定时任务
declare
i integer
begin
sys.dbms_job.submit(
job=>i,
what=>'存储过程名',
next_date=>(sysdate+1/1440),
interval=>'sysdate+3/1440'
);
commit;
end;
评论区