从 oracle 中的 clob 中提取子字符串
Posted
技术标签:
【中文标题】从 oracle 中的 clob 中提取子字符串【英文标题】:extract a substring from clob in oracle 【发布时间】:2012-04-25 04:16:38 【问题描述】:我有一个数据块
<?xml version='1.0' encoding='UTF-8'?><root available-locales="en_US" default-locale="en_US"><static-content language-id="en_US"><![CDATA[<script type="text/javascript">
function change_case()
alert("here...");
document.form1.type.value=document.form1.type.value.toLowerCase();
</script>
<form name=form1 method=post action=''''>
<input type=text name=type value=''Enter USER ID'' onBlur="change_case();">
<input type=submit value=Submit> </form>
</form>]]></static-content></root>
我想提取带有 onblur 属性的行,在这种情况下:
<input type=text name=type value=''Enter USER ID'' onblur="change_case();">
【问题讨论】:
这个 Javascript 代码与 Oracle 有什么关系? 是存储在表的CLOB中的文本 【参考方案1】:Tom Kyte 说如何在 SQL 或 PL/SQL 代码中从 clob 获取 varchar2
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:367980988799
当你有 varchar2 时,你可以使用 SUBSTR 或 REGEXP_SUBSTR 函数来提取行。
http://docs.oracle.com/cd/B14117_01/server.101/b10759/functions147.htm#i87066
http://docs.oracle.com/cd/B14117_01/server.101/b10759/functions116.htm
如果你想使用 SQL 代码,你可以创建这个请求
select col1, col2, func1(dbms_lob.substr( t.col_clob, 4000, 1 )) from table1 t
在 PL/SQL 函数“func1”中,您可以使用 SUBSTR 或任何其他函数对输入字符串执行您想要的操作
【讨论】:
substr 将字符串、起始位置和长度作为参数 substr(string, start_position, length),在这种情况下,我可以通过使用 标签。 我不能使用 pl/sql,如何使用 DBMS_LOB.SUBSTR 提取带有 html 片段 的行,我只需要在 sql 语句中执行(没有 pl/sql)【参考方案2】:细分您的问题。您想从包含特定子字符串的 CLOB 中提取一行文本。对于您的要求,我可以想到两种可能的解释:
选项 1。
-
将 CLOB 拆分为一系列行 - 例如如果这确实是您所说的“行”,则将其拆分为换行符/回车符。
检查每一行是否包含子字符串,例如
onblur
。如果是这样,您已经找到了您的线路。
选项 2。
如果您实际上不是指行,而是想要<script>...</script>
html 片段,则可以使用类似的逻辑:
-
搜索第一次出现的
<script>
。
在该点之后搜索</script>
的下一个匹配项。提取从<script>
到</script>
的子字符串。
在子字符串中搜索onblur
。如果找到,则返回子字符串。否则,找到下一个出现的<script>
,转到第2步,冲洗,重复。
【讨论】:
让我提出一个直接的问题。如何使用 DBMS_LOB.SUBSTR 提取带有 html 片段 的行,我只需要在 sql 语句中执行它(没有 pl/sql) 你用的是什么版本?SUBSTR
适用于 10g 和 11g 中的 CLOB。
10g,SUBSTR(str,pos,len),我需要做一些不支持的事情,比如 SUBSTR(str,pos,pos2) :(
嗯,你知道len可以从pos2和pos派生吗?
dbms.instr('script'>) 给出起始位置,即.. pos,我需要 pos2 即。 标签以上是关于从 oracle 中的 clob 中提取子字符串的主要内容,如果未能解决你的问题,请参考以下文章
从 Oracle 表中提取 300,000 个字符的 CLOB 到 CSV
使用 Oracle 数据库中的 SQL 从 CLOB 数据中提取数据
使用 Oracle 数据库中的 SQL 从 XML Clob 中提取数据