2012-02-10 6 views
3

Можно ли сравнивать переменные исходных типов данных? Я работаю с XMLDOM.DomNodes, что записи с одним полем сам по себе:PL/SQL Сравнение переменных типа данных

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

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

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 меня беспокоит: Raw data is like VARCHAR2 data, except that PL/SQL does not interpret raw data Что это значит? Если pl/sql не интерпретирует raw, то может ли он сравниться?

ответ

4

Вы можете использовать оператор =, если хотите, чтобы две переменные 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

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

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

+0

Мне кажется, что = оператор также может сравнивать raws, но если он пойдет не так, я буду использовать ваш совет. благодаря –

-1

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

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

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