欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
IBM Message Broker筆記系列(九) .

這篇是純粹的“coding心得”,撇開(kāi)MB那些啰嗦的配置不談,專(zhuān)門(mén)講學(xué)習ESQL的痛苦經(jīng)歷,有些內容可能前面的筆記有介紹過(guò),這里做一個(gè)全面的匯總。雖然有些編程的tips已經(jīng)忘記了,以后如果想起來(lái)還會(huì )繼續補充。

概述

ESQL的語(yǔ)法和數據庫的存儲過(guò)程語(yǔ)句很像,雖然我從未寫(xiě)過(guò)存儲過(guò)程,但是平心而論,ESQL的基本語(yǔ)法和概念還是很好理解的,畢竟,ESQL沒(méi)有類(lèi)、對象、多態(tài)這些OOP的東西,也沒(méi)有指針、位移操作這些C的概念;沒(méi)有C的函數指針、指針的指針、內存分配這種讓新手頭暈的術(shù)語(yǔ),也不像Java那樣各類(lèi)框架滿(mǎn)天飛,開(kāi)足馬力都學(xué)不過(guò)來(lái)。所以,ESQL還是很好入門(mén)的。但是,切記,只是“入門(mén)”而已。你看懂那些示例的ESQL很容易,無(wú)非是邏輯樹(shù)的增刪改;消息流也是那么一目了然,消息從一個(gè)節點(diǎn)出來(lái),進(jìn)入另一個(gè)節點(diǎn),不知不覺(jué)一個(gè)“業(yè)務(wù)流”就完成了,so simple,na?ve!我一開(kāi)始也是這么覺(jué)得的,但真正動(dòng)手的時(shí)候,才發(fā)覺(jué)ESQL代碼中,危機四伏!下面一一列舉

基本類(lèi)型

數字

ESQL的基本類(lèi)型很少,無(wú)非是數字、字符串、邏輯、時(shí)間,還有引用。數字類(lèi)型包括int、float和decimal(就是double,高精度小數),一般很少會(huì )考慮三者的差別,把它們與java的等同起來(lái),其實(shí)不然,如果隨便亂用,會(huì )冒出很多無(wú)聊而又浪費時(shí)間的bug

  • 數據庫查詢(xún)

在使用oracle的時(shí)候,通常都會(huì )用Number類(lèi)型作為主鍵id等數字類(lèi)型字段,可是你知道用select語(yǔ)句取Number到ESQL中是什么嗎?是decimal。由于ESQL里面,消息樹(shù)中的字段類(lèi)型是隱式的、可變的(類(lèi)似PHP),也就是你可以隨便賦任何值給某個(gè)消息節點(diǎn)。按理說(shuō)這種腳本語(yǔ)言的特性可以方便編程,是好事。不過(guò)請先看完下面的描述。

  • 數據庫插入

這個(gè)問(wèn)題是最近才發(fā)現的,在64位的linux上,MB使用64位數據源訪(fǎng)問(wèn)oracle,在一條insert語(yǔ)句上屢屢失敗,而這條insert語(yǔ)句之前在32位windows平臺上卻很正常的執行。拋出的異常提示:“oracle:String data, right truncated”,在網(wǎng)上搜了一下大部分人都說(shuō)是數據太長(cháng),只有dw論壇上有人說(shuō)可能是64bit數據源的關(guān)系,但具體原因也不清楚。請了IBM的支持來(lái)搞了半天也沒(méi)任何結果,絕望之際我干脆用排除法,每次修改一兩個(gè)字段為很簡(jiǎn)單的常數(那樣總不會(huì )出問(wèn)題了),在排除到最后一個(gè)字段時(shí),才發(fā)現把一個(gè)decimal的數據插進(jìn)去會(huì )有問(wèn)題,如果換成float就ok了!這個(gè)問(wèn)題前后浪費了我兩天,當時(shí)忍不住說(shuō)了幾句臟話(huà),一個(gè)簡(jiǎn)單的問(wèn)題搞得這么惡心,錯誤提示也純粹誤導用戶(hù)。天知道以后換成其他平臺會(huì )不會(huì )又這樣呢?

  • 函數調用

