2012-02-10 33 views
3

是否可以比較原始數據類型的變量? 我與XMLDOM.DomNodes工作,這是一個字段記錄本身:PL/SQL原始數據類型變量比較

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文檔中有一兩件事讓我擔心: 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返回零。如果它們不是 相同,則比較返回 不匹配的第一個字節的位置。如果輸入值具有不同的長度,則較短的輸入值在右側填充一個值 指定的值。

+0

在我看來,=運算符也可以比較原始數據,但如果出現錯誤,我會使用您的建議。謝謝 – 2012-02-10 10:20:07

-1

您必須使用:

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

Oracle不正確地比較空白/空的字符串,所以你必須指定,如果是null或空,然後給它比其他不同的含義。