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

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

解析Oracle/Oracle Forms 的多用途代碼

瀏覽:244日期:2023-11-26 13:33:25
幾年前,當(dāng)Oracle放棄客戶端的Forms的時(shí)候,隨之消失的那些內(nèi)置的函數(shù)中有一項(xiàng)是關(guān)于向警告消息函數(shù)(alert message function)傳遞參數(shù)。假如你處理錯(cuò)誤或者缺失的輸入?yún)?shù)(你應(yīng)該這么做),F(xiàn)orms遷移過程的一部分是將這個(gè)內(nèi)置的函數(shù)從6i版本改成9i版本。復(fù)雜的應(yīng)用可能包含有上千條警告消息,并且一個(gè)主要的應(yīng)用(即Forms)的變化會(huì)導(dǎo)致上千條改變。做這樣的改變的確是一件討人嫌的行為。 另一方面,作為一個(gè)使用PL/SQL的DBA和程序員,你到底寫過多少次DBMS_OUTPUT.PUT_LINE('')?必須寫的或者敲入的DBMS_OUTPUT.PUT_LINE變得非常無聊,使用方便的、內(nèi)置的短小的代碼不是更好嗎?可能并不是經(jīng)過深思熟慮,但是更多的歸咎于好運(yùn)或者意識(shí)到同樣的東西必須敲一遍又一遍的現(xiàn)實(shí),機(jī)靈的Forms程序員們創(chuàng)建了自己的內(nèi)置函數(shù),采用了過程的方式來產(chǎn)生警告消息。相同的原理可以被用在你日常的PL/SQL代碼中。事實(shí)上,你可以創(chuàng)建一個(gè)小的消息庫(kù)治理很多類型的輸出消息。讓我們看看一些這樣的可能性。 一個(gè)簡(jiǎn)單的警告消息過程 就像在這一章節(jié)標(biāo)題中表示的那樣,第一個(gè)方法是非常簡(jiǎn)單的。假設(shè)你有一個(gè)常見的需求要輸出某個(gè)過程、函數(shù)或者代碼塊更新的記錄個(gè)數(shù)。讓我們假定被更新行的個(gè)數(shù)是46。使用下面的過程之后,一個(gè)簡(jiǎn)單的“am(46);”語(yǔ)句就可以你需要的輸出:CREATE OR REPLACE procedure am (msg number) as begin dbms_output.put_line('Records updated: 'msg); end; /另一個(gè)版本可以處理字符串類型,因此對(duì) “ams('your message here');”的調(diào)用顯著的降低了你敲入的次數(shù)。當(dāng)調(diào)試或者解決問題的代碼中,有這樣一個(gè)簡(jiǎn)單的內(nèi)置函數(shù)對(duì)輸出“where am I in the code”的語(yǔ)句是非常寶貴的。位置報(bào)告可以確認(rèn),比如,你進(jìn)入了IF-THEN-ELSE語(yǔ)句中哪個(gè)分支。假如你的問題代碼調(diào)用了很多次其他的對(duì)象(過程、函數(shù)等等),輸出像“calling function X”或者“returned from function X”這樣的狀態(tài)信息可以確認(rèn)過程流。最終,另外一種使用情況是報(bào)告數(shù)值。你可以報(bào)告或者跟蹤一個(gè)變量的值是如何被改變的。 建立一個(gè)警告消息庫(kù)當(dāng)然,你的消息庫(kù)的復(fù)雜性和靈活性完全取決于你。假如你的(輸出)消息是簡(jiǎn)單的,那么保持函數(shù)過程簡(jiǎn)單。更準(zhǔn)確的講,保持函數(shù)過程的個(gè)數(shù)是最少的。只要兩個(gè)簡(jiǎn)單的過程,ams和amn,就可以用來輸出基于字符串和數(shù)值的消息了。假如你需要讓輸出的文字內(nèi)容根據(jù)運(yùn)算的輸出有所變化,比如DML語(yǔ)句的輸出,那么你可能需要三個(gè)新的內(nèi)置過程(插入、更新和刪除運(yùn)算各一個(gè))。可能你想說明刪除的類型或者原因。比如一個(gè)批處理作業(yè)的某一步是計(jì)算重復(fù)記錄的個(gè)數(shù)。那么像“Records counted: 46” 這樣的輸出是足夠有用的,但是在這種情況下,“Duplicates counted: 46”會(huì)顯得更有效。因此,我們?cè)黾恿?個(gè)新的內(nèi)置過程。這樣,我們現(xiàn)在有了至少6個(gè)不同的過程。現(xiàn)在,治理性的問題應(yīng)該比較明顯了。我們尋找一些簡(jiǎn)單的,但是同時(shí)又是健壯的過程。至少有兩種方式可以用于重新簡(jiǎn)化需要的功能。一種方法是讓警告消息過程能夠接收兩個(gè)輸入?yún)?shù)。另外一種方法,正是我預(yù)備介紹的,是把這些過程打包。 增加輸入?yún)?shù)的個(gè)數(shù) 再說一遍,假如前面的簡(jiǎn)單方法可以滿足了你的要求,那么就沒必要繼續(xù)深入了。創(chuàng)建有兩個(gè)輸入?yún)?shù)的過程,第一個(gè)參數(shù)是消息文字或者說基礎(chǔ),第二個(gè)參數(shù)可以是輸出、位置、狀態(tài)或者數(shù)值。假如你關(guān)注數(shù)據(jù)類型的轉(zhuǎn)化,那么這兩個(gè)輸入?yún)?shù)的組合text/text和text/number都可以統(tǒng)一成text/text類型。你的確必須做這樣的轉(zhuǎn)換嗎?不,但是為了和你已有的保持一致,假如你在別的地方做了類型映射,那么這里也進(jìn)行類型映射。不管這些,下面的例子顯示了第一種方法的靈活性。CREATE OR REPLACE procedure am (msg1 varchar2, msg2 varchar2) as begin dbms_output.put_line(msg1msg2); end; /編譯之后,下面是使用的例子。SQL> set serveroutput on SQL> exec am('Here I am',46); Here I am46 PL/SQL procedure sUCcessfully completed.好了,這次輸出本可以看起來更好一些(注重輸出中msg1和msg2中沒有空格)。我們到這里就必須格式化一個(gè)或者全部?jī)蓚€(gè)消息輸入讓輸出好看一些。然而,假如美觀不需要關(guān)心,那么創(chuàng)建基于像 ('dupes ',46)這樣的輸入的消息,這樣做也是非常簡(jiǎn)單的,雖然你需要處理空格或者格式化。那么這種方法是否有缺陷呢?這就看情況了。假如你需要的僅僅是msg1,而不需要msg2,怎么辦?當(dāng)創(chuàng)建這個(gè)過程,需要答應(yīng)msg2是null值。顯然,msg1不需要這樣,對(duì)吧?CREATE OR REPLACE procedure am (msg1 varchar2, msg2 varchar2 default null) as begin dbms_output.put_line(msg1msg2); end; / Procedure created. SQL> exec am('Where am I?'); Where am I? PL/SQL procedure successfully completed.增加健壯性 假如你的消息很長(zhǎng),或者需要填滿被spool的輸出中的一頁(yè)?讓我們暫時(shí)忽略自動(dòng)換行(Word wrapping),分切文本的一個(gè)簡(jiǎn)單的方法是合適的截取子串。這種情況迫切需要遞歸(recursion),當(dāng)然,理解遞歸的最好方法是首先理解遞歸(對(duì)不起,老笑話了)。分切過程將執(zhí)行長(zhǎng)度檢查,假如剩下的字符串比你設(shè)置的要切除的值長(zhǎng),那么調(diào)用截取子串過程,必要的時(shí)候進(jìn)行重復(fù)上面的過程。假如截取發(fā)生在一個(gè)單詞的中間怎么辦?好,記住,這是PL/SQL,而不是字處理程序。在Forms環(huán)境中,當(dāng)文本輸入到了一個(gè)文本字段,一般你都可以獲得自動(dòng)的格式化。你的確可以通過SQL*Plus使用一些格式化功能,但是請(qǐng)確信選擇了符合你需要的正確的類型。使用八個(gè)由A到J組成的字符串(在J之后有一個(gè)空格),設(shè)置linesize為low(輕易看出自動(dòng)換行選項(xiàng)的區(qū)別),下面的例子展示了結(jié)果。set serveroutput on format word_wrapped exec am(insert the 8 strings here); abcdefghij abcdefghij abcdefghij abcdefghij abcdefghij abcdefghij abcdefghij abcdefghij set serveroutput on format wrapped exec am(insert the 8 strings here); abcdefghij abcdefghij abcdefgh ij abcdefghij abcdefghij abcde fghij abcdefghij abcdefghij上面例子教育我們要利用現(xiàn)有的內(nèi)置的功能。不必重新發(fā)明輪子?假如“FORMAT WORD_WRAPPED”沒有,那么你怎么解決?第二個(gè)例子就顯示了遞歸方法造成的直接的截取結(jié)果。 將你的庫(kù)打成包(Package)O'Reilly出版社的《Oracle PL/SQL Developer's Workbook》 (Steven Feuerstein編寫,2000年出版)中有一個(gè)關(guān)于如何創(chuàng)建基礎(chǔ)庫(kù)的很好的例子,并且這個(gè)例子利用了重載(overload)。你可能從以前的一篇文章中回憶起來,重載答應(yīng)你在一個(gè)包(package)中使用相同的名字命名函數(shù)或者過程,并且Oracle通過比較參數(shù)的個(gè)數(shù)和類型能夠知道你引用了哪個(gè)版本的函數(shù)或者過程。 一個(gè)明智的命名方法,尤其當(dāng)你和Java程序員共事的話,會(huì)將包命名為“prt”,將過程命名為“l(fā)n”。這樣最后的結(jié)果是“prt.ln('your message');”。Java中打印一行的方法是使用System.out.println(),這樣你可以看出從目的和功能上為什么“prn.ln”這個(gè)名字很直觀。在那本書中的例子處理文本、數(shù)字、日期和布爾類型的輸入。CREATE or REPLACE package prt is Procedure ln (msg in varchar2); Procedure ln (msg in number); Procedure ln (msg in date);Procedure ln (msg in boolean); END prt; /上面的過程可以被擴(kuò)展以包含其他的例子或者前面提到的情況。你可以讓輸出文字采用內(nèi)置的格式。只要加入“Procedure dup(msg in number” 到包中,那么像“prt.dup(46);” 這樣的調(diào)用會(huì)產(chǎn)生 “Duplicates counted: 46.”的輸出消息。結(jié)束語(yǔ)假如有一天Oracle公司改變或者不支持內(nèi)置的DBMS_OUTPUT過程,怎么辦?在你的代碼中有多少地方使用了這個(gè)過程?將這個(gè)功能打包到你自己的庫(kù)的美妙之處在于你只需要更新一處代碼——在包中的那些代碼。Forms程序員社區(qū)已經(jīng)花費(fèi)了數(shù)千小時(shí)更新數(shù)千個(gè),假如不是數(shù)百萬(wàn)的話,forms的二進(jìn)制文件,因?yàn)榫嫦⒐δ芑蛘咭?guī)范發(fā)生了變化。對(duì)于DBA和程序員來說,這是寶貴的一課,教會(huì)他們?nèi)绾卫肙racle提供的東西來讓事情滿足自己需求。
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
视频一区欧美精品| 亚洲三级欧美| 日韩欧美三区| 日韩av二区在线播放| 国产精品欧美一区二区三区不卡| 国产高清亚洲| 久久婷婷av| 三级欧美在线一区| 久久精品99国产国产精| 国产成人精品一区二区免费看京| 国产成人精品一区二区免费看京| 久久婷婷激情| 日本在线成人| 另类专区亚洲| 免费在线观看日韩欧美| 国产极品模特精品一二| 欧美一区二区三区高清视频| 免费人成在线不卡| 国产精品地址| 免费观看久久av| 国产亚洲一区| 老司机精品在线| 精品视频99| 国产精品99久久免费观看| 精品久久久久中文字幕小说| 久久久久久夜| 国产福利电影在线播放| 99久久夜色精品国产亚洲狼 | 福利在线免费视频| 99成人在线视频| 亚洲一区有码| 国产精品一区二区精品| 超碰99在线| 中文一区二区| 国产毛片精品| 日韩精品麻豆| 亚洲日本三级| 国产超碰精品| 蜜桃av一区二区| 97se综合| 国产三级精品三级在线观看国产| 天堂日韩电影| 国产亚洲久久| 国产手机视频一区二区| 国产在线观看91一区二区三区 | 日韩成人三级| 91午夜精品| 夜久久久久久| 成人欧美一区二区三区的电影| 午夜性色一区二区三区免费视频| 国产在线一区不卡| 日韩一区二区三区精品视频第3页 日韩一区二区三区免费视频 | 色婷婷久久久| 国产极品嫩模在线观看91精品| 日韩制服丝袜av| 日韩三区免费| 久久久久九九精品影院| 亚洲网址在线观看| 伊伊综合在线| 久久精品女人| 亚欧洲精品视频在线观看| 亚洲国产影院| 国产v日韩v欧美v| 麻豆国产欧美日韩综合精品二区| 蜜桃视频在线观看一区| 午夜精品婷婷| 亚洲v在线看| 久久久久免费| 国产精品中文字幕亚洲欧美| 亚洲视频国产精品| 性欧美69xoxoxoxo| 久久91导航| 精品美女在线视频| 国产精品亚洲四区在线观看 | 伊人久久婷婷| 婷婷成人在线| 一本大道色婷婷在线| 久久精品女人| 另类小说一区二区三区| 久久国产精品色av免费看| 亚洲人亚洲人色久| 蜜桃视频在线观看一区二区| 亚洲专区欧美专区| 美女久久久久| 1000部精品久久久久久久久| 99久久亚洲精品蜜臀| 久久婷婷丁香| 亚洲手机在线| 99久久久久国产精品| 亚洲一级少妇| 久久激情婷婷| 91精品一区二区三区综合| 欧美羞羞视频| 久久久久久久久久久9不雅视频| 中文字幕在线看片| 午夜av不卡| 人人香蕉久久| 999国产精品视频| 欧美在线资源| 丝袜美腿亚洲色图| 亚洲三级国产| 国产乱码精品一区二区亚洲| 国产精品nxnn| 国产精品美女| 综合国产在线| 91国内精品| 国产精品激情电影| 精品理论电影在线| 日韩欧美午夜| 亚洲韩日在线| 日韩制服丝袜先锋影音| 日韩动漫一区| 麻豆国产一区| 午夜精品成人av| 精品中文字幕一区二区三区av| 日韩三区四区| 国产精品tv| 久久精品亚洲人成影院| 五月天激情综合网| 亚洲免费成人av在线| 欧美视频二区| 动漫av一区| 亚洲国产专区校园欧美| 蜜桃视频一区二区三区在线观看| 欧美一级网址| 高清一区二区三区av| 久久久久免费av| 亚洲午夜国产成人| 国产日韩亚洲| 美女福利一区二区三区| 亚洲综合精品四区| 国产日韩免费| 亚洲精品88| 一本一本久久| 国产精品自拍区| 伊人久久大香线蕉av不卡| 蜜桃视频在线观看一区| 你懂的亚洲视频| 99精品视频在线观看免费播放| 亚洲制服欧美另类| 捆绑调教美女网站视频一区| 久久狠狠婷婷| 亚洲精品进入| 精品视频高潮| 在线亚洲自拍| 国产欧美亚洲一区| 日韩一区二区在线免费| 国产一区二区精品| 国产欧美日韩精品一区二区免费| 红桃视频国产精品| 欧美在线首页| 日韩欧美中文| 日韩精品a在线观看91| 超碰在线99| 亚洲精品字幕| jizzjizz中国精品麻豆| 在线免费观看亚洲| 成午夜精品一区二区三区软件| 丝袜美腿高跟呻吟高潮一区| 久久久国产精品网站| 久久国产精品99国产| 久久精品国产网站| 亚洲精品综合| 精品三级av| 视频一区二区国产| 国产成人久久精品麻豆二区| 三级亚洲高清视频| 不卡一二三区| 日韩精品成人在线观看| 丝袜av一区| 久久av影视| 蜜臀av亚洲一区中文字幕| 成人在线视频免费| 日韩福利在线观看| 99亚洲视频| 色偷偷偷在线视频播放| 日本久久二区| 99国内精品| 成人国产精选| 日本天堂一区| 国产精品人人爽人人做我的可爱 | 福利一区视频| 日韩一区二区三区在线看| 亚洲不卡av不卡一区二区| 国产视频一区二| 天堂va蜜桃一区二区三区| 免费福利视频一区二区三区| 国产欧美欧美| 亚洲精品免费观看| 亚洲女同一区| 色欧美自拍视频| 欧美偷窥清纯综合图区| 女人天堂亚洲aⅴ在线观看| 激情中国色综合| 国产毛片精品久久| 日韩免费精品| 天堂va蜜桃一区二区三区| 久久人人88| 国产999精品在线观看| 国产欧美在线|