oracle遞歸怎么終止 oracle 遞歸刪除

關(guān)于oracle遞歸調(diào)用的自定義函數(shù)如何結(jié)束

關(guān)于oracle遞歸調(diào)用的自定義函數(shù)如何結(jié)束

創(chuàng)新互聯(lián)建站是一家專注于網(wǎng)站建設(shè)、網(wǎng)站制作與策劃設(shè)計(jì),南豐網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:南豐等地區(qū)。南豐做網(wǎng)站價(jià)格咨詢:13518219792

可以調(diào)用。 C語(yǔ)言最基本的模塊為函數(shù),任意函數(shù)都可以調(diào)用其它任意一個(gè)函數(shù),包括函數(shù)本身。 1、自定義函數(shù)調(diào)用其它自定義函數(shù)的例子:pre t="code" l="cpp"#include stdio.h

oracle start with connect by nocyle問(wèn)題

oracle中的select語(yǔ)句可以用START WITH...CONNECT BY PRIOR子句實(shí)現(xiàn)遞歸查詢,connect by 是結(jié)構(gòu)化查詢中用到的,其基本語(yǔ)法是:

select * from tablename start with cond1

connect by cond2

where cond3;

簡(jiǎn)單說(shuō)來(lái)是將一個(gè)樹狀結(jié)構(gòu)存儲(chǔ)在一張表里,比如一個(gè)表中存在兩個(gè)字段:

id,parentid那么通過(guò)表示每一條記錄的parent是誰(shuí),就可以形成一個(gè)樹狀結(jié)構(gòu)。

用上述語(yǔ)法的查詢可以取得這棵樹的所有記錄。

其中COND1是根結(jié)點(diǎn)的限定語(yǔ)句,當(dāng)然可以放寬限定條件,以取得多個(gè)根結(jié)點(diǎn),實(shí)際就是多棵樹。

COND2是連接條件,其中用PRIOR表示上一條記錄,比如 CONNECT BY PRIOR ID=PRAENTID就是說(shuō)上一條記錄的ID是本條記錄的PRAENTID,即本記錄的父親是上一條記錄。

COND3是過(guò)濾條件,用于對(duì)返回的所有記錄進(jìn)行過(guò)濾。

對(duì)于oracle進(jìn)行簡(jiǎn)單樹查詢(遞歸查詢)

DEPTID NUMBER 部門id

PAREDEPTID NUMBER 父部門id(所屬部門id)

NAME CHAR (40 Byte) 部門名稱

通過(guò)子節(jié)點(diǎn)向根節(jié)點(diǎn)追朔.

select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid

通過(guò)根節(jié)點(diǎn)遍歷子節(jié)點(diǎn).

select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid

可通過(guò)level 關(guān)鍵字查詢所在層次.

select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid

PS:start with 后面所跟的就是就是遞歸的種子,也就是遞歸開始的地方;

connect by prior后面的字段順序是有講究的;

若prior缺?。簞t只能查詢到符合條件的起始行,并不進(jìn)行遞歸查詢;

例:

select * from table

start with org_id = 'HBHqfWGWPy'

connect by prior org_id = parent_id;

簡(jiǎn)單說(shuō)來(lái)是將一個(gè)樹狀結(jié)構(gòu)存儲(chǔ)在一張表里,比如一個(gè)表中存在兩個(gè)字段:

org_id,parent_id那么通過(guò)表示每一條記錄的parent是誰(shuí),就可以形成一個(gè)樹狀結(jié)構(gòu)。

用上述語(yǔ)法的查詢可以取得這棵樹的所有記錄。

其中:

條件1 是根結(jié)點(diǎn)的限定語(yǔ)句,當(dāng)然可以放寬限定條件,以取得多個(gè)根結(jié)點(diǎn),實(shí)際就是多棵樹。

條件2 是連接條件,其中用PRIOR表示上一條記錄,

