2012-02-10 35 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或空,然后给它比其他不同的含义。