侧边栏壁纸
博主头像
王小木人

这是很长,很好的一生

  • 累计撰写 141 篇文章
  • 累计创建 43 个标签
  • 累计收到 8 条评论

目 录CONTENT

文章目录

Oracle 笔记

王小木人
2021-05-26 / 0 评论 / 0 点赞 / 1,301 阅读 / 3,035 字

分页伪分页
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;

0

评论区