王光營 任芳
摘要著重介紹目前基于Oracle數(shù)據(jù)庫的陜西氣象業(yè)務(wù)庫中在數(shù)據(jù)統(tǒng)計分析中存在的不規(guī)則字符串的問題,并提出了通過自建判斷函數(shù)的有效辦法,解決了統(tǒng)計大量數(shù)據(jù)中經(jīng)常出現(xiàn)的錯誤。
關(guān)鍵詞Oracle;氣象數(shù)據(jù)庫;異常數(shù)據(jù);解決方案
中圖分類號S164文獻標識碼A文章編號0517-6611(2014)04-01107-01
作者簡介王光營(1980-),男,山東高唐人,工程師,碩士,從事專業(yè)氣象應(yīng)用的研究與開發(fā)工作。
目前陜西省已建成100個自動氣象觀測站、1 432個區(qū)域觀測站和酸雨等特種觀測站,這些站點可以連續(xù)自動測量溫度、濕度、氣壓、降水等氣象要素,觀測的數(shù)據(jù)會及時傳輸?shù)绞【植⒋嫒霕I(yè)務(wù)數(shù)據(jù)庫中。由于數(shù)據(jù)量非常大,業(yè)務(wù)數(shù)據(jù)庫選用的是性能強大的Oracle數(shù)據(jù)庫,但由于自動站數(shù)據(jù)也會發(fā)來一些異常的數(shù)據(jù),致使在使用SQL語句進行統(tǒng)計分析數(shù)據(jù)的時候常被這樣問題困擾。在此,筆者著重介紹Oracle數(shù)據(jù)庫陜西氣象業(yè)務(wù)庫在使用時存在的異常數(shù)據(jù)問題,并提出了解決方案,以提高工作效率和質(zhì)量,保證系統(tǒng)的正常運轉(zhuǎn)。
1 基于ORACLE的氣象業(yè)務(wù)數(shù)據(jù)庫系統(tǒng)概述
Oracle數(shù)據(jù)庫是一種大型數(shù)據(jù)庫系統(tǒng),一般應(yīng)用于商業(yè)、政府部門,它的功能很強大,能夠處理大批量的數(shù)據(jù),在網(wǎng)絡(luò)方面也廣泛應(yīng)用。Oracle數(shù)據(jù)庫管理系統(tǒng)是一個以關(guān)系型和面向?qū)ο鬄橹行墓芾頂?shù)據(jù)的數(shù)據(jù)庫管理軟件系統(tǒng),其在管理信息系統(tǒng)、企業(yè)數(shù)據(jù)處理、因特網(wǎng)及電子商務(wù)等領(lǐng)域有非常廣泛的應(yīng)用。ORACLE數(shù)據(jù)庫具有眾多的先進特性,支持多種硬件平臺、操作系統(tǒng)和網(wǎng)絡(luò)平臺,提供業(yè)界真正的透明應(yīng)用群集并行處理技術(shù),達到B2級安全標準[1]。
氣象數(shù)據(jù)庫系統(tǒng)作為氣象信息共享平臺的重要管理系統(tǒng),其體系結(jié)構(gòu)和技術(shù)的復(fù)雜程度均是前所未有的,需要在集約化和標準化原則下,充分利用成熟的商業(yè)數(shù)據(jù)庫技術(shù)和大氣科學(xué)領(lǐng)域的相關(guān)技術(shù)加以構(gòu)建。同時,氣象數(shù)據(jù)庫系統(tǒng)管理大量的、來自于不同業(yè)務(wù)軌道、具有不同屬性的氣象數(shù)據(jù),并為業(yè)務(wù)、科研以及政府、公眾等各用戶提供快捷方便的數(shù)據(jù)服務(wù),所有數(shù)據(jù)資源和應(yīng)用系統(tǒng)均需要集成在統(tǒng)一的平臺框架內(nèi)且為用戶提供全局數(shù)據(jù)導(dǎo)航和獲取接口[2]。氣象業(yè)務(wù)數(shù)據(jù)特點是數(shù)據(jù)量大、并發(fā)處理量大、時效要求高,同時對數(shù)據(jù)的安全性有較高的要求?;跇I(yè)務(wù)系統(tǒng)的特點,其他小型數(shù)據(jù)庫較難滿足需求,因此,氣象數(shù)據(jù)庫采用0RACLE 10g for UNIX。
2 自動站業(yè)務(wù)數(shù)據(jù)庫中存在的問題
自動氣象站是目前氣象系統(tǒng)投入運行的自動化業(yè)務(wù)系統(tǒng),它能完成氣象數(shù)據(jù)的自動采集、存儲、編制報表及資料審核和信息化處理。它可以連續(xù)自動測量溫度、濕度、氣壓、降水等氣象要素。自動站業(yè)務(wù)數(shù)據(jù)庫存入的數(shù)據(jù)是解析自動站數(shù)據(jù)原始文本文件而入庫的,由于自動站數(shù)據(jù)的缺測以及其他問題造成了數(shù)據(jù)是以不規(guī)則字符串組成的,有的字符是“///”、有的是“-”,還有的是其他一些不可預(yù)知字符組成的字符串,這樣在對數(shù)據(jù)值統(tǒng)計和寫SQL語句時,容易出現(xiàn)很多的錯誤,如求雨量的和,用到的sum函數(shù),求溫度的平均值用AVG函數(shù),如統(tǒng)計7月份全省自動站總的降水量時用到的SQL語句:select sum(rain) from awsTable where dataTime=201107,包含這些函數(shù)的SQL語句在執(zhí)行的時候大多均會報錯,因為它遇到了那些不規(guī)則的字符串。在SQL Server數(shù)據(jù)庫中,這種問題可以用isnumber()函數(shù)進行判斷這個數(shù)據(jù)是否為數(shù)字,而在Oracle數(shù)據(jù)庫中沒有這樣的函數(shù),當遇到異常字符時就會出現(xiàn)如下錯誤信息:Error Message: ORA-01722 invalid number,即將字符串轉(zhuǎn)換為數(shù)字出錯了,關(guān)鍵的是Oracle里面沒有SQL Server里面的類似函數(shù)is_number來判斷能否轉(zhuǎn)換為數(shù)字。
3 解決方案
用過SQL Server數(shù)據(jù)庫的對isnumber()函數(shù)均有一定的了解,這是一個常用的判斷輸入?yún)?shù)是否為數(shù)字的函數(shù)。而在Oracle中沒有現(xiàn)成的判斷是否為數(shù)字函數(shù),就需要通過Oracle的自定義函數(shù)來實現(xiàn)這個功能。下面來介紹一下如何用3種方法來將其實現(xiàn)[3]。