2012-09-17 68 views
2

我试图将一个CLOB保存到一个变量来执行像提取等操作。我有这样的代码:PLSQL CLOBS到变量

DECLARE 
    clob_rec CLOB; 
    n_rec NUMBER:=100; 
BEGIN 
    SELECT LOB INTO clob_rec FROM table1 WHERE ID = 1234; 
    n_rec := clob_rec.EXTRACT('//XPTO/text()', 'xmlns:XPTO').getNumVal(); 
END; 

我想从XML保存多个值,以各种变量像n_rec。如何获取“对象实例(CLOB)”来执行函数或方法,如extract()

+1

您可以使用['dbms_lob'](http://docs.oracle.com/cd/E11882_01/appdev.112/e10577/ d_lob.htm)包来操纵CLOB变量;但'extract'是一个XML概念,所以你有'XMLType'专栏,或者你需要类似['XMLCast'](http://docs.oracle.com/cd/E14072_01/appdev.112/e10492 /xdb04cre.htm#CHDBIIJG)?不知道我明白这个问题足以发布这个答案... –

回答

3

您需要先将其转换成一个XMLType:

DECLARE 
    clob_rec CLOB; 
    n_rec NUMBER:=100; 
    x XMLType; 
BEGIN 
    SELECT LOB INTO clob_rec FROM table1 WHERE ID = 1234; 
    x := XMLType(clob_rec); 
    n_rec := x.EXTRACT('//XPTO/text()', 'xmlns:XPTO').getNumVal(); 
END; 
+0

蒂塔正是它杰弗里坎普。我会将其标记为解决方案,但我还有另一个问题,我真的很感谢你或任何其他人的帮助。有什么办法可以在从xml提取节点值时忽略名称空间吗?所有的XML都针对相同的SCHEMA进行验证,但是它们有不同的名称空间,一些是“er:xxx”,一些是“ns:yyy”。我想忽略这些命名空间,所以我将有一种方法可以对所有CLOBS执行相同的过程。非常感谢你。 – DaveQuinn

+1

我认为对不同的模式分别制定程序会更好;尽管我认为你可以通过使用'*'xpath表达式来跳过命名空间,例如'x.Extract('/ */node/text()')' - 但我不是XPath的世界专家,所以请亲自尝试一下:) –