Oracle数据库的基础
目錄
小知識(shí)點(diǎn)?
1、dec
2、nvl
3、minus
4、連接join
5、數(shù)據(jù)庫(kù)設(shè)計(jì)范式
數(shù)據(jù)庫(kù)設(shè)計(jì)第一范式:(設(shè)計(jì)出沒(méi)有數(shù)據(jù)冗余和數(shù)據(jù)維護(hù)異常的數(shù)據(jù)庫(kù)結(jié)構(gòu))
數(shù)據(jù)庫(kù)設(shè)計(jì)第二范式:
數(shù)據(jù)庫(kù)設(shè)計(jì)第三范式:
數(shù)據(jù)庫(kù)概念
數(shù)據(jù)庫(kù)操作語(yǔ)言
?關(guān)系的基本概念
實(shí)體完整性
參照完整性:(foreign key)可以是空值,
一些函數(shù)控制字符
dual?
desc關(guān)鍵字
having和 where的區(qū)別:
2022 3-9
小知識(shí)點(diǎn):
2022-3-19數(shù)據(jù)庫(kù)實(shí)驗(yàn)心得
視圖
聯(lián)結(jié)表
自然連接與等值連接的區(qū)別:
ANY ALL
2022-實(shí)驗(yàn)三總結(jié)
2022-3-30
PL/SQL:
select 選擇了一些列之后,如果里面有聚合函數(shù),后面一定要有g(shù)roup函數(shù)否則會(huì)報(bào)錯(cuò),原因如下:
2022-4-2實(shí)驗(yàn)四總結(jié)
索引,范式和鎖
創(chuàng)建函數(shù)、過(guò)程
dbms_output.put_line的用法
E-R圖轉(zhuǎn)關(guān)系模式
小知識(shí)點(diǎn)?
1、dec
Oracle 數(shù)據(jù)類型:decimal | dec (presicion,scale) p是精度,代表有效位數(shù),scale表示小數(shù)部分的范圍,比如dec(8, 2)代表8位整數(shù)部分,2位小數(shù)部分。
2、nvl
語(yǔ)法
NVL(eExpression1, eExpression2)
從兩個(gè)表達(dá)式返回一個(gè)非 null 值。
參數(shù)
eExpression1, eExpression2
如果 eExpression1 的計(jì)算結(jié)果為 null 值,則eExpression2。如果 eExpression1 的計(jì)算結(jié)果不是 null 值,則返回 eExpression1。eExpression1 和 eExpression2 可以是任意一種數(shù)據(jù)類型。如果 eExpression1 與 eExpression2 的結(jié)果皆為 null 值,則 NVL( ) 返回 .NULL.
3、minus
“minus”直接翻譯為中文是“減”的意思,在Oracle中也是用來(lái)做減法操作的,只不過(guò)它不是傳統(tǒng)意義上對(duì)數(shù)字的減法,而是對(duì)查詢結(jié)果集的減法。 A?minus?B就意味著將結(jié)果集A去除結(jié)果集B中所包含的所有記錄后的結(jié)果,即在A中存在,而在B中不存在的記錄。
4、連接join
各種join的詳細(xì)簡(jiǎn)單的解釋
5、數(shù)據(jù)庫(kù)設(shè)計(jì)范式
數(shù)據(jù)庫(kù)設(shè)計(jì)第一范式:(設(shè)計(jì)出沒(méi)有數(shù)據(jù)冗余和數(shù)據(jù)維護(hù)異常的數(shù)據(jù)庫(kù)結(jié)構(gòu))
1、數(shù)據(jù)庫(kù)表中的所有字段都只具有單一屬性
2、單一屬性的列是由基本的數(shù)據(jù)類型所構(gòu)成的
3、設(shè)計(jì)出來(lái)的表都是簡(jiǎn)單的二維表
數(shù)據(jù)庫(kù)設(shè)計(jì)第二范式:
要求一個(gè)表中只具有一個(gè)業(yè)務(wù)主鍵,也就是說(shuō)符合第二范式的表中不能存在非主鍵列對(duì)只對(duì)部分主鍵的依賴關(guān)系
數(shù)據(jù)庫(kù)設(shè)計(jì)第三范式:
指每一個(gè)非主屬性既不部分依賴于也不傳遞依賴于業(yè)務(wù)主鍵,也就是在第二范式的基礎(chǔ)上消除了非主鍵屬性對(duì)主鍵的傳遞依賴
數(shù)據(jù)庫(kù)概念
長(zhǎng)期儲(chǔ)存在計(jì)算機(jī)內(nèi),有組織,可共享的大量數(shù)據(jù)的集合,就是數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)管理系統(tǒng),(DBMS,databace mangement system),用于創(chuàng)建操作和管理數(shù)據(jù)庫(kù)的應(yīng)用程序
:xx,dnmcg2IR
數(shù)據(jù)庫(kù)用來(lái)管理數(shù)據(jù),QQ為什么能這么厲害,就是因?yàn)樗泻芏鄶?shù)據(jù),這些數(shù)據(jù)是商業(yè)機(jī)密,使用數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)占用存儲(chǔ)空間小,并且查詢數(shù)據(jù)快Alter TABLE XS ADD ENG CHAR(20); --添加新的列
數(shù)據(jù)庫(kù)操作語(yǔ)言
?關(guān)系的基本概念
自己的某一個(gè)屬性(或?qū)傩约?#xff09;在其他表中是主碼,則在自己表中這個(gè)屬性(或?qū)傩约?#xff09;是外碼
實(shí)體完整性
實(shí)體完整性:(primary key)不能是空值,不能重復(fù)
參照完整性:(foreign key)可以是空值,
select id)
from xs
where to_char(birthday,'yyyy-mm-dd') ='2002-06-28';
將日期轉(zhuǎn)化成char類型
一些函數(shù)控制字符
dual?
dual是一個(gè)一行一列的虛擬表,常用來(lái)計(jì)算表達(dá)式
desc關(guān)鍵字
desc 查看表的結(jié)構(gòu),
Alter TABLE XS ADD ENG CHAR(20); --添加新的列
UPDATE XS SET ENG='ENGLISH' WHERE DEPT='計(jì)算機(jī)';將dept=計(jì)算機(jī)的ENG改為‘english’ SELECT SNAME, LOWER(ENG) AS LOW_ENG--將eng屬性改為小寫,重新命名成LOW_ENG,函數(shù)LOWER
FROM XS WHERE DEPT='計(jì)算機(jī)';
commit; -->提交數(shù)據(jù)
? rollback; -->回滾數(shù)據(jù)
select * from user_tables;--查詢用戶下的所有表
having和 where的區(qū)別:
where在數(shù)據(jù)分組前進(jìn)行過(guò)濾,having在數(shù)據(jù)分組過(guò)后進(jìn)行過(guò)濾,
使用having時(shí)應(yīng)該結(jié)合Group by語(yǔ)句,where 用于標(biāo)準(zhǔn)的行級(jí)過(guò)濾
2022 3-9
--2022 3-9 create table stu (SNO CHAR(6) PRIMARY KEY, SNAME VARCHAR2(10) UNIQUE, DEPT VARCHAR2(20) NOT NULL, SEX VARCHAR2(4) DEFAULT('男'), TOTALCREDIT NUMBER(3, 0) CHECK(TOTALCREDIT>=0) ); insert into stu values ('100001','hzy', 'jsj', '女', '100'); insert into stu values ('100001','hzz', 'jsj', '女', '100'); insert into stu(sno,dept) values('111','rjgc'); select * from stu; update stu set sname='hjj' where sno='111'; select * from stu; alter table stu modify sname varchar2(20); alter table stu modify sno char(10); alter table stu add nativeplace varchar2(20); alter table stu drop column nativeplace; alter table stu drop CONSTRAINT SYS_c007069; alter table stu add constraint stu_sname_unique unique(sname); create table stu1 as select * from stu; drop table stu1; insert into stu values('100002', '張三', '計(jì)算機(jī)','男', '10'); --INSERT INTO stu(sno, ) update stu set sex=sex+10; update stu set dept='軟件工程' where sname='張三'; delete from stu where TOTALCREDIT is null; commit; rollback; select * from xs;小知識(shí)點(diǎn):
利用已有數(shù)據(jù)表建立一個(gè)新表,但不復(fù)制數(shù)據(jù):
create TABLE S1
AS
SELECT * FROM STUDENT WHERE 1=0;
UPDATE STU SET TOTALCREDIT=NVL(TOTALCREDIT, 0)+2;
NVL(TOTALCREDIT, 0):如果totalcredit不是空,就用原來(lái)的值,是空,就用0來(lái)代替;
FROM ZLGC WHERE CATEGORY='課程思政示范課程' AND COUNT(CATEGORY)>50 GROUP BY SCHOOL,CATEGORY ORDER BY COUNT(CATEGORY) DESC
ERROR: ORA-00934: 此處不允許使用分組函數(shù)
要使用having 來(lái)過(guò)濾分組
2022-3-19數(shù)據(jù)庫(kù)實(shí)驗(yàn)心得
在本次實(shí)驗(yàn)中,我遇到的問(wèn)題首先是1-1題目中extract函數(shù)的使用,通過(guò)從網(wǎng)上查詢知道了,我學(xué)習(xí)到該函數(shù)的作用是將年份從date中分離出來(lái)單獨(dú)計(jì)算從而得到年齡,第二個(gè)問(wèn)題是2-4題目中過(guò)濾學(xué)生人數(shù)小于3的的語(yǔ)句,不能在group by 語(yǔ)句前面加where來(lái)過(guò)濾,如果使用了,錯(cuò)誤信息是這樣的,
查閱資料后學(xué)習(xí)到了,有g(shù)roup by 語(yǔ)句時(shí)where中不能使用聚合函數(shù)來(lái)過(guò)濾數(shù)據(jù),此時(shí)只能使用having語(yǔ)句,并且having語(yǔ)句只能跟在group by 語(yǔ)句后面。這兩個(gè)問(wèn)題是我在本次實(shí)驗(yàn)中遇到的最大的難題,解決了之后,真的學(xué)習(xí)到了很多。
在本次實(shí)驗(yàn)中,我首先在創(chuàng)建user用戶時(shí)就遇到了,用戶名或角色名是不存在的問(wèn)題,然后我先想著改一下用戶名為users,結(jié)果成功了,后來(lái)才從老師那里得知是用戶過(guò)期了的原因,要重新編輯用戶信息才可以。
然后我在1-4題目中遇到了對(duì)設(shè)置組合主鍵,外鍵操作的不熟練問(wèn)題,還有就是對(duì)于alter table tablename add colname?VARCHAR(20)(添加列);alter table tablename drop column colname(刪除列);alter table tablename drop constraint SYS_C007120;(去除限制)add constraint UQ_CNAME UNIQUE(CNAME)(添加限制);這幾個(gè)操作的不熟練,最后遇到的問(wèn)題是賦值一表的結(jié)構(gòu)到一個(gè)新表(不復(fù)制數(shù)據(jù)),從網(wǎng)上查閱資料后,知道了
最關(guān)鍵的一步是:SELECT * FROM STUDENT WHERE 1=0;設(shè)置一個(gè)不可能的條件,選擇之后,就不會(huì)剩下數(shù)據(jù)了。解決了這些問(wèn)題后,有很大的收獲。
視圖
里面存儲(chǔ)的是SQL語(yǔ)句,不是查詢結(jié)果
創(chuàng)建視圖后不顯示結(jié)果,要通過(guò)select語(yǔ)句來(lái)查詢
視圖的作用:簡(jiǎn)化查詢語(yǔ)句
有些視圖可以更新,有些不可以
SELECT * FROM A NATURAL JOIN B WHERE B.B = A.B;
聯(lián)結(jié)表
sql的left join 、right join 、inner join之間的區(qū)別
left join(左聯(lián)接) 返回包括左表中的所有記錄和右表中聯(lián)結(jié)字段相等的記錄?
right join(右聯(lián)接) 返回包括右表中的所有記錄和左表中聯(lián)結(jié)字段相等的記錄
inner join(等值連接) 只返回兩個(gè)表中聯(lián)結(jié)字段相等的行
左連接 SELECT * FROM student # 主表(不會(huì)受到影響) LEFT JOIN score # 輔表(只有滿足條件的才會(huì)顯示) ON student.ID = score.SID右連接SELECT * FROM student # 主表(只有滿足條件的才會(huì)顯示) RIGHT JOIN score # 輔表(不會(huì)受到影響) ON student.ID = score.SID 全連接(是個(gè)笛卡爾積?) SELECT * FROM student FULL JOIN score select sname, cname, tname, grade --自連接 :只返回兩張表連接列的匹配項(xiàng)。 --以下三種查詢結(jié)果一樣。 select * from student s inner join class c on s.classid=c.id; select * from student s join class c on s.classid=c.id; select * from student s,class c where s.classid=c.id; --笛卡兒乘積連接 :即不加任何條件,達(dá)到 M*N 的結(jié)果集。 --以下兩種查詢結(jié)果一樣。 select * from student s cross join class c; select * from student,class; --加上條件,產(chǎn)生跟自連接一樣的結(jié)果。 select * from student s cross join class c where s.classid=c.id;自然連接要注意:
SELECT * FROM A NATURAL JOIN B WHERE B.B = A.B;
SELECT * FROM A NATURAL JOIN B on B.B = A.B;
這兩種方法都會(huì)報(bào)錯(cuò),不能有限制條件。因?yàn)樽匀贿B接它自動(dòng)的進(jìn)行了等值比較,所以不需要加上限制條件讓他們的連接起來(lái),自然連接是一種特殊的等值連接。
自然連接與等值連接的區(qū)別:
sql server 等值連接和自然連接的 用法_百度知道 (baidu.com)
SELECT * FROM A, B WHERE A.B=B.B;
這是等值連接,相同的屬性列會(huì)保存
自然連接是一種特殊的等值內(nèi)連接,它是由系統(tǒng)根據(jù)兩表的同名字段自動(dòng)作等值比較的內(nèi)連接,不需要用ON關(guān)鍵字指定連接條件
SELECT * FROM A NATURAL JOIN B ;
這是自然連接,自然連接是一種將相同屬性列刪除的等值連接
自然連接四個(gè)表?
FROM STUDENT NATURAL JOIN SCORE NATURAL JOIN COURSE NATURAL JOIN TEACH WHERE COURSE.CNAME='數(shù)學(xué)分析' and TEACH.TNAME='嚴(yán)敏';ANY ALL
ANY ALL的區(qū)別
總結(jié)成一句話就是:all 是滿足所有的, and and and;any 是滿足其中一個(gè)就可以,or or or
2022-實(shí)驗(yàn)三總結(jié)
在這次實(shí)驗(yàn)過(guò)程中遇到的問(wèn)題就很多了,首先第一題就來(lái)了一個(gè)下馬威,分不清三種連接的區(qū)別,搞得無(wú)從下手,最后自己弄了兩個(gè)表才弄懂了前兩個(gè)的區(qū)別,如下圖:等值連接相同的屬性會(huì)保留,而自然連接就會(huì)將它們合并,自然連接是一種特殊的等值連接,終于理解了,自己找了幾個(gè)小時(shí)。還有一個(gè)就是join后面總是忘掉加上on條件,報(bào)了三四次缺少關(guān)鍵字錯(cuò)誤才發(fā)現(xiàn),我學(xué)會(huì)了,做這種題目時(shí)要首先弄清楚概念就很好下手了。然后就是left join 、right join、full join ,區(qū)分這幾個(gè),首先區(qū)分:主表(不會(huì)受到影響),?輔表(只有滿足條件的才會(huì)顯示),left join 左為主表,右輔表;right join 則相反,最后的not exists的雙重否定,更是搞得稀里糊涂,現(xiàn)在還是有點(diǎn)不明白。每一次實(shí)驗(yàn)都是一次不錯(cuò)的成長(zhǎng)。
數(shù)據(jù)放到表中,表再放到庫(kù)中
表中的列相當(dāng)于類中的屬性, 每一行相當(dāng)于對(duì)象
'%'會(huì)過(guò)濾掉空值:
SELECT * FROM XS;
SELECT * FROM XS WHERE REMARKS LIKE '%';
2022-3-30
--2022-3-30 create index idx_xs_sname on xs(sname);--索引只創(chuàng)建,不自己使用,由系統(tǒng)調(diào)用 select * FROM XS WHERE SNAME LIKE '_%'; --視圖:安全(設(shè)置用戶權(quán)限),簡(jiǎn)化使用,保存的是查詢語(yǔ)句 --視圖(VIEW)也被稱作虛表,即虛擬的表,是一組數(shù)據(jù)的邏輯表示,其本質(zhì)是對(duì)應(yīng)于一條SELECT語(yǔ)句, --結(jié)果集被賦予一個(gè)名字,即視圖名字。視圖本身并不包含任何數(shù)據(jù),它只包含映射到基表的一個(gè)查詢語(yǔ)句, --當(dāng)基表數(shù)據(jù)發(fā)生變化,視圖數(shù)據(jù)也隨之變化。 SELECT * FROM XS WHERE DEPT='計(jì)算機(jī)';--創(chuàng)建視圖 --計(jì)算區(qū)分度 SELECT count (DISTINCT(SNAME))/count(*) FROM XS;--計(jì)算區(qū)分度 --WITH CHECK OPTION 子句強(qiáng)制所有數(shù)據(jù)修改語(yǔ)句均根據(jù)視圖執(zhí)行, --以符合定義視圖的 SELECT 語(yǔ)句中所設(shè)的條件。 --WITH CHECK OPTION的作用? --1.對(duì)于update,有with check option,要保證update后,數(shù)據(jù)要被視圖查詢出來(lái); --2.對(duì)于delete,有無(wú)with check option都一樣; --4.對(duì)于insert,有with check option,要保證insert后,數(shù)據(jù)要被視圖查詢出來(lái); --5.對(duì)于沒(méi)有where 子句的視圖,使用with check option是多余的。SELECT *FROM XS; CREATE VIEW DEPT3 AS SELECT *FROM XS WHERE TOTALCREDIT>70 WITH CHECK OPTION; UPDATE DEPT3 SET TOTALCREDIT=60 WHERE SNAME='林一帆';PL/SQL:
PL/SQL也是一種程序語(yǔ)言,叫做過(guò)程化SQL語(yǔ)言(Procedural?Language/SQL)。PL/SQL是Oracle數(shù)據(jù)庫(kù)對(duì)SQL語(yǔ)句的擴(kuò)展。在普通SQL語(yǔ)句的使用上增加了編程語(yǔ)言的特點(diǎn),所以PL/SQL就是把數(shù)據(jù)操作和查詢語(yǔ)句組織在PL/SQL代碼的過(guò)程性單元中,通過(guò)邏輯判斷、循環(huán)等操作實(shí)現(xiàn)復(fù)雜的功能或者計(jì)算的程序語(yǔ)言。PL/SQL是Oracle對(duì)標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)語(yǔ)言SQL的過(guò)程化擴(kuò)充,它將數(shù)據(jù)庫(kù)技術(shù)和過(guò)程化程序設(shè)計(jì)語(yǔ)言聯(lián)系起來(lái)(通俗的說(shuō),SQL與編程語(yǔ)言的混血兒),是一種應(yīng)用開(kāi)發(fā)語(yǔ)言,可使用循環(huán),分支處理數(shù)據(jù),將SQL的數(shù)據(jù)操縱功能與過(guò)程化語(yǔ)言數(shù)據(jù)處理功能結(jié)合起來(lái).PL/SQL的使用,使SQL成為一種高級(jí)程序設(shè)計(jì)語(yǔ)言,支持高級(jí)語(yǔ)言的塊操作,條件判斷,循環(huán)語(yǔ)句,嵌套等,與數(shù)據(jù)庫(kù)核心的數(shù)據(jù)類型集成,使SQL?的程序設(shè)計(jì)效率更高.
select 選擇了一些列之后,如果里面有聚合函數(shù),后面一定要有g(shù)roup函數(shù)否則會(huì)報(bào)錯(cuò),原因如下:
最近寫SQL的時(shí)候,有遇到過(guò)報(bào)出 ORA-00937的問(wèn)題。
解釋:
select 列表項(xiàng)中除了包含聚合函數(shù)外,還包含了表的某些列,那么你將必須使用group by語(yǔ)句,否則語(yǔ)法通不過(guò)。
例如:
SQL>
1 select deptno,job,avg(sal)
2 from emp
3 ;
ERROR 位于第 1 行:
ORA-00937: 非單組分組函數(shù)
其實(shí)這里也非常容易理解,你既然指定了聚合函數(shù),又同時(shí)制定了其他列,還想不按照指定的列來(lái)分組,你到底想讓oracle怎么做呢?
這根本就得不出結(jié)果。就像你需要統(tǒng)計(jì)班上男女生的人數(shù),但是又不能分組,只能在一條數(shù)據(jù)里表示出來(lái),怎么能辦得到呢?
所以這里的group by是必須的。
上面的錯(cuò)誤糾正為:
select deptno,job,avg(sal) from emp group by deptno,job;
就OK了
原文鏈接:聚合函數(shù)與列同時(shí)選擇,需要Group
create sequence table1_id minvalue 1 --自增字段最小值 nomaxvalue --最大值 沒(méi)有就算nomaxvalue increment by 1 --每次增值1 start with 1 --起始值 nocache; --不緩存 CREATE SEQUENCE TABLE_ID--創(chuàng)建順序表 MINVALUE 1--最小值 NOMAXVALUE--無(wú)最大值 INCREMENT BY 1--遞增量 START WITH 1--起始值 NOCACHE;--無(wú)緩存 --第三步:創(chuàng)建觸發(fā)器 create or replace trigger SCORE1trigger before insert on SCORE1 for each row begin select table1_id.nextval into:new.sid from dual; end SCORE1trigger;Mysql中: create table UserTable ( USERID INT(4) PRIMARY KEY AUTO_INCREMENT NOT NULL, UNAME VARCHAR(20) NOT NULL, UPASSWARD VARCHAR(20) NOT NULL )2022-4-2實(shí)驗(yàn)四總結(jié)
在本次實(shí)驗(yàn)中,我首先遇到的問(wèn)題是創(chuàng)建視圖時(shí),帶上WITH CHECK OPTION選項(xiàng)與不帶的區(qū)別:如果根據(jù)視圖來(lái)更改數(shù)據(jù),一定要符合創(chuàng)建視圖的時(shí)候的where 的條件。第二個(gè)是創(chuàng)建兩個(gè)字段的視圖 grade_avg_view,select 選擇了一些列之后,如果里面有聚合函數(shù),后面一定要有g(shù)roup函數(shù)否則會(huì)報(bào)錯(cuò)。最后一個(gè)是設(shè)置自增型的主鍵,在mysql中使用AUTO_INCREMENT 可以直接創(chuàng)建,但是在Oracle中要先創(chuàng)建一個(gè)遞增序列,然后再創(chuàng)建一個(gè)觸發(fā)器才可以。
索引,范式和鎖
索引:每個(gè)表如果設(shè)置了主鍵就會(huì)有有一個(gè)主鍵索引,在Mysql中,使用的時(shí)InnoDB引擎,每一個(gè)索引就是一顆B+樹(shù),也可以創(chuàng)建非主鍵索引,二級(jí)索引,二級(jí)索引和主鍵索引的不同之處在于其葉子節(jié)點(diǎn)上保存的值不一樣,表中所有字段的值都被完整的保存在主鍵索引的葉子節(jié)點(diǎn)上,但是二級(jí)索引的葉子節(jié)點(diǎn)只保存對(duì)應(yīng)主鍵的值。這里的葉子節(jié)點(diǎn)上只保存了主鍵的值,所以還需要通過(guò)獲得的主鍵 ID 值再回到主鍵索引上查出所有字段的值,這個(gè)過(guò)程稱作回表。
創(chuàng)建表時(shí),凡是能通過(guò)計(jì)算出來(lái)的字段都不要把它當(dāng)成屬性列;
創(chuàng)建函數(shù)、過(guò)程
存儲(chǔ)過(guò)程不一定要有返回值,函數(shù)一定要有
注意存儲(chǔ)過(guò)程in out inout 三種參數(shù)類型,而函數(shù)只有in
?創(chuàng)建函數(shù):
CREATE OR REPLACE FUNCTION COUNT_CREDIT(STUNO in VARCHAR2) RETURN NUMBER AS CRED NUMBER:=0; TOTAL_CRED NUMBER:=0; BEGIN FOR STUCUR IN(SELECT SNO, CNO, GRADE FROM cj WHERE SNO=STUNO AND GRADE>=60) LOOP SELECT CREDIT INTO CRED FROM KC WHERE CNO=STUCUR.CNO; TOTAL_CRED:=TOTAL_CRED+CRED; END LOOP; RETURN TOTAL_CRED; END COUNT_CREDIT;作業(yè) create or replace function count_credit(stuno in varchar2) return varchar2 as cred number:=0; total_cred number:=0; beginfor stucur in(select sno, cno, grade from score where sno=stuno and grade >60) loopselect credit into cred from course where cno=stucur.cno;total_cred:=total_cred+cred;end loop;return total_cred; end count_credit;函數(shù)的執(zhí)行: 1、select COUNT_CREDIT('96001') as total_credit from dual; 2、variable a number(10, 0)--聲明變量 begin :a:=COUNT_CREDIT('96001'); end; / 后面加上一句: print a;創(chuàng)建過(guò)程:
create or replace procedure count_credi (stusno in varchar2 , creditj out number )--warning:in out as cred number:=0; total_cred number:=0; begin for cjcur in (select * from cj where sno= stusno) loop select credit into cred from kc where cno=cjcur.cno; total_cred:=total_cred+cred*cjcur.grade; end loop; creditj:=total_cred/count_credit(stusno); end count_credi;作業(yè) create or replace procedure pro_findname(tmpname in VARCHAR2) as beginfor stucur in(select sno,sname from student where sname like tmpname ) loopdbms_output.put_line(stucur.sno || '' ||stucur.sname);-- end loop;null; end pro_findname;set serveroutput off 1、set serveroutput on beginpro_findname('%馬%'); end; / 2、exec pro_findname('%馬%');--注意這里的調(diào)用時(shí)使用%,而不是在存儲(chǔ)過(guò)程中觸發(fā)器:
觸發(fā)器的用法
觸發(fā)器與存儲(chǔ)過(guò)程和函數(shù)不同,函數(shù)和存儲(chǔ)過(guò)程需要用戶顯示調(diào)用,觸發(fā)器時(shí)在某個(gè)事件發(fā)生時(shí),自動(dòng)的隱式的完成,所以叫觸發(fā)或者點(diǎn)火(firing)
create or replace trigger sum_credit after insert on score for each row beginupdate student set TOTALCREDIT=TOTALCREDIT+(select credit from course where cno=:new.cno)where sno=:new.sno and :new.grade>60;null; end;觸發(fā)器的語(yǔ)法?
create trigger <觸發(fā)器名稱> { before | after} # 之前或者之后出發(fā) insert | update | delete # 指明了激活觸發(fā)程序的語(yǔ)句的類型 on <表名> # 操作哪張表 for each row # 觸發(fā)器的執(zhí)行間隔,for each row --通知觸發(fā)器每隔一行執(zhí)行一次動(dòng)作, --而不是對(duì)整個(gè)表執(zhí)行一次。 <觸發(fā)器SQL語(yǔ)句>dbms_output.put_line的用法
涉及到的知識(shí)點(diǎn)如下: 1、enable:在serveroutput on的情況下,用來(lái)使dbms_output生效(默認(rèn)即打開(kāi)) 2、disable:在serveroutput on的情況下,用來(lái)使dbms_output失效 3、put:將內(nèi)容寫到內(nèi)存,等到put_line時(shí)一起輸出 4、put_line:不用多說(shuō)了,輸出字符 5、new_line:作為一行的結(jié)束,可以理解為寫入buffer時(shí)的換行符 6、get_line(value, index):獲取緩沖區(qū)的單行信息 7、get_lines(array, index):以數(shù)組形式來(lái)獲取緩沖區(qū)的多行信息
oracle系統(tǒng)包—-dbms_output用法
博客
E-R圖轉(zhuǎn)關(guān)系模式
轉(zhuǎn)為關(guān)系模式
?
總結(jié)
以上是生活随笔為你收集整理的Oracle数据库的基础的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 中国移动手机话费查询号码1008611
- 下一篇: MySQL——索引与EXPLAIN