电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:141日期:2023-11-26 13:33:25
幾年前,當Oracle放棄客戶端的Forms的時候,隨之消失的那些內置的函數中有一項是關于向警告消息函數(alert message function)傳遞參數。假如你處理錯誤或者缺失的輸入參數(你應該這么做),Forms遷移過程的一部分是將這個內置的函數從6i版本改成9i版本。復雜的應用可能包含有上千條警告消息,并且一個主要的應用(即Forms)的變化會導致上千條改變。做這樣的改變的確是一件討人嫌的行為。 另一方面,作為一個使用PL/SQL的DBA和程序員,你到底寫過多少次DBMS_OUTPUT.PUT_LINE('')?必須寫的或者敲入的DBMS_OUTPUT.PUT_LINE變得非常無聊,使用方便的、內置的短小的代碼不是更好嗎?可能并不是經過深思熟慮,但是更多的歸咎于好運或者意識到同樣的東西必須敲一遍又一遍的現實,機靈的Forms程序員們創建了自己的內置函數,采用了過程的方式來產生警告消息。相同的原理可以被用在你日常的PL/SQL代碼中。事實上,你可以創建一個小的消息庫治理很多類型的輸出消息。讓我們看看一些這樣的可能性。 一個簡單的警告消息過程 就像在這一章節標題中表示的那樣,第一個方法是非常簡單的。假設你有一個常見的需求要輸出某個過程、函數或者代碼塊更新的記錄個數。讓我們假定被更新行的個數是46。使用下面的過程之后,一個簡單的“am(46);”語句就可以你需要的輸出:CREATE OR REPLACE procedure am (msg number) as begin dbms_output.put_line('Records updated: 'msg); end; /另一個版本可以處理字符串類型,因此對 “ams('your message here');”的調用顯著的降低了你敲入的次數。當調試或者解決問題的代碼中,有這樣一個簡單的內置函數對輸出“where am I in the code”的語句是非常寶貴的。位置報告可以確認,比如,你進入了IF-THEN-ELSE語句中哪個分支。假如你的問題代碼調用了很多次其他的對象(過程、函數等等),輸出像“calling function X”或者“returned from function X”這樣的狀態信息可以確認過程流。最終,另外一種使用情況是報告數值。你可以報告或者跟蹤一個變量的值是如何被改變的。 建立一個警告消息庫當然,你的消息庫的復雜性和靈活性完全取決于你。假如你的(輸出)消息是簡單的,那么保持函數過程簡單。更準確的講,保持函數過程的個數是最少的。只要兩個簡單的過程,ams和amn,就可以用來輸出基于字符串和數值的消息了。假如你需要讓輸出的文字內容根據運算的輸出有所變化,比如DML語句的輸出,那么你可能需要三個新的內置過程(插入、更新和刪除運算各一個)。可能你想說明刪除的類型或者原因。比如一個批處理作業的某一步是計算重復記錄的個數。那么像“Records counted: 46” 這樣的輸出是足夠有用的,但是在這種情況下,“Duplicates counted: 46”會顯得更有效。因此,我們增加了2個新的內置過程。這樣,我們現在有了至少6個不同的過程。現在,治理性的問題應該比較明顯了。我們尋找一些簡單的,但是同時又是健壯的過程。至少有兩種方式可以用于重新簡化需要的功能。一種方法是讓警告消息過程能夠接收兩個輸入參數。另外一種方法,正是我預備介紹的,是把這些過程打包。 增加輸入參數的個數 再說一遍,假如前面的簡單方法可以滿足了你的要求,那么就沒必要繼續深入了。創建有兩個輸入參數的過程,第一個參數是消息文字或者說基礎,第二個參數可以是輸出、位置、狀態或者數值。假如你關注數據類型的轉化,那么這兩個輸入參數的組合text/text和text/number都可以統一成text/text類型。你的確必須做這樣的轉換嗎?不,但是為了和你已有的保持一致,假如你在別的地方做了類型映射,那么這里也進行類型映射。不管這些,下面的例子顯示了第一種方法的靈活性。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中沒有空格)。我們到這里就必須格式化一個或者全部兩個消息輸入讓輸出好看一些。然而,假如美觀不需要關心,那么創建基于像 ('dupes ',46)這樣的輸入的消息,這樣做也是非常簡單的,雖然你需要處理空格或者格式化。那么這種方法是否有缺陷呢?這就看情況了。假如你需要的僅僅是msg1,而不需要msg2,怎么辦?當創建這個過程,需要答應msg2是null值。顯然,msg1不需要這樣,對吧?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.增加健壯性 假如你的消息很長,或者需要填滿被spool的輸出中的一頁?讓我們暫時忽略自動換行(Word wrapping),分切文本的一個簡單的方法是合適的截取子串。這種情況迫切需要遞歸(recursion),當然,理解遞歸的最好方法是首先理解遞歸(對不起,老笑話了)。分切過程將執行長度檢查,假如剩下的字符串比你設置的要切除的值長,那么調用截取子串過程,必要的時候進行重復上面的過程。假如截取發生在一個單詞的中間怎么辦?好,記住,這是PL/SQL,而不是字處理程序。在Forms環境中,當文本輸入到了一個文本字段,一般你都可以獲得自動的格式化。你的確可以通過SQL*Plus使用一些格式化功能,但是請確信選擇了符合你需要的正確的類型。使用八個由A到J組成的字符串(在J之后有一個空格),設置linesize為low(輕易看出自動換行選項的區別),下面的例子展示了結果。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上面例子教育我們要利用現有的內置的功能。不必重新發明輪子?假如“FORMAT WORD_WRAPPED”沒有,那么你怎么解決?第二個例子就顯示了遞歸方法造成的直接的截取結果。 將你的庫打成包(Package)O'Reilly出版社的《Oracle PL/SQL Developer's Workbook》 (Steven Feuerstein編寫,2000年出版)中有一個關于如何創建基礎庫的很好的例子,并且這個例子利用了重載(overload)。你可能從以前的一篇文章中回憶起來,重載答應你在一個包(package)中使用相同的名字命名函數或者過程,并且Oracle通過比較參數的個數和類型能夠知道你引用了哪個版本的函數或者過程。 一個明智的命名方法,尤其當你和Java程序員共事的話,會將包命名為“prt”,將過程命名為“ln”。這樣最后的結果是“prt.ln('your message');”。Java中打印一行的方法是使用System.out.println(),這樣你可以看出從目的和功能上為什么“prn.ln”這個名字很直觀。在那本書中的例子處理文本、數字、日期和布爾類型的輸入。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; /上面的過程可以被擴展以包含其他的例子或者前面提到的情況。你可以讓輸出文字采用內置的格式。只要加入“Procedure dup(msg in number” 到包中,那么像“prt.dup(46);” 這樣的調用會產生 “Duplicates counted: 46.”的輸出消息。結束語假如有一天Oracle公司改變或者不支持內置的DBMS_OUTPUT過程,怎么辦?在你的代碼中有多少地方使用了這個過程?將這個功能打包到你自己的庫的美妙之處在于你只需要更新一處代碼——在包中的那些代碼。Forms程序員社區已經花費了數千小時更新數千個,假如不是數百萬的話,forms的二進制文件,因為警告消息功能或者規范發生了變化。對于DBA和程序員來說,這是寶貴的一課,教會他們如何利用Oracle提供的東西來讓事情滿足自己需求。
標簽: Oracle 數據庫
主站蜘蛛池模板: 不锈钢反应釜,不锈钢反应釜厂家-价格-威海鑫泰化工机械有限公司 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 佛山商标注册_商标注册代理|专利注册申请_商标注册公司_鸿邦知识产权 | 深圳APP开发公司_软件APP定制开发/外包制作-红匣子科技 | 粤丰硕水性环氧地坪漆-防静电自流平厂家-环保地坪涂料代理 | 考勤系统_考勤管理系统_网络考勤软件_政企|集团|工厂复杂考勤工时统计排班管理系统_天时考勤 | 山东led显示屏,山东led全彩显示屏,山东LED小间距屏,临沂全彩电子屏-山东亚泰视讯传媒有限公司 | 山东艾德实业有限公司 | 小型高低温循环试验箱-可程式高低温湿热交变试验箱-东莞市拓德环境测试设备有限公司 | 马尔表面粗糙度仪-MAHR-T500Hommel-Mitutoyo粗糙度仪-笃挚仪器 | 储能预警-储能消防系统-电池舱自动灭火装置-四川千页科技股份有限公司官网 | 充气膜专家-气膜馆-PTFE膜结构-ETFE膜结构-商业街膜结构-奥克金鼎 | 列管冷凝器,刮板蒸发器,外盘管反应釜厂家-无锡曼旺化工设备有限公司 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | CPSE安博会| 低气压试验箱_高低温低气压试验箱_低气压实验箱 |林频试验设备品牌 | 智能终端_RTU_dcm_北斗星空自动化科技| 电地暖-电采暖-发热膜-石墨烯电热膜品牌加盟-暖季地暖厂家 | 出国劳务公司_正规派遣公司[严海] | 磨煤机配件-高铬辊套-高铬衬板-立磨辊套-盐山县宏润电力设备有限公司 | 捆扎机_气动捆扎机_钢带捆扎机-沈阳海鹞气动钢带捆扎机公司 | 超声波乳化机-超声波分散机|仪-超声波萃取仪-超声波均质机-精浩机械|首页 | 污泥烘干机-低温干化机-工业污泥烘干设备厂家-焦作市真节能环保设备科技有限公司 | 济南品牌包装设计公司_济南VI标志设计公司_山东锐尚文化传播 | LED灯杆屏_LED广告机_户外LED广告机_智慧灯杆_智慧路灯-太龙智显科技(深圳)有限公司 | 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 罗氏牛血清白蛋白,罗氏己糖激酶-上海嵘崴达实业有限公司 | 全自动定氮仪-半自动凯氏定氮仪厂家-祎鸿仪器 | 淋巴细胞分离液_口腔医疗器材-精欣华医疗器械(无锡)有限公司 | 地脚螺栓_材质_标准-永年县德联地脚螺栓厂家 | 安徽华耐泵阀有限公司-官方网站 安德建奇火花机-阿奇夏米尔慢走丝|高维|发那科-北京杰森柏汇 | 越南专线物流_东莞国际物流_东南亚专线物流_行通物流 | 挤奶设备过滤纸,牛奶过滤纸,挤奶机过滤袋-济南蓝贝尔工贸有限公司 | 塑料检查井_双扣聚氯乙烯增强管_双壁波纹管-河南中盈塑料制品有限公司 | 成都办公室装修-办公室设计-写字楼装修设计-厂房装修-四川和信建筑装饰工程有限公司 | 短信营销平台_短信群发平台_106短信发送平台-河南路尚 | 气动球阀_衬氟蝶阀_调节阀_电动截止阀_上海沃托阀门有限公司 | 结晶点测定仪-润滑脂滴点测定仪-大连煜烁| 粘弹体防腐胶带,聚丙烯防腐胶带-全民塑胶 | 辐射色度计-字符亮度测试-反射式膜厚仪-苏州瑞格谱光电科技有限公司 | 纸塑分离机-纸塑分离清洗机设备-压力筛-碎浆机厂家金双联环保 |