Из ваших предыдущих вопросов ваши столбцы 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 ожидает CLOBs (или BLOB) или что-то, что неявно преобразованы в их. XMLTypes не может. Так что вам нужно явно преобразовать их:
SELECT dbms_lob.compare(NVL(x.original_xmldoc.getclobval(),'Null'),
NVL(x.update_xmldoc.getclobval(),'Null'))
FROM xml_files x;
Но вы сравниваете ваше фиксированное значение строки против документа XML и может получить неверный результат, так как вы делаете лингвистическое сравнение, по существу, между 'N'
того string и '<'
фактического документа XML. Как сказал MTO, вероятно, лучше использовать empty_clob()
вместо 'Null'
- с быстрым тестом они получают противоположные результаты. И настройки NLS могут потенциально изменить результат версии с фиксированной строкой - что само по себе плохо.
Возможно, если вы ищете только нулевой результат (тот же) или ненулевой (по какой-либо причине), то это не имеет значения, но для него все же лучше, если оно будет правильным. Может быть, кто-то посмотрит на фактическое значение позже и не поймет, что это неправильно.
Появляются 3 значения, 1, 0 и -1. В чем разница значений 1 и -1? – NelzKi
[DBMS_LOB.COMPARE() Documentation] (http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_lob.htm#i1016668) просто заявляет, что «COMPARE возвращает ноль, если данные точно соответствуют диапазон, заданный параметрами смещения и количества. В противном случае возвращается ненулевой INTEGER. ". Однако типичная функция сравнения 'COMPARE (A, B)' вернет '-1', где' A B', и вернет '0', когда' A = B' (и эта функция, похоже, следует этой схеме - хотя она, как представляется, официально не документирована). – MT0