Oracle 12c 读书笔记——筑梦之路

Oracle 12c  笔记

2020-7-13


#查看数据库状态

select status from v$instance;

#修改密码
alter user system identified by oracle; 

#创建表
create table tb_emp1 {
    id number(11),
    name varchar2(25),
    deptId number(11),
    salary number(9,2)
};

#查看表结构
desc tb_emp1;

#主键约束
create table tb_emp1 {
    id number(11) primary key,
    name varchar2(25)
};

create table tb_emp2 {
    id number(11),
    name varchar2(25),
    primary key(id)
};

##多字段联合主键
create table tb_emp1 {
    name varchar2(25),
    deptId number(11),
    primary key(name, deptId)
};

#alter方式操作表

扫描二维码关注公众号,回复: 12221798 查看本文章

##添加主键约束
alter table tb_emp1 add constraints pk_id primary key(id);

##移除主键约束
alter table tb_emp1 drop constraints pk_id;

#外键约束

create table tb_emp1 {
    id number(11) primary key,
    name varchar2(25),
    deptId number(11),
    salary number(9,2),
    constraint fk_emp dept1 foreign key(deptId) references tb_dept1(id)
};

##alter添加
alter table tb_emp1 
add constraints fk_emp dept1 foreign key (deptId) 
references tb_dept1(id) on delete cascade;

##移除外键约束
alter table tb_emp1
drop constraints fk_emp;


#非空约束
create table tb_emp1 {
    id number(11) primay key,
    name varchar2(25) not null,
    salary number(9,2),
};

##alter

alter table tb_emp1
modify name not null;

##移除非空约束
alter table tb_emp1
modify name null;


#唯一约束

create table tb_emp3 {
    id number(11) primary key,
    name varchar2(25) unique
};

##alter
alter table tb_emp3
add consrtiant unique_name unique(name);

alter table tb_emp3
drop constraints unique_name;

#默认约束

create table tb_emp4 {
    id number(11) primary key,
    name varchar2(25) not null,
    deptId number(11) default 222,
    salary number(9,2)
};

##alter
alter table tb_emp4 modify deptId default 333;

#检查约束

create table tb_sex {
    id number(11) primary key,
    name varchar2(25) not null,
    gener varchar2(2),
    age number(2),
    constraint chk_gender check (gender='男' or gender='女')
};

##alter

alter table tb_sex
add consrtiant chk_gender check (age >= 16 and age <= 30);

alter table tb_sex 
drop consrtiants chk_gender;

#自增

create table tb_emp2 {
    id number(11) generated by default as identity,
    name varchar2(25) not null,
    deptId number(11) default 333,
    salary number(9,2)
};

#查看表结构

desc tb_sex;

describe  tb_sex;


#修改表名
alter table <旧表名> rename to <新表名>;


#修改字段数据类型

alter table <表名> modify  <字段名> <数据类型>

alter table tb_sex modify name varchar2(255);


#修改字段名
alter table <表名> rename column <旧字段名> to <新字段名>;


#添加字段

alter table <表名> add <新字段名> <数据类型>;

alter table tb_sex add managerId number(10);

alter table tb_sex add stu_name varchar2(12) not null;

#删除字段
alter table <表名> drop column <字段名>;

#删除字段及其约束
alter table <表名> drop column <字段名> cascade consrtiants;


#删除表

drop table <表名>;

###################几点注意事项##########################
1.表之间的关联关系是数据参照完整性 一致性
2.存在关联关系的表,删除时需要先删除关联关系
3.约束条件既可以在创建表的时候指定,也可以修改表结构alter来修改


#数据类型

数据类型:数值类型、日期/时间类型、字符串类型

数值类型:整数类型、小数类型 (number)
日期/时间类型:date timestamp
字符串类型:char varvhar2 nvarchar2 nchar long

number(m,n)

m范围:1~38  有效数字位数
n范围:-84~127  小数点后位数


date 日期和时间 精确到秒