ESQL是弱類(lèi)型的?是的,某種程度上是弱類(lèi)型的,可是遇到函數調用的時(shí)候,它的類(lèi)型強度簡(jiǎn)直勝過(guò)java——你不能把一個(gè)int作為參數傳遞給聲明為double的參數,那樣會(huì )拋出異常。問(wèn)題是有時(shí)候你根本不知道某個(gè)消息樹(shù)節點(diǎn)啥時(shí)變成了int或者是float或是double,就像上文說(shuō)到的數據庫查詢(xún)結果。請打開(kāi)debug,慢慢找吧,總會(huì )有柳暗花明的一刻

字符串類(lèi)型

估計MB為了照顧比較“原始”的消息格式,即非XML、而是CWF或者TDS格式的消息,ESQL的字符串類(lèi)型不僅僅有字符類(lèi)型“char”,還有字節類(lèi)型“BLOB”和比特類(lèi)型“BIT”,的確是大大方便了比特流的處理。關(guān)于字符串,發(fā)現的問(wèn)題不多,下面列出幾點(diǎn)需要稍加注意之處。

  • 字符串連接“||”

使用“||”連接字符串時(shí),記得每個(gè)被連接的變量都不能為null,否則連接后的結果就變成null了,可以用“變量 is not null”來(lái)判斷

  • BLOB類(lèi)型

BLOB類(lèi)型在ESQL中的表示方式為 X'ABCD',實(shí)際上是一種BCD碼,每個(gè)字符表示一個(gè)十六進(jìn)制,即半個(gè)字節。注意這里要是偶數個(gè)長(cháng)度,否則在打包或者部署時(shí)會(huì )報錯

時(shí)間類(lèi)型

和一般編程語(yǔ)言不同的是ESQL有時(shí)間類(lèi)型的變量,這很大程度上是因為MB里面支持很多XML的特性,而時(shí)間類(lèi)型也是標準XML中包含的,例如xsd:dateTime等等。我沒(méi)學(xué)過(guò)高級的XML,自然對這些名目繁多的時(shí)間類(lèi)型之間的差別不甚了解,所以簡(jiǎn)單地列出幾點(diǎn)比較常用的特性:

  • 消息定義中的時(shí)間類(lèi)型

消息定義文件里頭也可以聲明某個(gè)節點(diǎn)類(lèi)型為timestamp(消息定義文件本質(zhì)上就是XML SCHEMA文件,自然支持xsd:命名空間),不過(guò)在實(shí)踐中發(fā)現從MQ讀入的一個(gè)XML字符串,解析為timestamp類(lèi)型時(shí),經(jīng)常有一些格式上的問(wèn)題而導致解析失敗,后來(lái)干脆把timestamp全部替換為string了,IBM的技術(shù)支持也是這么“推薦”的,估計是他們也找不出原因所在

  • 計算花費的時(shí)間

JAVA里面很常用的就是通過(guò)計算系統時(shí)間之差,來(lái)得到一段代碼的運行時(shí)間毫秒數,然后用時(shí)間類(lèi)可以進(jìn)行格式轉換,ESQL同樣可以做到,而且更加簡(jiǎn)單。比如要計算一個(gè)消息流的運行時(shí)間,那么在消息流開(kāi)頭用 CURRENT_TIME得到起始時(shí)間,保存在環(huán)境樹(shù)中的T1節點(diǎn);然后在消息流結尾,再次用 CURRENT_TIME得到結束時(shí)間T2,兩個(gè)時(shí)間值相減,再用下面這段代碼將其轉換成毫秒數

SET OutputRoot.MRM.process_time = CAST( (T2-Environment.Variables.T1) SECOND AS FLOAT) *1000;

很遺憾的,ESQL最小只支持“秒”的時(shí)間間隔(“時(shí)間間隔”INTERVAL也是一種時(shí)間類(lèi)型),不過(guò)得到的float值通常是小數位很長(cháng)的,包含了毫秒信息,譬如0.2352436,因此乘以1000也完全夠用

全局變量

