首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DBMS_LOB出错

使用DBMS_LOB出错
EN

Stack Overflow用户
提问于 2016-03-07 09:03:11
回答 2查看 457关注 0票数 0

以下是我的查询:

代码语言:javascript
复制
SELECT dbms_lob.compare(NVL(original_xmldoc,'Null'),NVL(update_xmldoc,'Null'))
FROM xml_files;

当我执行时,我收到一个错误:

代码语言:javascript
复制
ORA-06553: PLS-306: wrong number or types of arguments in call to 'COMPARE'
06553. 00000 -  "PLS-%s: %s"

我的语法有什么问题吗?

打招呼,

Nelz Ki

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-07 09:34:43

如果您的数据类型是CLOB,那么可以:

代码语言:javascript
复制
SELECT DBMS_LOB.COMPARE(
         NVL( original_xmldoc, Empty_CLOB() ),
         NVL( updated_xmldoc,  Empty_CLOB() )
       )
FROM xml_files;

但是,这可能不会产生您正在看到的错误,所以我假设您使用的是XMLType数据类型:

代码语言:javascript
复制
SELECT DBMS_LOB.COMPARE(
         NVL( original_xmldoc.getClobVal(), Empty_CLOB() ),
         NVL( updated_xmldoc.getClobVal(),  Empty_CLOB() )
       )
FROM xml_files;

(您可以使用魔术字符串'Null'__,如您的示例所示,而不是Empty_CLOB(),但在我看来,与空字符串而不是组合值进行比较更自然-但是,您比我们更了解您的数据,因此它可能正好相反。)

票数 2
EN

Stack Overflow用户

发布于 2016-03-07 09:28:25

从您以前的问题来看,您的列是XMLType,而不是CLOB:

代码语言:javascript
复制
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'

function期望CLOBs (或BLOB)或一些被隐式转换为它们的东西。XMLTypes不能。因此,您需要显式地转换它们:

代码语言:javascript
复制
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设置可能会改变固定字符串版本本身的结果。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35839734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档