timestamp 日期和时间 更加精确  精确到小数秒 上午下午 时区

#查询数据库默认的时间格式
select sysdate from dual;

#修改数据库默认的时间格式
alter session set nls_date_format='yyyy-mm-dd';

eg:
create table tmp {ts date};

insert into tmp values (to_date('2020-7-15  14:30:28', 'yyyy-mm-dd HH24:mi:ss') );

时间被忽略

create table tmp2 {ts timestamp};

insert into tmp2 values (to_timestamp('2020-7-20  15:30:28:00.9999', 'yyyy-mm-dd hh24:mi:ss:ff') );

精度更高


字符串类型:

char 定长的字符型数据  0~2000
nchar 存储Unicode字符集的定长字符型数据    0-1000
varchar2  可变成长的字符型数据  0-4000
nvarchar2 存储Unicode字符集可变长的字符型数据  0-1000
long   存储变成长的字符串   0-2G

#查询字符串的长度
select length(ch) from tmp2;

#between...and
指定范围内

select name from student
where birth between '1980' and '1992';

select name from student
where birth>='1980' and birth <='1992';

#in判断操作数是否为in列表中的一个值

select name from student
where age in (18,25);

#like模糊匹配
% 零个或者多个
_匹配一个字符

select name from student
where name like '王%';

#not in
#and
#or


#运算符优先级

优先级   运算符
最低     赋值运算= :=
         or
         and
         not
         比较运算 = <=> >= <= < > <> != is like regexp in
         &
         << >>
         - +
         * /
         -负号
最高         !


#Oracle中的图片、声音和视频文件 二进制文件
存储:blob、clob、nclob 、BFILE  数据格式
最大长度4G

#函数

##数学函数
绝对值函数、三角函数、对数函数、随机函数

绝对值

select abs(2), abs(-3),abs(-56) from dual;

平方根 求余
select sqrt(9), sqrt(40), sqrt(64) from dual;

select mod(31,8), mod(234,10) from dual;

取整数

最小整数
select ceil(-3.35) ceil(3.35) from dual;

最大整数
select floor(-3.35), floor(3.35) from dual;

随机函数

select dbms_random.random from dual;

获取一个1-20之间随机数
select dbms_random.value(1,20) from dual;

四舍五入round(x)
select round(-1.54) from dual;

#保留1位小数 小数点右边
select round(1.38, 1) from dual;
1.4

#保留小数点左边1位
select round(232.38,-1) from dual;
230

round(x,y)
y 值为负数时, 保留的小数点左边的相应位数直接保存为0 , 不进行四舍五入。

trunc(x,y) 返回被舍去至小数点后y 位的数字x。若y 的值为0 ,则结果不带有小数点
或不带有小数部分。若y 设为负数,则截去( 归零) x 小数点左起第y 位开始后面所有低位的
值。

select trunc(1.99,1), trunc(19.99,-1) from dual;
1.9  10

符号函数sign(x)
SIGN(x )返回参数的符号, x 的值为负、零或正时返回结果依次为- 1 、0 或l 。

select sign(3),sign(0), sign(-3) from dual;
1  0  -1

幂运算power(x,y) exp(x)

select power(2,2), power(2,-2) from dual;
4  0.25


select exp(3), exp(-3), exp(0) from dual;

。。。


字符串函数
length(str) 返回字符串长度
concat(s1,s2) 合并字符串
instr(s,x) 返回x字符在字符串s的位置
lower(str) 转换为小写
upper(str) 转换为大写
initcap(str) 将字符串单词首字母大写
substr(s,m,n) 获取指定长度的字符串,s字符串,m截取位置,n截取长度
replace(s1,s2,s3) 替换字符串,s1目标字符串,s2要搜索的字符串,s3可选 需要换成的字符
ltrim(s,n) 删除指定的左侧字符 s目标字符  n要查找的字符 n不指定删除左侧的空格
rtrim(s,n) 删除指定的右侧字符  s目标字符  n要查找的字符 n不指定删除右侧的空格
trim()   默认去掉空格  T阳M 函数将删除指定的前缀或者后缀的字符,默认删除空格
TRIM ([LEADING/TRAILING/BOTH) [trim character FROM) trim source)
其中LEADING 指删除trim source 的前缀字符: T孔气ILING 指删除的m source 的后缀字
符: BOTH 指删除tr im source 的前缀和后缀字符; trim character 指删除的指定字符,默认删
除空格: trim source 指被操作的源字符串。

