4

是否可以比较原始数据类型的变量?我正在使用 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 不解释原始,那么它可以比较吗?

4

3 回答 3

6

=如果要查看两个 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 但未解释时,这意味着您可以像 VARCHAR2 一样影响、存储甚至比较 RAW 变量,但二进制值永远不会与字符集匹配。

另一方面,由于数据库和客户端的字符集不匹配,可以转换 VARCHAR2 变量。

RAW 是一串字节而不是一串字符。

于 2012-02-10T09:10:44.693 回答
2

我不确定文档的含义是什么,但为了比较两个原始数据,我会使用该UTL_RAW.COMPARE函数。有关详细信息,请参见此处

UTL_RAW.COMPARE 将一个原始值与另一个原始值进行比较。如果它们相同,则 UTL_RAW.COMPARE 返回零。如果它们不相同,则 COMPARE 返回不匹配的第一个字节的位置。如果输入值具有不同的长度,则较短的输入值将在右侧填充您指定的值。

于 2012-02-10T07:39:03.553 回答
-1

您必须使用:

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

Oracle 不会正确比较空/空字符串,因此您必须指定如果它为空或空,则赋予它与另一个不同的含义。

于 2013-02-14T21:50:15.587 回答