比如 CONNECT BY PRIOR org_id = parent_id就是說(shuō)上一條記錄的org_id 是本條記錄的parent_id,即本記錄的父親是上一條記錄。

條件3 是過(guò)濾條件,用于對(duì)返回的所有記錄進(jìn)行過(guò)濾。

簡(jiǎn)單介紹如下:

在掃描樹結(jié)構(gòu)表時(shí),需要依此訪問(wèn)樹結(jié)構(gòu)的每個(gè)節(jié)點(diǎn),一個(gè)節(jié)點(diǎn)只能訪問(wèn)一次,其訪問(wèn)的步驟如下:

第一步:從根節(jié)點(diǎn)開始;

第二步:訪問(wèn)該節(jié)點(diǎn);

第三步:判斷該節(jié)點(diǎn)有無(wú)未被訪問(wèn)的子節(jié)點(diǎn),若有,則轉(zhuǎn)向它最左側(cè)的未被訪問(wèn)的子節(jié)點(diǎn),并執(zhí)行第二步,否則執(zhí)行第四步;

第四步:若該節(jié)點(diǎn)為根節(jié)點(diǎn),則訪問(wèn)完畢,否則執(zhí)行第五步;

第五步:返回到該節(jié)點(diǎn)的父節(jié)點(diǎn),并執(zhí)行第三步驟。

總之:掃描整個(gè)樹結(jié)構(gòu)的過(guò)程也即是中序遍歷樹的過(guò)程。

1. 樹結(jié)構(gòu)的描述

樹結(jié)構(gòu)的數(shù)據(jù)存放在表中,數(shù)據(jù)之間的層次關(guān)系即父子關(guān)系,通過(guò)表中的列與列間的關(guān)系來(lái)描述,如 EMP 表中的 EMPNO 和 MGR 。 EMPNO 表示該雇員的編號(hào), MGR 表示領(lǐng)導(dǎo)該雇員的人的編號(hào),即子節(jié)點(diǎn)的 MGR 值等于父節(jié)點(diǎn)的 EMPNO 值。在表的每一行中都有一個(gè)表示父節(jié)點(diǎn)的 MGR (除根節(jié)點(diǎn)外),通過(guò)每個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn),就可以確定整個(gè)樹結(jié)構(gòu)。

在 SELECT 命令中使用 CONNECT BY 和 START WITH 子句可以查詢表中的樹型結(jié)構(gòu)關(guān)系。其命令格式如下:

SELECT 。。。

CONNECT BY {PRIOR 列名 1= 列名 2| 列名 1=PRIOR 裂名 2}

[START WITH] ;

其中: CONNECT BY 子句說(shuō)明每行數(shù)據(jù)將是按層次順序檢索,并規(guī)定將表中的數(shù)據(jù)連入樹型結(jié)構(gòu)的關(guān)系中。 PRIORY 運(yùn)算符必須放置在連接關(guān)系的兩列中某一個(gè)的前面。對(duì)于節(jié)點(diǎn)間的父子關(guān)系, PRIOR 運(yùn)算符在一側(cè)表示父節(jié)點(diǎn),在另一側(cè)表示子節(jié)點(diǎn),從而確定查找樹結(jié)構(gòu)是的順序是自頂向下還是自底向上。在連接關(guān)系中,除了可以使用列名外,還允許使用列表達(dá)式。 START WITH 子句為可選項(xiàng),用來(lái)標(biāo)識(shí)哪個(gè)節(jié)點(diǎn)作為查找樹型結(jié)構(gòu)的根節(jié)點(diǎn)。若該子句被省略,則表示所有滿足查詢條件的行作為根節(jié)點(diǎn)。

START WITH: 不但可以指定一個(gè)根節(jié)點(diǎn),還可以指定多個(gè)根節(jié)點(diǎn)。

2. 關(guān)于 PRIOR

運(yùn)算符 PRIOR 被放置于等號(hào)前后的位置,決定著查詢時(shí)的檢索順序。