nls_charset_id(str) 获取到字符集名称对应的id
select nls_charset_id('US7ASCII') from dual;
1

nls_charset_name(number) 获取字符集id对应的名称
select nls_charset_name(1) from dual;
US7ASCII

##日期函数
sysdate() 获取系统当前日期
select sysdate from dual;

获取指定格式的系统当前日期
select to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') from dual;

systimestamp()获取当前系统时间  包含时区信息 精确到微秒
select systimestamp from dual;

dbtimezone() 获取数据库所在时区 
select dbtimezone from dual;

sessiontimezone() 获取当前会话所在时区
select sessiontimezone from dual;

last_day(date) 获取指定日期对应月份最后一天
select last_day(sysdate) from dual;

next_day(date,char) 返回指定日期后一周的对应日期
char表示星期几

select next_day(sysdate, '星期日') from dual;
返回当前日期后第一个周日的日期

extract(datetime) 从指定时间提取部分
select extract(year from sysdate), extract(minute from timestamp(’ 1985- 10 - 8 12 : 23 : 40 ’))) from dual;

months_between(date1,date2) 返回date1和date2之间的月份数

转换函数:
asciistr(char) 字符转ascii码
select asciistr('从零开始') from dual;

bin_to_num() 将二进制转换为十进制

select bin_to_num(1,1,0) from dual;

#数据类型转换
cast(expr as type_name) 数字转换为字符 字符转换为日期

select cast('4321' as number), cast(4321 as varchar2) from dual;

to_char() 数值转换成字符串

TO CHAR (n, [fmt[nlsparam]])

其中参数n 代表数值型数据: 参数fmt 代表要转换成字符的格式: nlsparam 参数代表指定
fmt 的特征,包括小数点字符、组分隔符和本地钱币符号。

select to_char(10.12345, '99.999'), to_cahr(10.12345) from dual;

to_date() 字符转日期
SELECT TO CHAR(TO DATE (’ 1999 - 10 - 16 ’,’YYYY - MM - DD ’),’ MONTH ’) FROM dual ;

to_number() 字符串转数字
select to_number('19.123', '99.99') from dual;


系统信息函数

user 返回当前会话登录名称
select user from dual;

userenv 返回当前会话的信息
当参数为Language 时, 返回会话对应的语言、字符集等;当参数为SESSION 时,返回当
前会话的D ;当参数为I SD BA 时,返回当前用户是否为DBA 。

select userenv('Language') from dual;


--------------------数据查询------------------------------------------------

select
        {* | <字段列表>}
        [
            from <表1>,<表2>...
            [where <表达式>]
            [group by <group by definition>]
            [having <expression> [{<operator> <expression>}...]]
            [order by <oreder by definition>]
            <limit [<offset>,] <row count>>
        ]
    

select [字段1,字段2,...,字段n]
from [表或视图]
where [查询条件]

单表查询:
select * from 表名;

where条件判断符:

=
<> !=
<
>
<=
>=
between...and...


in关键字:
查询满足指定范围内的条件的记录

select id,name from stu 
where id in (100, 110)
order by name;


not关键字

select id,name 
from stu
where id not in (100,105)
order by name;

between...and... 在某范围内

not between ... and ... 不在某范围内


like匹配:

% 任意长度
_ 任意一个字符

is null 查询null 空

select id,name
from stu
where name is null;


多条件查询: and

多条件查询:or

查询结果去重:select distinct 字段名 from  表名;

查询结果排序:order by

