2016-03-07 2 views
0

Ниже мой запрос:Ошибка при помощи DBMS_LOB

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

Если типы данных CLOB, то вы можете сделать:

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(), но мне кажется более естественным сравнивать с пустой строкой, а не с составленной ценность - однако вы знаете свои данные лучше нас, поэтому, возможно, было бы целесообразно обратное.)

+0

Появляются 3 значения, 1, 0 и -1. В чем разница значений 1 и -1? – NelzKi

+0

[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

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 ожидает 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 могут потенциально изменить результат версии с фиксированной строкой - что само по себе плохо.

Возможно, если вы ищете только нулевой результат (тот же) или ненулевой (по какой-либо причине), то это не имеет значения, но для него все же лучше, если оно будет правильным. Может быть, кто-то посмотрит на фактическое значение позже и не поймет, что это неправильно.

Смежные вопросы