2011-09-28 28 views
1

我有一个包含大量数据的CLOB列的Oracle SQL数据库。我遇到了一个问题,即普通的PHP字符串变量不能保存我在CLOB列中的所有数据。它只能读取4618位,但我的文件要大得多。 CLOB列有一系列IP地址。我需要做的是分析CLOB列,以便我可以提取这些IP地址;但是,字符串变量不会保留足够的数据,甚至无法访问存储IP地址的文档部分。有什么想法吗?如何读取太大而不适合字符串的CLOB列?

+2

我有,你应该用一个外键指向回原来的表存储在单独的表你的IP地址的感觉。 – Bojangles

+0

PHP中字符串的长度没有限制(系统内存或memory_limit除外)。你是否收到错误信息? – timdev

+0

好吧,当我做到这一点,并尝试回声$ IPADDR,页面加载罚款,对文件的只显示了一部分: $ IPADDR = $ clob->阅读(700); 然而,当我做到这一点,页面没有加载: $ IPADDR = $ clob->阅读($ clob->大小()); 然后,我会收到以下错误消息: XML分析错误:格式不正确 – stix122

回答

0

根据您的意见:

如果你就在你的浏览器中单击并说“查看源文件”,你会看到你确实有整个文件。

最有可能你只需要发射的数据返回给浏览器时,设置相应的ContentType。

+0

好吧,contentType是XML,并且该字符串嵌入在XML标记中。我应该做一些不同的事情吗? – stix122

+0

@ stix122:可能。我经常看到浏览器抱怨文件不符合XML,恕我直言,它是。你可以看看下面的内容,看看它是否有助于解决你的实际问题http://mycodetrip.com/2007/03/26/fix-for-xml-parsing-error-not-well-formed-line-number-1 -column -2- error_36 / – NotMe

0

首先,尝试增加PHP内存限制,看看是否有错误产生任何影响。如果正在检索的CLOB对象真的很大,比如2 GiB,那么在PHP中无法处理它,因为整个对象必须保存在内存中。

如果列具有固定长度的数据,它应该是相当容易的构成,其提取它的一部分的适当的查询。假设数据被编码为固定长度的文本,然后像这样将工作:

// assumes subfield is xxx.xxx.xxx.xxx: 19 fixed characters 
SELECT substr (TO_CHAR(gnarly_ipadddress_fieldname), 1, 19) as ipaddr1, 
     substr (TO_CHAR(gnarly_ipadddress_fieldname), 20, 19) as ipaddr2, 
     substr (TO_CHAR(gnarly_ipadddress_fieldname), 39, 19) as ipaddr3 
FROM table 
WHERE (whatever); 

如果子字段是可变长度的话,说不定抓住像16K块,并在PHP解析它是要走的路。