国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

在Adaptive Server Anywhere和Oracle之間構造通用函數

2024-08-29 13:45:14
字體:
來源:轉載
供稿:網友

   在Adaptive Server Anywhere和Oracle之間構造通用函數
遼河油田錦采地質大隊 鄧先永 01-7-2 上午 10:29:41

在使用PowerBuilder編制程序時,使用的最多的數據庫接口是它自身集成的Adaptive Server Anywhere和大型數據庫治理系統Oracle;有時,為了使程序的運行、移植更加方便,比如從服務器的數據治理端立即轉到單機的數據治理端時,往往涉及到用戶在程序的SQL語句中所使用的不同數據庫平臺上,函數的兼容性問題。比如在最后的數據匯總時,為了保證計算結果的正確性,就要使用防止空值發生的函數,這個函數在Oracle中是nvl(x,y);用法為:select name,nvl(age,”年齡未知”) age,nvl(zipcode,”無郵政編碼”) zipcode from unknow_personal;則可能出現的結果為:name age zipcode張三 45   無郵政編碼李四  年齡未知   234567王五  年齡未知 無郵政編碼而在Adaptive Server Anywhere的單機數據庫平臺上,就要用isnull等函數了,語法為:select name,isnull(age,”年齡未知”) age,isnull(zipcode,”無郵政編碼”) zipcode from unknow_personal;最后的結果是一樣的。現在問題是當我們所用的數據庫要從Oracle移植到單機版的Adaptive Server Anywhere上時,由于某些函數的不通用性,程序就要修改相應的函數調用,重新編譯,假如在程序中大量或多處使用這種函數時,就很有可能導致人為的錯誤,從而使程序的維護工作量加大,我曾在網上發過有相關幫助的帖子,但不太切中要害。經過仔細研究一段時間后,終于在Adaptive Server Anywhere單機平臺上實現了Oracle上的函數nvl(),使我的程序應用更加方便,現寫下來與大家共享。另外,本人以前用PB6的時候,在PB6的Database Administrater Painter中曾編寫過比較復雜的Stored PRocedure,但是由于PB6中在處理和Database直接接口的Script時,對于” ; ”和” ’ ”的使用上較多的不方便之處,因而實現時花費了不少的氣力,雖然在PB7中此毛病仍然存在,但在PB7的光盤中集成的Adaptive Server Anywhere 6.0的治理工具卻比在PB6中的優秀很多,使用Manager Adaptive Server Anywhere這個工具就能很輕松地對數據庫進行操作。首先,假如大家已經正確安裝了PB7.0.1后,就可以通過以下步驟來啟動Manager Adaptive Server Anywhere:開始→Sybase→Manager Adaptive Server Anywhere。啟動后出現治理界面,再按如下步驟:選菜單Tools→Connect→Adaptive Server Anywhere,再選擇你在系統ODBC中配置好的數據源(PB7.0.1對此處理比較好,把各種數據源都集成到系統的ODBC配置中來進行,比較正規,可能初學者還不太適應吧!),假如有必要,可以在User ID:和PassWord:處輸入連接數據庫的用戶名和口令,之后按確定,就進行數據庫的連接。比如我們此次連接ASA 6.0 Sample,當然用戶在實際應用中就要連接自己的數據庫了,假如連接成功,會在Sybase Central下的Adaptive Server Anywhere下出現asademo的圖標了;雙擊鼠標,打開asademo;再雙擊asademo(dba),打開其下的Tables,Views,Procedures&Functions
等子項,單擊rocedures&Functions
項,在右邊窗口中就會出現當前連接的數據庫中所支持的過程和函數,在右邊窗口中雙擊Add Function (Template),此時會出現New Function的窗口,窗口中有一個函數的大致框架,但為了實現在Oracle中的nvl()函數,請將New Function窗口中的語句改為如下的形式:create function nvl(in x text,in y text)returns textbegindeclare z text;if x is null thenset z=yelseset z=xend if;return(z)end 為了以上幾行Script,本人也試過多次才成功,首先是上面的(in x text,in y text),表示函數有兩個輸入參數:x,y,而數據類型是text。這個text數據類型真是很有趣,我想就算是Sybase公司很好的創意吧!剛開始時,我用的是real類型,但它處理數值型字段時可以,但在處理字符型的字段時就不靈了,后來又仔細分析了一下Adaptive Server Anywhere所提供的數據類型后,改用text一切才OK!后面的Script,我曾想直接調用Adaptive Server Anywhere的isnull()函數,卻沒有成功,歡迎廣大網友積極參與討論;至于其它的Script,大家仔細看看Adaptive Server Anywhere的幫助后,應該是可以寫出來的。之后,選擇New Function窗口的File→Excute Script執行此語句,就行了,這時回到Manager Adaptive Server Anywhere的治理界面,在Procedures&Functions項中,就會有nvl()函數了,用它即可參與實戰。
下來還有一步,本來這一步可有可無,因為在數據庫只要有了nvl()的定義后,就可以在PB中直接寫帶有nvl()的Script,而不會出現語法錯誤了,但是,為了用戶能在PB中直接調用,就算是形成一個完整的應用,建議大家還是堅持完成下面的過程,反正又不太費勁,另外還可以長知識呢。大家在構建DataWindow的時候,相信已經使用過相應數據庫中的函數,非凡是在用計算列時,就很有可能用到函數了,現在,我們要把在Adaptive Server Anywhere中實現的類似于Oracle的nvl()函數,讓它出現在DataWindow Painter的可以直接選取的函數名中(本來用Oracle連庫是有的,但用Adaptive Server Anywhere連庫時就會有isnull()函數可選,而沒有nvl()可選),經過我們的分析,可以用以下幾步來實現:1.找到Sybase安裝目錄的 hared/PowerBuilder下的pbodb70.ini文件,打開它,找到[Adaptive Server Anywhere],可以看到PBFunctions='ASA_FUNCTIONS',即Adaptive Server Anywhere數據庫所用的函數是從ASA_FUNCTIONS處來獲得,只要我們把關于nvl()的聲明放到ASA_FUNCTIONS的相應部分,就可以在Adaptive Server Anywhere 數據庫中,在PB的開發界面中,直接使用nvl()函數了(由此可見在PB中ini文件的重要性)。2.在pbodb70.ini文件中找到Functions段的[ASA_FUNCTIONS],在Functions=abs(x)…的合適的地方加入關于nvl()的聲明:”nvl(x,y),”(建議加到ifnull(x,y,z),處)即可。存盤退出,之后啟動PB,大家就可以看到,即使使用Adaptive Server Anywhere 數據庫,也一樣可以使用Oracle中的nvl()函數了。這樣有一個比較重大的意義是:實現了這樣的函數后,用戶的程序就可以在服務器版和單機版間通用了,省去了為服務器版和單機版分別開發不同代碼的麻煩;一旦在單機數據庫上建立好同服務器相同的庫結構,裝載相似的數據后,就可以同等使用。 以上是本人日常開發的經驗所得,錯誤和不足疏漏之處再所難免,本文旨在拋磚引玉,關于數據庫開發工具PowerBuilder的使用,且就本文上述的各個方面,確有許多可以大開論壇,討論一番的必要,歡迎廣大PB,VC開發者與我聯系hard_deng@netease.com。2000年6月9日另外我還在又造了其它的幾個函數:即在sqlanywhere下生成的ceil、add_months和to_char函數:create function ceil(in x real)returns integerbegindeclare z integer;set z=ceiling(x);return(z)endcreate function add_months(in x date,in y integer)returns datebegindeclare z date;set z=months(x,y);return(z)endcreate function to_char(in x date,in y TEXT)returns TEXTbegindeclare z TEXT;declare ii integer;if y='yyyymm' thenset ii=112end if;set z=convert(char(8),x,ii);set z="left"(z,6);return(z)end

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 陵川县| 万年县| 临西县| 巴青县| 兴安县| 河曲县| 师宗县| 正镶白旗| 义乌市| 册亨县| 子洲县| 怀来县| 台东县| 神农架林区| 平阳县| 宜兴市| 香港 | 武宣县| 米易县| 天水市| 象山县| 朔州市| 宜宾县| 大庆市| 巴林右旗| 柯坪县| 绵竹市| 庄浪县| 迭部县| 盱眙县| 黄陵县| 桐庐县| 达拉特旗| 塘沽区| 同德县| 苍溪县| 通州区| 佳木斯市| 高台县| 长岭县| 宝丰县|