单列排序:select name from stu order by name;

多列排序:select id,name,sex from stu order by name,sex;

#注意:多列排序 第一列必须有相同的值,才会对第二列进行排序,若第一列数据唯一,不再对第二列进行排序


指定排序方向:
默认情况下:按照字母顺序排序-A-Z asc 升序
desc 倒序排序

select id,name,sex from stu order by name desc, id;

#注意:desc只对前面的name降序排序,id默认还是升序排序

分组查询:group by

[group by 字段] [having <条件表达式>]

group by 通常和集合函数一起使用,max(),min(),count(),sum(),avg()

select s_id,count(*) as Total from fruits group by s_id;


#listagg()将分组中各个字段的值显示出来
select s_id,listagg(f_name,',') within group (order by s_id) as Names from fruits group by  s_id;

having过滤分组信息:

select s_id,listagg(f_name,',') within group (order by s_id) as Names
from fruits
group by s_id having count(f_name) >1;


###having where 区别:
having在数据分组之后进行过滤来选择分组
where在分组之前用来选择记录 where排除的记录不再包括在分组中

group by子句中使用rollup:
使用rollup关键字后,在所有查询出的分组记录之后增加一条记录,该记录查询出的所有记录的
总和,(统计记录数量)

select s_id,count(*) as Total
from fruits
group by rollup(s_id);


多字段分组:
多字段分组值进行层次分组,分组层次从左到右

select f_id,s_id,f_name, f_price
from fruits
group by s_id,f_name;


group by 和 order by 一起使用

某些情况下需要对分组进行排序

查询订单价格大于100的订单号和总订单价格,按照总订单价格排序
select 0_num,sum(quantity * item_price) as orderTotal
from orderitems
group by o_num
having sum(quantity * item_price) > 100
order by orderTotal;

###注意:rollup不能和order by一起使用

rownum 限制查询结果数量

显示查询结果的前4行:
select * from fruits where rownum < 5;

支持的符号:< <= !=


聚合函数查询:

avg()  返回某列的平均值
count()  返回某列行数
max()   返回某列的最大值
min()   返回某列的最小值
sum()   返回某列值得求和

count(*) 计算表中总行数 不论空值与否
count(字段名) 计算指定列下总行数 忽略空值

连接查询:
连接是关系型数据库模型的主要特点
内连接  外连接 复合条件连接
多表查询

内连接查询(inner join)
使用比较运算符进行表间某些列数据的比较操作
并列出这些表中与连接条件相匹配的数据行,组合成新的记录
即,只有满足条件的记录才能出现在结果关系中

select suppliers.s_id,s_name,f_name,f_price
from fruits,suppliers
where fruits.s_id = suppliers.s_id;

select suppliers.s_id,s_name,f_name,f_price
from fruits
inner join suppliers
on fruits.s_id=suppliers.s_id;

使用where子句定义连接条件简单明了
inner join语法是ansi sql标准规范,确保不会忘记连接条件
where子句在某些时候会影响查询性能

连接查询中,涉及的两个表都是同一个表——自连接查询
物理上是同一张表,逻辑上分为两张表

查询供应f_id='a1'水果的供应商提供的其他水果种类
select f1.f_id, f1.f_name
from fruits f1, fruits f2
where f1.s_id=f2.s_id and f2.f_id='a1';


外连接查询;
有时需要包含没有关联的行中的数据
返回查询结果集合中不仅包含符合连接条件的行,而且还包含
左表、右表或者两个边接表中所有的数据行

left join 左连接:返回包括左表中的所有记录和右表中连接字段相等的记录
right join 右连接:返回包括右表中所有记录和右表中连接字段相等的记录

查询所有客户,包括没有订单的客户:
select customers.c_id,orders.o_num
from customers
left join orders
on customers.c_id=orders.c_id;

查询所有订单,包括没有客户信息的订单:
select customers.c_id,orders.o_num
from customers
right join orders
on customers.c_id=orders.c_id;

复合条件连接查询:

