欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

創(chuàng)建生成級(jí)聯(lián)上級(jí)字符的函數(shù)

需求:現(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)

成都seo排名網(wǎng)站優(yōu)化