是否可以比较原始数据类型的变量? 我正在使用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文档中的一件事让我担心: Raw data is like VARCHAR2 data, except that PL/SQL does not interpret raw data 这是什么意思?如果pl / sql不解释raw,那么可以进行比较吗?
答案 0 :(得分:5)
如果要查看两个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是一串字节而不是字符串。
答案 1 :(得分:2)
我不确定文档的含义是什么,但比较两个原始文件,我使用UTL_RAW.COMPARE
函数。有关详细信息,请参阅here。
UTL_RAW.COMPARE将一个原始值与另一个原始值进行比较。如果他们 是相同的,然后UTL_RAW.COMPARE返回零。如果他们不是 相同,然后COMPARE返回第一个字节的位置 不匹配。如果输入值有不同的长度,那么 较短的输入值在右侧用您填写的值填充 指定。
答案 2 :(得分:-1)
您必须使用:
IF(NVL(a,'X') != NVL(b,'Y')) THEN
.....
Oracle没有正确地比较空/空字符串,所以你必须指定如果它是null或为空,那么给它一个与另一个不同的含义。