需求:現(xiàn)有表dw,里面字段bm(編碼),sj(上級(jí)編碼),
創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站與策劃設(shè)計(jì),紅塔網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:紅塔等地區(qū)。紅塔做網(wǎng)站價(jià)格咨詢:13518219792
新增字段px,要求在新字段中添加字符串,字符串為單位的級(jí)聯(lián)上級(jí)及自身,
并從頂向下,從左到右排序,中間以“|”分割。
如:?jiǎn)挝淮a為005,上級(jí)單位代碼為004,
單位004的上級(jí)單位單面是003,單位003的上級(jí)代碼是002,
單位002的上級(jí)是最上級(jí)單位001。
則取出數(shù)據(jù)應(yīng)為:"001|002|003|004|005"
實(shí)現(xiàn):
1 首先取得某一單位的級(jí)聯(lián)上級(jí)的數(shù)據(jù)
可以通過(guò)sql:
select sj
from dw T
START WITH T.bm=:BM
CONNECT BY PRIOR T.sjbm=T.bm ;
取出該單位的所有級(jí)聯(lián)上級(jí)的單位編碼
2 通過(guò)管道函數(shù)能列出某個(gè)單位的級(jí)聯(lián)單位代碼及自身單位代碼并返回結(jié)果集
create or replace FUNCTION upbm
(
bm_IN IN VARCHAR2
) RETURN bm_DATA pipelined
-----通過(guò)單位編碼和單位分類取得上級(jí)單位編碼(包括自己)數(shù)據(jù)集
AS
bm_ROW yly_row_type;
bm_TAB bm_DATA;
BEGIN
FOR MYROW IN (
select sjbm
from dw T
START WITH T.bm=bm_IN
CONNECT BY PRIOR T.sj=T.bm
UNION ALL
SELECT bm
FROM dw
WHERE bm=bm_IN
ORDER BY 1
) LOOP
bm_ROW := YLY_ROW_TYPE(MYROW.sj);
PIPE ROW (bm_ROW);
END LOOP;
RETURN;
END upbm;
這時(shí)通過(guò)select * from table(getupperdeptwitchself(:bm)),取得數(shù)據(jù)集。
001
002
003
004
005
3 通過(guò)函數(shù)把取得的數(shù)據(jù)集轉(zhuǎn)換為一行
可以通過(guò)wm_concat函數(shù),該函數(shù)把輸入的結(jié)果集轉(zhuǎn)換為1行并以","分割,需要轉(zhuǎn)換為"|"
create or replace FUNCTION upbm_px
(
bm_IN IN VARCHAR2
) RETURN VARCHAR2 AS
px VARCHAR2(400);
BEGIN
SELECT replace(wm_concat(bm),',','|') INTO px from table(upbm(bm_IN));
RETURN px;
END upbm_px;
這時(shí)通過(guò)函數(shù)即可得到一行數(shù)據(jù):
select GET_UPPERDEPT_PX(bm) from dual;
得到數(shù)據(jù): "001|002|003|004|005"
這時(shí)已基本完成需求。
接下來(lái)制作觸發(fā)器,使表在插入時(shí)自動(dòng)生成sjbm_xp數(shù)據(jù)。
4 創(chuàng)建觸發(fā)器
create or replace TRIGGER "dw_SJ_TRG"
before insert on dw
for each row
declare
begin
--插入數(shù)據(jù)時(shí)生成px字段
:NEW.px :=upbm_px(:NEW.bm);
end;
但是在插入時(shí)報(bào)錯(cuò):ORA-04091:表dw發(fā)生了變化 觸發(fā)器/函數(shù)不能讀表
問(wèn)題原因:oracle執(zhí)行DML語(yǔ)句時(shí)需要顯示進(jìn)行提交操作。當(dāng)我們進(jìn)行插入時(shí)會(huì)觸發(fā)觸發(fā)器
執(zhí)行對(duì)觸發(fā)器作用表和擴(kuò)展表,但這時(shí)觸發(fā)器和插入表在同一事物中,插入語(yǔ)句
沒(méi)有提交時(shí)無(wú)法對(duì)觸發(fā)器表進(jìn)行額外操作。
解決方法:
把觸發(fā)器改為顯示提交
create or replace TRIGGER "dw_SJ_TRG"
before insert on dw
for each row
declare
pragma autonomous_transaction;
begin
--插入數(shù)據(jù)時(shí)生成px字段
:NEW.px :=GET_UPPERDEPT_PX(:NEW.bm);
commit;
end;
5 全表更新
把表dw的所有行的px字段補(bǔ)全
UPDATE dw SET px=GET_UPPERDEPT_PX(bm);
這時(shí)報(bào)錯(cuò):ORA-04091:表dw發(fā)生了變化 觸發(fā)器/函數(shù)不能讀表
錯(cuò)誤原因與剛剛類似:
要更新的表是dw,取得結(jié)果集的函數(shù)upbm依靠dw進(jìn)行循環(huán)計(jì)算,
而更新之后循環(huán)的來(lái)源已經(jīng)產(chǎn)生變化,ORACLE不允許這樣,可能會(huì)產(chǎn)生無(wú)限循環(huán)。
解決辦法: 創(chuàng)建新表數(shù)據(jù)dw_BAK與dw表一致,把upbm函數(shù)中的
來(lái)源表從dw改為dw_BAK.
執(zhí)行語(yǔ)句 UPDATE dw SET px=GET_UPPERDEPT_PX(bm);
提交后把函數(shù)upbm的來(lái)源改回dw.
網(wǎng)站題目:創(chuàng)建生成級(jí)聯(lián)上級(jí)字符的函數(shù)
URL地址:http://chinadenli.net/article40/pijdho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、自適應(yīng)網(wǎng)站、ChatGPT、網(wǎng)頁(yè)設(shè)計(jì)公司、全網(wǎng)營(yíng)銷推廣、網(wǎng)站導(dǎo)航
聲明:本網(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)