日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Oracle中對(duì)COLUMNS_UPDATED()返回值解析

瀏覽:36日期:2023-11-14 09:51:56
本文具體講述了Oracle中對(duì)COLUMNS_UPDATED()返回值解析。 需求來源 客戶要求[某些特定的表]能[自定義預(yù)警報(bào)告]。 (在特定的表上)用戶可定義某些字段有修改時(shí),向有關(guān)用戶發(fā)出消息警報(bào)<內(nèi)容大致是 xx 單據(jù)的 xx 單號(hào)的xx字段由 old 變?yōu)榱?new>。最終目的是由消息控制模塊向消息接收人報(bào)告這一變更。 基礎(chǔ)知識(shí): COLUMNS_UPDATED()是一個(gè)僅可在 Insert or Update trigger 中調(diào)用的方法。 該方法返回 一個(gè) varbinary 的值, 存儲(chǔ)了當(dāng)次Insert 或是Update 觸發(fā)器所對(duì)應(yīng)的記錄在哪些字段上發(fā)生了Inserted or updated。在SQLSERVER 的聯(lián)機(jī)幫助[CREATE TRIGGER]和[IF UPDATE] 中有對(duì) COLUMNS_UPDATED () 方法的簡(jiǎn)要描述。 公司要求用Trigger 實(shí)現(xiàn): (為每個(gè)[特定的表]編寫一個(gè)特定的UPDATE 觸發(fā)器。)主要難點(diǎn)是窮舉IF UPDATE(column)的方法不可行。其它業(yè)務(wù)實(shí)現(xiàn)無問題。后來仔細(xì)琢磨COLUMNS_UPDATED() 所返回的值,問題得到解決。 這里只是講述對(duì)COLUMNS_UPDATED()所返回的值的解析和運(yùn)用,就不考慮用戶指定變更字段及插入記錄到消息表的那部分實(shí)現(xiàn)過程了。 測(cè)試數(shù)據(jù)預(yù)備 If exists(select * from sysobjects where id=object_id(N'[dbo].[T_Test]') and xtype = 'u')DROP Table T_TestgoCREATE Table T_Test (f_idint IDENTITY(1, 1) Primary Key,f_charChar(8) default '',f_varchar  varchar(8) default '',f_nvarchar  nvarchar(8) default '',f_datetime  datetime default getdate(),f_intint default 0,f_bigint  bigint default 0,f_decimal  decimal(18, 6) default 0.00,f_number  numeric(18, 6) default 0.00,f_floatfloat default 0.00)goINSERT INTO T_Test (f_char) values('001')INSERT INTO T_Test (f_char) values('002') go ; 編寫Update 觸發(fā)器 If exists(select * from sysobjects where id=object_id(N'[dbo].[Tri_Test_Upd]') and objectproperty(id,N'istrigger')=1)DROP TRIGGER Tri_Test_UpdgoCREATE TRIGGER Tri_Test_Upd ON T_Test --WITH ENCRYPTIONFOR UPDATEASDECLARE @iRowCnt INTSET @iRowCnt = @@rowcountIF @iRowCnt < 1 RETURNDECLARE @sTable VARCHAR(128), @sPKName VARCHAR(32), @sColName VARCHAR(128)DECLARE @iColCnt INT, @iColId INTDECLARE @iTINYINT, @jTINYINT, @iSegment TINYINT, @iVal  TINYINT, @iLog2 TINYINTDECLARE @sSQL VARCHAR(8000)SET @sTable = 't_test'SET @sPKName = 'f_id'-- 求得當(dāng)前表列個(gè)數(shù)SELECT @iColCnt = Count(1) FROM syscolumns WHERE id = object_id(@sTable)-- 以8 個(gè)字段為一小段SET @iSegment = CASE  WHEN @iColCnt / 8 = @iColCnt / 8.0THEN @iColCnt / 8ELSE @iColCnt / 8 + 1END-- 將數(shù)據(jù)存入 臨時(shí)表SELECT * INTO #Inserted FROM InsertedSELECT * INTO #Deleted FROM Deleted-- 中間處理數(shù)據(jù)用CREATE TABLE #Temp(f_PKVal varchar(254) not null primary key,f_OldVal varchar(254),f_NewVal varchar(254))SET @i = 0WHILE @i < @iSegment BEGIN IF @iColCnt < 9 SET @iVal= COLUMNS_UPDATED() ELSE SET @iVal= SubString(COLUMNS_UPDATED(), @i + 1, 1) -- 等于0, 則表示當(dāng)前小節(jié)所對(duì)應(yīng)的8個(gè)字段無一被改. IF @iVal = 0 BEGIN SET @i = @i + 1 CONTINUE END WHILE @iVal > 0 BEGIN SET @j = 0 SET @iLog2 = @iVal / 2 WHILE @iLog2 > 0  BEGIN  SET @j = @j + 1  SET @iLog2 = @iLog2 / 2  END -- 得到被Update 的 列ID SET @iColId = 8 * @i + @j + 1 -- 將Update列名 賦予 @sColName SELECT @sColName = S.name   FROM Inserted as I, Deleted as D, Syscolumns as S WHERE I.F_id = D.F_id  AND S.id = object_id(@sTable)  AND S.colid = @iColId Truncate table #Temp -- 拼成動(dòng)態(tài)語句 SET @sSQL = 'INSERT INTO #Temp (f_PkVal, f_OldVal, f_NewVal) ' +   'SELECT Convert( varchar(200), I.' + @sPkName + '), ' +   'Convert( varchar(200), D.' + @sColName + '), ' +   'Convert( varchar(200), I.' + @sColName + ') ' + 'FROM #Inserted as I, #Deleted as D ' + 'WHERE I.' + @sPKName + ' = D.' + @sPKName + ' AND I.' + @sColName + ' <> D.' + @sColName EXEC(@sSQL) -- 測(cè)試輸出  Select f_pkVal, @sColName as f_column_name, f_oldVal, f_newVal FROM #temp -- 實(shí)際上用 將信息處理后插入消息表 /* ..... INSERT INTO T_Message(....)  SELECT 要組織的內(nèi)容FROM #temp */ SET @iVal = @iVal - Power(2, @j) END SET @i = @i + 1 ENDDROP TABLE #InsertedDROP TABLE #DeletedDROP TABLE #Temp go ; 測(cè)試數(shù)據(jù) Update T_test Set f_datetime = getdate(), f_float = 0.0123, f_int= 1-- 上面Update 語句共修改了三個(gè)列-- 實(shí)際輸出1.)1 f_int 0 12 f_int 0 12.)1 f_datetime May 15 2004 5:30PM May 15 2004 5:31PM2 f_datetime May 15 2004 5:30PM May 15 2004 5:31PM3.)1 f_float 0 0.0123 2 f_float 0 0.0123 算法 COLUMNS_UPDATED()方法返回的 varbinary,是以每個(gè)小節(jié)存儲(chǔ)8個(gè)字段(的修改狀態(tài))的方式記錄了當(dāng)前觸發(fā)器所有列的修改情形。因此程序以8個(gè)字段為一片段來循環(huán)處理所有字段。 SET @iVal= SubString(COLUMNS_UPDATED(), @i + 1, 1)程序用上面語句將一小節(jié)轉(zhuǎn)化為整型,測(cè)試發(fā)現(xiàn):(當(dāng)且謹(jǐn)當(dāng)這一小片只有一個(gè)字段有修改時(shí)): 1,@iVal = 1 = 2^(1-1);2,@iVal = 2 = 2^(2-1);3,@iVal = 4 = 2^(3-1);4,@iVal = 8 = 2^(4-11);5,@iVal = 16 = 2^(5-1);6,@iVal = 32 = 2^(6-1);7,@iVal = 64 = 2^(7-1); 8,@iVal = 128 = 2^(8-1); 而當(dāng)且謹(jǐn)當(dāng)1,2個(gè)字段有修改時(shí): @iVal = 2^(1-1) + 2^(2-1) = 3; 而第 2,5,8 三個(gè)字段有修改時(shí): @iVal = 2^(2-1) + 2^(5-1) + 2^(8-1) = 146; ... 當(dāng)8個(gè)字段都有修改時(shí): @iVal = 2^(1-1) + 2^(2-1) + ... + 2^(8-1) = 255; 也就是說 無論怎樣修改,@iVal的值,不外乎是2^n - 1(n>0 and n <9, int)這一數(shù)組型成的[和組合](組合時(shí)每個(gè)數(shù)組成員最多出現(xiàn)一次)。因此反過來推算: 對(duì) @iVal 按 2^n分解, 就可算得被修改列的列表。
標(biāo)簽: Oracle 數(shù)據(jù)庫
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
91精品视频一区二区| 黄色网一区二区| 免费高潮视频95在线观看网站| 国产精品主播在线观看| 日韩国产欧美在线播放| 日本不卡在线视频| 蜜桃视频在线观看一区| 在线精品一区| 日韩一区二区三区高清在线观看| 日韩精品一区二区三区中文| 91免费精品国偷自产在线在线| 日本强好片久久久久久aaa| 亚洲精品影视| 日本aⅴ亚洲精品中文乱码| 国产精品永久| 国产一区二区精品福利地址| 蜜桃精品在线| 黄色亚洲大片免费在线观看| 中文无码日韩欧| 7777精品| 国产精品成久久久久| 福利视频一区| 少妇久久久久| 日韩视频一区| 亚洲精品一级| 国产日产精品_国产精品毛片| 国产精品v日韩精品v欧美精品网站| 国产激情精品一区二区三区| 日本蜜桃在线观看视频| 欧美久久精品一级c片| 亚洲午夜国产成人| 国产精品激情| 日本国产精品| 亚洲人www| 久久成人高清| 999国产精品视频| 欧美日韩国产一区精品一区| 蜜臀久久99精品久久久画质超高清| 亚洲另类av| 久久爱www.| 一区二区三区视频免费观看| 日韩在线黄色| 四虎国产精品免费观看| 国产视频一区免费看| 日韩高清成人在线| 中文字幕成在线观看| 亚洲制服少妇| 久久精品三级| 一区在线免费| 国产区精品区| 久久久蜜桃一区二区人| 1024精品久久久久久久久| 日韩极品在线观看| 日本免费久久| 日韩三级一区| 成人va天堂| 日韩av一级片| 亚洲精品在线影院| 日韩精品乱码av一区二区| 黑森林国产精品av| 亚洲日本国产| 亚洲电影有码| 国产探花一区二区| 欧美日韩在线播放视频| 国产探花一区在线观看| 亚洲成人一区| 久久精品999| 欧美特黄一区| 精品久久电影| 深夜日韩欧美| 欧美成人精品| 精品伊人久久| 天堂va欧美ⅴa亚洲va一国产| 精品丝袜在线| 国产精品天堂蜜av在线播放| 日韩午夜电影| 欧美一区久久久| 国产精品久久久久毛片大屁完整版| 国产精品三上| 国产精品字幕| 国产精品2区| 免费不卡中文字幕在线| 久久福利在线| 亚洲欧美在线专区| 激情综合在线| а√在线中文在线新版| 国产毛片久久久| 日韩精品一区第一页| 精品入口麻豆88视频| 亚洲我射av| 欧美日韩国产欧| 日韩不卡视频在线观看| 久久91视频| 色狠狠一区二区三区| 伊人久久亚洲美女图片| 色婷婷精品视频| 久久久久九九精品影院| 亚洲精品无吗| 亚洲精品综合| 亚洲欧美日韩在线观看a三区 | 欧美午夜精彩| 国际精品欧美精品| 国产乱码精品一区二区三区亚洲人 | 国产日韩欧美一区二区三区| 中文字幕av一区二区三区人| 亚洲欧美日韩高清在线| 久久精品免费一区二区三区| 高清在线一区| 国产欧美自拍一区| 91精品丝袜国产高跟在线| 日韩精品免费一区二区夜夜嗨 | 女人天堂亚洲aⅴ在线观看| 日韩中文在线电影| 一区二区精品伦理...| 精品视频在线一区二区在线| 国产精品va| 国产中文字幕一区二区三区| 国产乱码精品一区二区三区四区| 日本国产亚洲| 亚洲精品裸体| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲www免费| 日韩国产欧美| 日韩免费av| 欧美日韩视频免费观看| 啪啪国产精品| 亚洲二区免费| 欧美/亚洲一区| 红桃视频欧美| 视频一区欧美日韩| 亚洲日本久久| 国产伦乱精品| 国产调教精品| 欧美精品二区| 国产精品麻豆久久| 欧美日韩尤物久久| 欧美 日韩 国产精品免费观看| 免费久久精品| 欧美资源在线| 日本99精品| 久久99久久人婷婷精品综合| 欧美xxxx中国| 欧美日韩激情在线一区二区三区| 国产一区成人| 婷婷成人av| 久久久久久久久成人| 成人免费电影网址| 91精品在线观看国产| 午夜在线精品| 欧美综合精品| 精品高清久久| 久久精品影视| 中文字幕视频精品一区二区三区 | 日韩av影院| 精品高清久久| 欧美精品一线| 日韩二区在线观看| 国产一区二区三区黄网站 | 久久影院一区二区三区| 秋霞影视一区二区三区| 爽好久久久欧美精品| 7m精品国产导航在线| 黄色在线网站噜噜噜| 免费精品视频| 国产精品亚洲综合色区韩国| 在线看片国产福利你懂的| 欧美亚洲国产激情| 亚洲精品影视| 丁香婷婷久久| 国产亚洲网站| 久久激情综合网| 亚洲伊人av| 亚洲欧美日本国产专区一区| 国产精品观看| 午夜国产欧美理论在线播放| 日本va欧美va欧美va精品| 国产精品成久久久久| 国产农村妇女精品一二区| 国产欧美日韩综合一区在线播放| 日韩免费在线| 亚洲区国产区| 日韩伦理一区| 日本精品另类| 香蕉久久99| 欧美天堂一区| 国产一区清纯| 国产精品**亚洲精品| 蜜桃视频欧美| 欧美激情 亚洲a∨综合| 亚洲天堂久久| 国产丝袜一区| 国产一区二区高清| 精品亚洲二区| 亚洲精品福利| 天堂av在线| 国产精品一区二区99| 亚洲一区二区三区高清不卡| 久久99偷拍| 亚洲精品第一| 女主播福利一区|