2013-12-11 41 views
1

正如已知的Progress提供了4種大對象數據類型的數據類型MEMPTR,CLOB,BLOB,LONGCHAR。正在進行的LOB的使用4GL

但字符串函數不能用於CLOB或LONGCHAR數據類型。

如何在這些LOB數據類型上使用執行字符串操作。 「字符串操作」是指可以對字符串執行的子字符串,替換,修剪等功能。更清晰

將vChar定義爲字符INITIAL「ashdbi」NO_UNDO。 MESSAGE SUBSTRING(vChar,1,1) VIEW-AS ALERT_BOX。

我們可以用同樣的方法在LOB上執行字符串操作嗎?

+0

能否請您更具描述。 「字符串操作」 - 你能舉一個例子嗎?很抱歉張貼在這裏..我不能「評論」,因爲我沒有足夠的聲譽 – Austin

+0

非常高興的響應奧斯汀。「字符串操作」意味着子串,替換,修剪等功能,可以在字符串上執行。 更清楚SUBSTRING(vChar,1,1)。 – Ravi

回答

4

CLOB存儲在數據庫中,LONGCHAR是用於本地操作的數據類型。如果您存儲BLOB,則必須使用MEMPTR才能在本地處理它。

由於您詢問了有關STRING的函數,我假設CLOBS和LONGCHARs是您所追求的(CLOB = Chaplercter Large Object,假設爲BLOB = Binary Large Object)。

可以在LONGCHARS上使用幾個(或某些)字符串操作方法和函數,例如SUBSTRING。無論您使用的是CHARACTER還是LONGCHAR,都會顯示語法。如果你想

示例 - SUBSTRING,INDEX和複製LOB

DEFINE VARIABLE cStart AS LONGCHAR NO-UNDO. 
DEFINE VARIABLE cEnd AS LONGCHAR NO-UNDO. 
DEFINE VARIABLE cString AS CHARACTER NO-UNDO. 

DEFINE VARIABLE i  AS INTEGER  NO-UNDO. 

/* Fill the variable with lots of bogus data */ 
DO i = 1 TO 10000: 
    cStart = cStart + "ABCDEFGHIJKLMN". 
    /* Insert a _ once in 100 */ 
    IF RANDOM(1, 100) = 100 THEN cStart = cStart + "_". 
END. 

DISPLAY LENGTH(cStart). 

/* SUBSTRING */ 
cEnd = SUBSTRING(cStart, 1, 100000). 

DISPLAY LENGTH(cEnd). 

/* Is there a _ in the string - most likely! */ 
DISPLAY INDEX(cStart, "_"). 

/* SUBSTRING will convert output to CHARACTER if the length is less than roughly 32k */ 
cString = SUBSTRING(cStart, 1, 30000). 

DISPLAY cString. 

/* Lets save the CLOB so we can look at it */ 
COPY-LOB FROM cStart TO FILE "c:\temp\testing.txt". 

/* Actually you can DISPLAY a LONGCHAR as well but why would you really? */ 
DISPLAY cStart 
    VIEW-AS EDITOR LARGE INNER-LINES 300 INNER-CHARS 300 
    WITH FRAME x1 WIDTH 320 . 
+0

你可以用一個例子來說明一下嗎?使用字符串函數在clob @jensd – Ravi

+0

完成,請告訴我你是否需要更多的例子 - 在這種情況下 - 什麼函數/方法? – Jensd

+0

很好的答案。一些LONGCHAR行爲是依賴於版本的,而Ravi沒有提到他使用的OpenEdge版本。但任何合理的現代應該工作得很好。 –

1

有在舊版本,但「字符串函數」工作的一些例外很好的LONGCHAR數據。

要在各種大型對象(CLOB,BLOB,MEMPTR和文件)和LONGCHAR之間獲取數據並且需要使用COPY-LOB語句。懷疑這是你缺少的「祕密武器」。

例如:

define variable cfgData as longchar no-undo. 

assign file-info:file-name = search("etc/stomp.cfg"). 
copy-lob from file file-info:full-pathname to cfgData no-error. 

stompCfg = new dotr.Stomp.StompConfig(). 
assign 
    stompCfg:StompPort = "61613" 
    stompCfg:StompServer = entry(1, cfgData, ":") 
    stompCfg:StompPort = entry(2, cfgData, ":") when num-entries(cfgData, ":") > 1 
    stompCfg:LargeMessageSupport = yes 
.