PRIOR 被置于 CONNECT BY 子句中等號(hào)的前面時(shí),則強(qiáng)制從根節(jié)點(diǎn)到葉節(jié)點(diǎn)的順序檢索,即由父節(jié)點(diǎn)向子節(jié)點(diǎn)方向通過(guò)樹結(jié)構(gòu),我們稱之為自頂向下 的方式。如:

CONNECT BY PRIOR EMPNO=MGR

PIROR 運(yùn)算符被置于 CONNECT BY 子句中等號(hào)的后面時(shí),則強(qiáng)制從葉節(jié)點(diǎn)到根節(jié)點(diǎn)的順序檢索,即由子節(jié)點(diǎn)向父節(jié)點(diǎn)方向通過(guò)樹結(jié)構(gòu),我們稱之為自底向上 的方式。例如:

CONNECT BY EMPNO=PRIOR MGR

在這種方式中也應(yīng)指定一個(gè)開始的節(jié)點(diǎn)。

3. 定義查找起始節(jié)點(diǎn)

在自頂向下查詢樹結(jié)構(gòu)時(shí),不但可以從根節(jié)點(diǎn)開始,還可以定義任何節(jié)點(diǎn)為起始節(jié)點(diǎn),以此開始向下查找。這樣查找的結(jié)果就是以該節(jié)點(diǎn)為開始的結(jié)構(gòu)樹的一枝。

4.使用 LEVEL

在具有樹結(jié)構(gòu)的表中,每一行數(shù)據(jù)都是樹結(jié)構(gòu)中的一個(gè)節(jié)點(diǎn),由于節(jié)點(diǎn)所處的層次位置不同,所以每行記錄都可以有一個(gè)層號(hào)。層號(hào)根據(jù)節(jié)點(diǎn)與根節(jié)點(diǎn)的距離確定。不論從哪個(gè)節(jié)點(diǎn)開始,該起始根節(jié)點(diǎn)的層號(hào)始終為 1 ,根節(jié)點(diǎn)的子節(jié)點(diǎn)為 2 , 依此類推。

5.節(jié)點(diǎn)和分支的裁剪

在對(duì)樹結(jié)構(gòu)進(jìn)行查詢時(shí),可以去掉表中的某些行,也可以剪掉樹中的一個(gè)分支,使用 WHERE 子句來(lái)限定樹型結(jié)構(gòu)中的單個(gè)節(jié)點(diǎn),以去掉樹中的單個(gè)節(jié)點(diǎn),但它卻不影響其后代節(jié)點(diǎn)(自頂向下檢索時(shí))或前輩節(jié)點(diǎn)(自底向頂檢索時(shí))。

6.排序顯示

象在其它查詢中一樣,在樹結(jié)構(gòu)查詢中也可以使用 ORDER BY 子句,改變查詢結(jié)果的顯示順序,而不必按照遍歷樹結(jié)構(gòu)的順序。

本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:

oracle 中怎樣遞歸查詢出子節(jié)點(diǎn)的最上層父節(jié)點(diǎn),并且其父節(jié)點(diǎn)是自身

1、創(chuàng)建測(cè)試表,create table test_connect(id number, p_id number);

2、插入測(cè)試數(shù)據(jù),

insert into test_connect values(1,1);

insert into test_connect values(2,1);

insert into test_connect values(3,2);

insert into test_connect values(4,3);

commit;

3、查詢數(shù)據(jù)表內(nèi)容,select * from?test_connect ,

4、執(zhí)行遞歸查詢語(yǔ)句,加入nocycle要素,不會(huì)出現(xiàn)【ORA-01436: 用戶數(shù)據(jù)中的 CONNECT BY 循環(huán)的錯(cuò)誤】,執(zhí)行結(jié)果如下,

select *

from test_connect t

start with id = 4

connect by nocycle prior t.p_id = t.id

oracle觸發(fā)器遞歸

一 觸發(fā)器介紹