在连接查询过程中,通过添加过滤条件,限制查询结果,使查询结果更加准确。

select customers.c_id,orders.o_num
from customers
inner join orders
on customers.c_id = orders.c_id and customers.c_id=1001;


select suppliers.s_id,s_name,f_name,f_price
from fruits
inner join suppliers
on fruits.s_id = suppliers.s_id
order by fruits.s_id;

子查询:152

子查询是指一个查询语句嵌套在另一个查询语句内部的查询
select子句中先计算子查询,查询结果作为外层查询的过滤条件
 查询可以基于一个表或者多个表
 
常用的操作符:
any(some) all  in  exists 
可以使用的语句:select  update  delete  多层嵌套
比较运算符

关键字:any some 满足其中任一条件

select num1 from tb1 where num1 > any (select num2 from tb2);

关键字:all  需要同时满足所有内层查询的条件
select num1 from tb1 where num1 > all (select num2 from tb2);

关键字:exists  可以和条件表达式一起混用
任意的子查询,至少返回一行,结果为true,此时外层查询语句将进行查询

查询表中是否存在s_id=107的供应商,存在则查询fruits中记录

select * from fruits where exists (select s_name from suppliers where s_id=107);

select * from fruits where f_price > 10.20 and exists 
(select s_name from suppliers where s_id=107);

关键字:not exists

select * from fruits where not exists 
(select s_name from suppliers where s_id=107);

关键字:in   

在orderitems表中查询f_id为c0的订单号,并根据订单号查询具有订单号的客户c_id
select c_id from  orders where o_num in 
(select o_num from orderitems where f_id='c0');

带比较运算:< <= = > >= !=

select s_id,f_name from fruits
where s_id = 
(select s1.s_id from suppliers s1 where s.s_city='Tianjin');

select s_id,f_name from fruits
where s_id <> 
(select s1.s_id from suppliers s1 where s.s_city='Tianjin');

 合并查询结果
 
关键字:union

多条select语句,查询结果组合成单个结果集
合并时,两个表对应的列数和数据类型必须相同

格式:
select column,...
from table1
union [all]
select column,...
from table2

查询所有价格小于9的水果信息,查询s_id等于101 103的所有水果信息
union连接查询结果

select s_id,f_name,f_price
from frutis
where f_price < 9
union
select s_id,f_name,f_price
from fruits
where s_id in (101,103);

表别名:

表名 [as] 表别名

列名 [as] 列别名


正则表达式:

regexp_like()函数

^  匹配文本的开始字符
$  匹配文本的结束字符
.  匹配任何单个字符
*  匹配零个或多个在它前面的字符
+  匹配前面的字符1次或者多次
<字符串>  匹配包含指定的字符串的文本
[字符集合]  匹配字符集合中的任何一个字符
[^]   匹配不在括号中的任何字符
字符串{n,}   匹配前面的字符串至少n次  b{2} 
字符串{n,m}  匹配前面的字符串至少n次,至多m次,若n为0,此参数可选 b{2,4}


select * from fruits where regexp_like(f_name, '^b');

select * from fruits where regexp_like(f_name, 'y$');

select * from fruits where regexp_like(f_name,'a.g');

select * from fruits where regexp_like(f_name,'^ba*');

select * from fruits where regexp_like(f_name,'^ba+');

select * from fruits where regexp_like(f_name,'on');

select * from fruits where regexp_like(f_name,'on|ap');

like与regexp_like区别:
like匹配的字符串在文本中出现,找不到
regexp_like在文本内匹配

select * from fruits where regexp_like(f_name,'[ot]');

select * from fruits where regexp_like(s_id, '[4-6]');

select * from fruits where regexp_like(f_id,'[^a-e1-2]');

select * from fruits where regexp_like(f_name,'x{2,}');

select * from fruits where regexp_like(f_name,'ba{1,3}');

 综合练习:182

插入数据:

所有字段插入数据:
insert into table_name (column_list) values (value_list);

