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方式操作表
##添加主鍵約束
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頁
?
?
總結
以上是生活随笔為你收集整理的Oracle 12c 读书笔记——筑梦之路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 桌面没计算机图标不见了怎么办,桌面图标不
- 下一篇: 百度智能云 × 山东物泽 | 智慧种植,