2012-02-10 8 views
3

生データ型の変数を比較できますか? 私は、それ自体で一つのフィールドを持つレコードである、XMLDOM.DomNodesで働いている:PL/SQLのRAWデータ型変数の比較

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

だから私は二つのノードを持って、私は自分のIDフィールドでそれらを比較することができますか?私はいくつかのサンプルを試してみましたが、最初の一目で動作するようです:Oracleのドキュメントで

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; 

が、1つの事は私を心配: Raw data is like VARCHAR2 data, except that PL/SQL does not interpret raw data それが何を意味するのでしょうか? pl/sqlがrawを解釈しない場合は、それを比較できますか?

答えて

4

2つの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

ドキュメンテーションの意味はわかりませんが、2つのローを比較するにはUTL_RAW.COMPARE関数を使用します。詳細はhereを参照してください。

UTL_RAW.COMPAREは、1つの生の値と別の生の値を比較します。それらが である場合、UTL_RAW.COMPAREはゼロを返します。 が一致しない場合は、 が一致しない最初のバイトの位置が返されます。入力値の長さが異なる場合、短い入力値の は、右側に の値で埋められます。

+0

=私はオペレータも生のものを比較することができますが、それが間違っている場合は、あなたのアドバイスを使用します。ありがとう –

-1

あなたが使用する必要があります。

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

Oracleが正しく空の/ NULL文字列を比較しませんので、あなたはそれがnullまたは空の場合、それに他とは異なる意味を与えることを指定する必要があります。