問(wèn)過(guò)IBM的人好幾次,自己也去查了不少資料,一直沒(méi)有發(fā)現ESQL中有足夠理想的全局變量或者全局常量。我們知道,ESQL的代碼層次從高到低依次是:schema->module->function or procedure,越是局部的變量,優(yōu)先級越高,這一點(diǎn)和普通編程語(yǔ)言一樣。所以,沒(méi)有變量的聲明可以超越schema這一級,包括所謂的外部變量external,因此,在不同schema的消息流之間不能共享全局變量的,這個(gè)限制有時(shí)候很麻煩,比如所有消息流都要訪(fǎng)問(wèn)同一個(gè)數據源、或者Oracle的schema,或者是你自己定義的全局常量,那你就只能在每個(gè)schema中設置了,還好schema不會(huì )很多,或者你在消息流開(kāi)始的時(shí)候,從文件、數據庫等地方讀取配置參數也是一種選擇。

對于定義好的全局變量,可以用{ }進(jìn)行變量值的替換,從而實(shí)現動(dòng)態(tài)功能,比如 OutputBody.{myvar}.value,花括號的值會(huì )在運行期間指定。但是這樣一來(lái)ESQL的編輯器就無(wú)法判斷這個(gè)節點(diǎn)是否存在,會(huì )給出“無(wú)法解析該引用”的警告,這不影響使用。

全局函數

剛才說(shuō)到的在schema作用域中定義的全局變量,在其他schema不能引用。但是在schema中定義的全局函數或者過(guò)程,則可以在其他schema中引用,只要在定義schema時(shí)使用PATH將其他schema導入即可,或者在調用函數時(shí)指定完整路徑,如 CALL com.xxx.GLOBAL_FUNCTION。很多人一開(kāi)始會(huì )對全局函數寄予厚望,因為可以減少代碼的重復,增加復用度,實(shí)則符合圣人們的教誨。只可惜呢,全局函數中不能使用通常在節點(diǎn)中的Root、ExceptionList、Environment等邏輯樹(shù),所以我在定義全局函數時(shí),第一個(gè)參數通常都是REFERENCE類(lèi)型,用來(lái)把Environment等邏輯樹(shù)傳進(jìn)去。

數組、ROW和LIST

ESQL里面有數組類(lèi)型,但你不能DECLARE一個(gè)數組變量;有ROW類(lèi)型,同時(shí)有個(gè)ROW函數專(zhuān)門(mén)用來(lái)產(chǎn)生一個(gè)ROW變量,還有個(gè)LIST函數用來(lái)產(chǎn)生數組。

先談?wù)剶到M,數組是什么大家都知道了,在ESQL里面,由于不能聲明一個(gè)數組,所以我習慣把數組保存在Environment或者LocalEnvironment中。因為消息樹(shù)的每個(gè)節點(diǎn)都可以往下增加子結點(diǎn),所以每個(gè)消息樹(shù)的中間節點(diǎn)其實(shí)都是數組,我們說(shuō) set LocalEnvironment.Variables.temp = xxx ,實(shí)際上就是 set LocalEnvironment.Variables.temp[1] = xxx

至于ROW類(lèi)型,《精通WMB》上說(shuō)是個(gè)XML單行數據,執行這條ESQL語(yǔ)句:set LocalEnvironment.root = ROW('aa' AS a, 'bb' AS b),(注意root旁邊沒(méi)有方括號[ ])生成的XML片段如下:

<root>

<a>aa</a>

<b>bb</b>

</root>

然而,ROW其實(shí)是對應與數據庫的一行數據,僅此而已。上面的root節點(diǎn)相當于一行,a和b則是該行數據的字段,就這么簡(jiǎn)單。所以,執行select語(yǔ)句時(shí),返回的就是一個(gè)ROW的數組

LIST函數是產(chǎn)生數組用的,例如:set LocalEnvironment.Var.root[ ] =LIST( 'aa', 'bb'),(root旁邊這次有方括號[])產(chǎn)生如下XML:


<Var>
<root>aa</root>
<root>bb</root>
</Var>

詳細內容,請參考老陳的《精通WMB》后面的附錄P321(我也是最近才無(wú)意中翻到ROW和LIST)

 

暫時(shí)想到這些,還有很多的,有空再補充

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
C語(yǔ)言基礎知識梳理總結(經(jīng)典)
測試你的c語(yǔ)言程度
50-100
【大智慧】如何正解理解和掌握大智慧之全局、局部變量詳解(含數組,教課書(shū)上都沒(méi)有的內容)
delphi編碼標準——過(guò)程和函數
JavaScript秘密花園
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久