Сравнение переменных типа данных PL / SQL Raw - PullRequest
4 голосов
/ 10 февраля 2012

Можно ли сравнивать переменные необработанных типов данных?Я работаю с XMLDOM.DomNodes, который сам по себе является записями с одним полем:

TYPE DOMNode IS RECORD (id RAW(12));

Итак, у меня есть два узла, тогда я мог бы сравнить их по их полям id?Я попробовал несколько примеров, и на первый взгляд кажется, что это работает:

  FUNCTION findParentNode(p_node IN xmldom.domnode) RETURN PLS_INTEGER
  AS
      nRetVal               PLS_INTEGER;
  BEGIN
     FOR i IN ParentNodes.First .. ParentNodes.Last
     LOOP 
         IF ParentNodes(i).id = p_node.id THEN               
            nRetVal := i;
            EXIT;
         END IF;         
     END LOOP;

     RETURN nRetVal;
  END;

, но одна вещь в документации Oracle беспокоит меня: Необработанные данные похожи на данные VARCHAR2, за исключением того, что PL / SQL не интерпретирует необработанныеданные Что это значит?Если pl / sql не интерпретирует raw, то можно ли его сравнить?

Ответы [ 3 ]

5 голосов
/ 10 февраля 2012

Вы можете использовать оператор =, если хотите увидеть, имеют ли две переменные RAW одинаковые значения.

SQL> DECLARE
  2     a RAW(255) := utl_raw.cast_to_raw('abcdef');
  3     b RAW(50) := utl_raw.cast_to_raw('abcdef');
  4  BEGIN
  5     IF a = b THEN
  6        dbms_output.put_line('a = b');
  7     ELSE
  8        dbms_output.put_line('a != b');
  9     END IF;
 10  END;
 11  /
a = b

Когда в документации говорится, что RAW похож на VARCHAR2, но не интерпретируется, это означает, чточто вы можете влиять, хранить и даже сравнивать переменные RAW так же, как и VARCHAR2, но двоичное значение никогда не сопоставляется с набором символов.

Переменные VARCHAR2, с другой стороны, могут быть преобразованы из-за несоответствия между наборами символов базы данных и клиента.

RAW - это строка байтов вместо строки символов.

2 голосов
/ 10 февраля 2012

Я не уверен, что под этим подразумевается в документации, но для сравнения двух строк я бы использовал функцию UTL_RAW.COMPARE.Подробности см. здесь .

UTL_RAW.COMPARE сравнивает одно необработанное значение с другим необработанным значением.Если они идентичны, то UTL_RAW.COMPARE возвращает ноль.Если они не идентичны, то COMPARE возвращает позицию первого байта, который не совпадает.Если входные значения имеют разную длину, то более короткое входное значение дополняется справа указанным вами значением.

0 голосов
/ 15 февраля 2013

Вы должны использовать:

IF(NVL(a,'X') != NVL(b,'Y')) THEN
.....

Oracle неправильно сравнивает пустые / пустые строки, поэтому вы должны указать, что если оно пустое или пустое, то дайте ему значение, отличное от другого.

...