对informix中的blob数据的操作

时间:2010-12-17 03:59:55

标签: blob informix substring trim

我们如何在blob数据类型的某些文本上使用子字符串,修剪,长度操作。我们如何使用查询更新blob数据类型列?

谢谢,

3 个答案:

答案 0 :(得分:3)

有困难!

首先,您正在讨论4种不同类型的blob中的哪一种:

  • BYTE
  • TEXT
  • BLOB
  • CLOB

这些成对(如Sith Lords):有二进制版本(BYTE,BLOB)和文本版本(TEXT,CLOB)。还有另一个配对:旧(BYTE,TEXT)和更新(BLOB,CLOB)。大约1989年,Informix OnLine 4.00引入了BYTE和TEXT类型。1996年,Informix Universal Server 9.00引入了BLOB和CLOB类型,也被称为SmartBlobs。

然而,有一种非常真实的感觉,与你指的是哪种类型并不重要。

可以在BYTE和TEXT blob上执行的操作非常少。它们可以被提取和存储,但是出于所有实际目的,这就是全部。我相信你可以使用LENGTH来确定TEXT blob的长度。我不相信有任何方法可以更新部分BYTE或TEXT blob;它是一个全有或全无的替代品。此外,替换来自适当类型的主变量 - 没有BYTE或TEXT文字。

SmartBlobs的情况好一点,但我不是他们的专家。有一些机制可以获得一个LO(大对象)句柄,然后对其进行操作,但我不认为它们是服务器端可用的(来自SQL或SPL)。我可能故意不了解SmartBlobs的可用内容,但我认为这些操作只能从编程API中获得,而不能在SQL中获得。也没有BLOB或CLOB文字。但是,您可以使用SQL从文件(FILETOBLOB,FILETOCLOB)加载并写入文件(LOTOFILE) - 文件在服务器上或客户端上。

答案 1 :(得分:1)

我已经回答了关于子字符串的问题:substring operation on blob text in informix 。使用BLOB,您可以使用子字符串运算符,但不能使用SUBSTRING()SUBST()函数。

您也可以使用LENGTH(),但不能使用TRIM()

示例代码:

CREATE TABLE _text_test (id serial, txt_vch varchar(200),  txt_text text);
INSERT INTO _text_test (txt_vch, txt_text) VALUES ('1234567890', '1234567890');
SELECT txt_vch, txt_text, txt_vch[3,5], txt_text[3,5], length(txt_text) FROM _text_test;

在我的示例中,我使用了TEXT blob类型(Jonathan向您展示了更多blob类型,您应该向我们展示您使用的blob类型)。最后一个选择显示了子串运算符和LENGTH()函数的用法。您可以将LENGTH()函数替换为TRIM()等其他函数,以便在您的环境中对其进行测试。在我的情况下,TRIM()测试结束于:

ODBC Error: -880 [Informix][Informix ODBC Driver][Informix]
Trim character and trim source must be of string data type.

最后选择适用于JDBC 3.70JC1驱动程序,但似乎ODBC 3.70TC1驱动程序有错误并显示3个第一个字符:123而不是345。自己测试一下。

答案 2 :(得分:0)

在最新版本(12.10)中有DBMS_LOB package 但是它没有记录的那样工作:例如,没有dbms_lob.get_length函数。相反,我发现dbms_lob_get_length正在按预期工作。 因此,对于CLOB字段,您有以下有用的操作:

  • dbms_lob_get_length;
  • dbms_lob_instr;
  • dbms_lob_substr(不幸的是它也在get_length之后获取数据);

我还发现了一个未记录但非常非常有用的函数:dbms_lob_new_clob获取lvarchar参数并将其转换为CLOB。 我知道这个答案很晚。我认为它可以帮助其他人在Informix中搜索处理blob的方法(几天前我发现这篇文章时,我开始使用blob来存储xml的迷你研究)。