2013-12-11 39 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 
.