指定字段插入数据:
insert into table_name (column) values (value);

多条数据插入:
INSERT ALL
  INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
  INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
  INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
SELECT * FROM dual;

将查询结果插入:
insert into table_name1 (column_list1)
select (column_list2) from table_name2 where (condition)

---------更新数据


update table_name
set column_name1 = value1
where (condition)

删除数据

delete from table_name where (conidtion)


                                                                                                                     

193页


----------视图
从一个表或者多个表中导出,视图的行为与表非常相似,但视图是一个虚拟表
具有增删改查的功能
操作方便,保障数据库系统安全

虚拟表

可以从已存在的视图基础上定义

一经定义存储在数据库中 

修改视图 基本表数据也要发生变化

修改基本表数据,视图也会发生变化

不破坏原有的表结构

简单化:看到的就是需要的

安全性:视图用户只能查询和修改所见的的数据 用户被限制在数据的不同子集上

逻辑数据独立性:屏蔽真实表结构变化带来的影响

视图包含了select查询结果

创建视图:

create [or replace] [[no] force] view
[schema.] view 
[(alias,...) inline_constraint(s)]
    [out_of_line_constraint(s)]

as subquery
[
    with{read only check option[CONSTRAINT constraint]}
];

203页

单表创建视图

create table t (quantity number(9), price number(9));

insert into t values(3,50);

create VIEW view_t as select quantity,price from t;

select * from view_t;

指定字段:
create VIEW view_t2(qty,price) as select quantity,price from t;

多表上创建视图

create VIEW stu_glass(id,name,glass) as
select student.s_id,student.name,stu_info.glass
form student,stu_info where student.s_id=stu_info.s_id;

在视图上创建视图

create or replace VIEW stu_gl_glass
as
select stu_glass_id,stu_glass.name
from stu_glass

创建没有源表的视图

默认没有源表会报错

强制创建

create or replace force VIEW gl_glass
as
select stu_glass_id,stu_glass.name
from glass;


查看视图

describe 视图名;

206页


修改视图

修改数据库中存在的视图,基本表某些字段发生变化的时候,可以通过
修改视图来保持与基本表的一致性。

create or replace VIEW view_t(quty,pri) as select * from t;

alter修改视图的约束

alter VIEW view_t
add consrtiant t_unq unique(quty)
disable novalidate;

alter VIEW view_t
drop consrtiant t_unq;


更新视图

通过视图插入、更新、删除表中数据
insert update  delete

update view_t set quty=5;

insert into t values (3,5);

delete from view_t where price=5;

删除视图

drop VIEW view_name;


限制视图的数据操作

对视图数据的增加或更新实际上是操作视图的源表。
通过对视图的限制操作,可以提高数据的操作安全性。

#视图的只读属性——防止用户修改数据
create or replace VIEW view_t
as quantity,price from t
with read only;

#视图的检查属性——修改视图数据指定一定的检查条件
create or replace VIEW view_tc 
as select quantity, price from t
where price>10
with check option;


**************212页


218页

--------游标

游标是oracle的一种数据访问机制,允许用户单独访问的数据行,用户可以对每一行
进行单独处理,从而降低系统开销和潜在的阻隔情况,用户也可以使用这些数据生成sql代码
并立即执行或输出。


概念:
游标类似可以变动的光标。
在查看或处理结果集中的数据时,游标可以提供在结果集中向前或向后浏览数据的功能。
当要对结果集进行逐行单独处理时,必须声明一个指向该结果集的游标变量。
游标默认指向的是结果集的首记录。

默认情况下,游标可以返回当前执行的记录,只能返回一行记录。
返回多行,需要不断滚动游标,把需要的数据都查询一遍。
用户可以操作游标所在位置行的记录,例如把返回记录作为另一个查询的条件等。

优点:
220页

1.允许程序对由select查询语句返回的行集中的每一行执行相同或不同的操作,而不是对
整个集合执行同一操作。
2.提供对基于游标位置的表中的行进行删除和更新的能力。
3.游标作为数据库管理系统和应用程序设计之间的桥梁,将两种处理方式连接起来。


