使用DBMS_LOB时出错

时间:2016-03-07 09:03:11

标签: xml oracle

以下是我的询问:

SELECT dbms_lob.compare(NVL(original_xmldoc,'Null'),NVL(update_xmldoc,'Null'))
FROM xml_files;

执行时,我收到错误:

ORA-06553: PLS-306: wrong number or types of arguments in call to 'COMPARE'
06553. 00000 -  "PLS-%s: %s"

我的语法有问题吗?

的问候,

Nelz Ki

2 个答案:

答案 0 :(得分:2)

如果您的数据类型为SELECT DBMS_LOB.COMPARE( NVL( original_xmldoc, Empty_CLOB() ), NVL( updated_xmldoc, Empty_CLOB() ) ) FROM xml_files; ,则可以执行以下操作:

XMLType

但是,这可能不会产生您看到的错误,因此我假设您使用的是SELECT DBMS_LOB.COMPARE( NVL( original_xmldoc.getClobVal(), Empty_CLOB() ), NVL( updated_xmldoc.getClobVal(), Empty_CLOB() ) ) FROM xml_files; 数据类型:

'Null'

(根据你的例子,你可以使用魔术字符串Empty_CLOB()而不是 from spiders.DmozSpider import DmozSpider from spiders.CraigslistSpider import CraigslistSpider from scrapy import signals, log from twisted.internet import reactor from scrapy.crawler import Crawler from scrapy.settings import Settings TO_CRAWL = [DmozSpider, CraigslistSpider] RUNNING_CRAWLERS = [] def spider_closing(spider): """Activates on spider closed signal""" log.msg("Spider closed: %s" % spider, level=log.INFO) RUNNING_CRAWLERS.remove(spider) if not RUNNING_CRAWLERS: reactor.stop() ,但在我看来比较空字符串而不是组合值更自然 - 但是,您比我们更了解您的数据,因此反过来可能是合适的。)

答案 1 :(得分:1)

根据您之前的问题,您的列是XMLType,而不是CLOB:

create table xml_files(original_xmldoc xmltype, update_xmldoc xmltype);

SELECT dbms_lob.compare(NVL(original_xmldoc,'Null'),NVL(update_xmldoc,'Null'))
FROM xml_files;

ORA-06553: PLS-306: wrong number or types of arguments in call to 'COMPARE'

dbms_lob.compare() function期望CLOB(或BLOB)或隐式转换为它们的东西。 XMLTypes不能。所以你需要明确地转换它们:

SELECT dbms_lob.compare(NVL(x.original_xmldoc.getclobval(),'Null'),
  NVL(x.update_xmldoc.getclobval(),'Null'))
FROM xml_files x;

但是,您正在将固定字符串值与XML文档进行比较,并且可能会得到错误的结果,因为您正在进行语言比较,主要是在该字符串的'N''<'之间一个实际的XML文档。正如MTO所说,使用empty_clob()而不是'Null'可能更好 - 通过快速测试他们会得到相反的结果。 NLS设置可能会改变固定字符串版本的结果 - 本身就很糟糕。

可以说,如果你只是在寻找零(相同)或非零(由于任何原因不同)的结果,那么它并不重要,但它仍然更好是正确的。也许有人会在以后查看实际值而不会意识到这是错误的。