觸發(fā)器是一種特殊的存儲(chǔ)過(guò)程,它在插入,刪除或修改特定表中的數(shù)據(jù)時(shí)觸發(fā)執(zhí)行,它比數(shù)據(jù)庫(kù)本身標(biāo)準(zhǔn)的功能有更精細(xì)和更復(fù)雜的數(shù)據(jù)控制能力。數(shù)據(jù)庫(kù)觸發(fā)器有以下的作用:

* 安全性??梢曰跀?shù)據(jù)庫(kù)的值使用戶具有操作數(shù)據(jù)庫(kù)的某種權(quán)利。

# 可以基于時(shí)間限制用戶的操作,例如不允許下班后和節(jié)假日修改數(shù)據(jù)庫(kù)數(shù)據(jù)。

# 可以基于數(shù)據(jù)庫(kù)中的數(shù)據(jù)限制用戶的操作,例如不允許股票的價(jià)格的升幅一次超過(guò)10%。

* 審計(jì)??梢愿櫽脩魧?duì)數(shù)據(jù)庫(kù)的操作。

# 審計(jì)用戶操作數(shù)據(jù)庫(kù)的語(yǔ)句。

# 把用戶對(duì)數(shù)據(jù)庫(kù)的更新寫入審計(jì)表。

* 實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)完整性規(guī)則。

# 實(shí)現(xiàn)非標(biāo)準(zhǔn)的數(shù)據(jù)完整性檢查和約束。觸發(fā)器可產(chǎn)生比規(guī)則更為復(fù)雜的限制。與規(guī)則不同,觸發(fā)器可以引用列或數(shù)據(jù)庫(kù)對(duì)象。例如,觸發(fā)器可回退任何企圖吃進(jìn)超過(guò)自己保證金的期貨。

# 提供可變的缺省值。

* 實(shí)現(xiàn)復(fù)雜的非標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)相關(guān)完整性規(guī)則。觸發(fā)器可以對(duì)數(shù)據(jù)庫(kù)中相關(guān)的表進(jìn)行連環(huán)更新。例如,在auths表author_code列上的刪除觸發(fā)器可導(dǎo)致相應(yīng)刪除在其它表中的與之匹配的行。

# 在修改或刪除時(shí)級(jí)聯(lián)修改或刪除其它表中的與之匹配的行。

# 在修改或刪除時(shí)把其它表中的與之匹配的行設(shè)成NULL值。

# 在修改或刪除時(shí)把其它表中的與之匹配的行級(jí)聯(lián)設(shè)成缺省值。

# 觸發(fā)器能夠拒絕或回退那些破壞相關(guān)完整性的變化,取消試圖進(jìn)行數(shù)據(jù)更新的事務(wù)。當(dāng)插入一個(gè)與其主健不匹配的外部鍵時(shí),這種觸發(fā)器會(huì)起作用。例如,可以在 books.author_code列上生成一個(gè)插入觸發(fā)器,如果新值與auths.author_code列中的某值不匹配時(shí),插入被回退。

* 同步實(shí)時(shí)地復(fù)制表中的數(shù)據(jù)。

* 自動(dòng)計(jì)算數(shù)據(jù)值,如果數(shù)據(jù)的值達(dá)到了一定的要求,則進(jìn)行特定的處理。例如,如果公司的帳號(hào)上的資金低于5萬(wàn)元?jiǎng)t立即給財(cái)務(wù)人員發(fā)送警告數(shù)據(jù)。

ORACLE與SYBASE數(shù)據(jù)庫(kù)的觸發(fā)器有一定的區(qū)別,下面將分別講述這兩種數(shù)據(jù)庫(kù)觸發(fā)器的作用和寫法。

二 ORACLE 觸發(fā)器

ORACLE產(chǎn)生數(shù)據(jù)庫(kù)觸發(fā)器的語(yǔ)法為:

create [or replace] trigger 觸發(fā)器名 觸發(fā)時(shí)間 觸發(fā)事件

on 表名

[for each row]

pl/sql 語(yǔ)句

其中:

觸發(fā)器名:觸發(fā)器對(duì)象的名稱。由于觸發(fā)器是數(shù)據(jù)庫(kù)自動(dòng)執(zhí)行的,因此該名稱只是一個(gè)名稱,沒(méi)有實(shí)質(zhì)的用途。

觸發(fā)時(shí)間:指明觸發(fā)器何時(shí)執(zhí)行,該值可?。?/p>

before---表示在數(shù)據(jù)庫(kù)動(dòng)作之前觸發(fā)器執(zhí)行;

after---表示在數(shù)據(jù)庫(kù)動(dòng)作之后出發(fā)器執(zhí)行。

觸發(fā)事件:指明哪些數(shù)據(jù)庫(kù)動(dòng)作會(huì)觸發(fā)此觸發(fā)器:

insert:數(shù)據(jù)庫(kù)插入會(huì)觸發(fā)此觸發(fā)器;

update:數(shù)據(jù)庫(kù)修改會(huì)觸發(fā)此觸發(fā)器;

delete:數(shù)據(jù)庫(kù)刪除會(huì)觸發(fā)此觸發(fā)器。

表 名:數(shù)據(jù)庫(kù)觸發(fā)器所在的表。

for each row:對(duì)表的每一行觸發(fā)器執(zhí)行一次。如果沒(méi)有這一選項(xiàng),則只對(duì)整個(gè)表執(zhí)行一次。

舉例:下面的觸發(fā)器在更新表auths之前觸發(fā),目的是不允許在周末修改表:

create trigger auth_secure

before insert or update or delete //對(duì)整表更新前觸發(fā)

on auths

begin

if(to_char(sysdate,'DY')='SUN'

RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表auths');

end if;

end

三 SYBASE數(shù)據(jù)庫(kù)觸發(fā)器

SYBASE數(shù)據(jù)庫(kù)觸發(fā)器的作用與ORACLE非常類似,僅有較小的差異。

SYBASE產(chǎn)生觸發(fā)器的語(yǔ)法為:

CREATE TRIGGER 觸發(fā)器名

ON 表名

FOR INSERT,UPDATE,DELETE

AS

SQL_statement |

FOR INSERT,UPDATE

AS

IF UPDATE(column_name) [AND|OR UPDATE(column_name)]...

SQL_statements

上面FOR子句用來(lái)指定在觸發(fā)器上的哪些數(shù)據(jù)更新命令可激活該觸發(fā)器。IF UPDATE子句檢查對(duì)指定列的操作類型,在IF UPDATE子句中可指定多個(gè)列。

與ORACLE不同,對(duì)于每條SQL語(yǔ)句,觸發(fā)器只執(zhí)行一次。觸發(fā)器在數(shù)據(jù)更新語(yǔ)句完成以后立即執(zhí)行。觸發(fā)器和啟動(dòng)它的語(yǔ)句被當(dāng)作一個(gè)事務(wù)處理,事務(wù)可以在觸發(fā)器中回退。

下面舉例說(shuō)明SYBASE觸發(fā)器的寫法。

create trigger forinsert_books

on books

for insert

as

if(select count(*) from auths,inserted

where auths.author_code=insert.author_code)!=@@rowcount

begin

rollback transaction

print "books 表中 author_code 列的值在auths 表中不存在。"

oracle 如何終止存儲(chǔ)過(guò)程的運(yùn)行!

select * from v$access a where object like '存儲(chǔ)過(guò)程名%' --存儲(chǔ)過(guò)程名為大寫字母

select * from v$session where sid=74 --74為上一個(gè)查詢得到的SID值,可能是多個(gè),這里找到他們對(duì)應(yīng)的serial#值

alter system kill session '74,118' --參數(shù)為'sid,serial#',用于停止這個(gè)回話,同時(shí)也終止了存儲(chǔ)過(guò)程

文章題目:oracle遞歸怎么終止 oracle 遞歸刪除
鏈接分享:http://www.muchs.cn/article14/hggege.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、手機(jī)網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)