分类:

静态游标:显式游标 隐式游标
ref游标

显式游标:在使用之前必须有明确的游标声明和定义,这样的游标定义会关联数据
查询语句,通常会返回一行或多行。打开游标后,用户可以利用游标位置对结果集进行检索。
使之返回单一的行记录,用户可以操作此记录。关闭游标后,就不能对结果集进行任何操作。
显式游标需要用户自己写代码完成,一切由用户控制。

隐式游标:被数据库自动管理,此游标用户无法控制,但能得到它的属性信息。


操作:

显式游标操作:声明游标、打开游标、读取游标中的数据和关闭游标

显式游标的语法:
声明游标:

cursor cursor_name
    [(parameter_name datatype,...)]
    is select_statement;
    

eg:
declare cursor cursor_fruit
is select f_name,f_price from fruits;


打开游标:
语法:
open cursor_name;

eg:
open cursor_fruit;

读取游标中的数据:
语法:
fetch cursor_name into  Record_name;

读取的记录放到变量当中。读取多个记录,需要使用循环,直到条件不符合要求退出。
fetch 游标属性%rowcount会不断累加

eg:
fetch cursor_fruit inito Record_name;

关闭游标:
打开游标以后,服务器会开辟一定的内存空间存放游标操作的数据结果集合,
同时游标的使用也会根据具体情况对某些数据进行封锁。
不使用时关闭,释放游标所占的服务器资源。

语法:close cursor_name;

eg:close cursor_fruit;

游标案例(单条数据):

set serveroutput on; --打开oracle自带的输出方法dbms_output
declare
    cursor frt_cur    --声明一个名称为frt_cur的游标
    is select f_id,f_name from fruits;     --游标关联的查询
    
    cur_fruits frt_cur%rowtype;       --定义一个游标变量,名称为cur_fruits
    
    begin
        open frt_cur;              --打开游标
            fetch frt_cur inito cur_fruits;   --fetch从结果集中提取指针指向的当前行记录
            dbms_output.put_line(cur_fruits.f_id||'.'||cur_fruits.f_name);  --输出结果并换行
    close frt_cur;  --关闭游标
        end;

结果显示:a1.apple


游标案例(多条数据):

set serveroutput on;
declare
cursor frt_loop_cur
is select f_id,f_name,f_price from fruits
where f_price >10;


cur_id fruits.f_id%type; --变量类型同表fruits对应的字段类型一致
cur_name fruits.f_name%type;
cur_price fruits.f_price%type;

begin
    open frt_loop_cur;
        loop
            fetch frt_loop_cur into cur_id,cur_name,cur_price;
            exit when frt_loop_cur%notfound; --游标的属性实现没有记录时退出循环
            dbms_output.put_line(cur_id||'.'||cur_name||'.'||cur_price);
        end loop;
    close frt_loop_cur;
end;


############
fetch ...into... 只能提取单条数据
数据量比较大的情况下,执行效率低

bulk collect 和for的游标出现

fetch ...bulk collect into ...批量提取数据

案例(批量提取):

set serveroutput on;
declare
cursor frt_collect_cur
is select * from fruits
where f_price >10;

--定义表fruits行对象一致的集合类型frt_rd
type frt_tab is table of fruits%rowtype;

--存放批量得到的数据
frt_rd frt_tab;

begin
    open frt_collect_cur;
        loop
            fetch frt_collect_cur bulk collect into frt_rd limit 2;
            for i in 1..frt_rd.count loop
            dbms_output.put_line(frt_rd(i).f_id||'.'||frt_rd(i).f_name||'.'||frt_rd(i).f_price);
            end loop;
            exit when frt_collect_cur%notfound;
        end loop;
    close frt_collect_cur;
end;

225页


 
 

猜你喜欢

转载自blog.csdn.net/qq_34777982/article/details/112994782
今日推荐