2016-11-30 5 views
3

Oracle 11gR2에서 간단한 PL/SQL 오브젝트 유형을 생성했습니다.오브젝트를 비교할 때 "PLS-00526 : MAP 또는 ORDER 함수가 필요함"

create or replace type point_t is object (x number, y number); 
/

declare 
    p1 point_t := point_t(1, 2); 
    p2 point_t := point_t(1, 2); 
    p3 point_t := point_t(2, 1); 
begin 
    dbms_output.put_line('p1 = p1 ' || case when p1 = p1 then 'OK' else 'FAIL' end); 
    dbms_output.put_line('p2 = p1 ' || case when p2 = p1 then 'OK' else 'FAIL' end); 
    dbms_output.put_line('p3 <> p1 ' || case when p3 <> p1 then 'OK' else 'FAIL' end); 
end; 
/
: 평등/불평등에 대한 두 인스턴스를 비교하려고 할 때, 나는 Oracle documentation 명확하게

여기

If neither a MAP nor an ORDER method is specified, then only comparisons for equality or inequality can be performed.

내가 오류를 재현하는 데 사용되는 PL/SQL 코드의 예입니다한다고하더라도 PLS-00526: A MAP or ORDER function is required for comparing objects in PL/SQL 오류

+0

흥미 롭습니다. 이 동작은 문서와 모순되는 것 같습니다. –

답변

2

예, MAP도 아니고 ORDER 메서드도 지정되어 있지 않은 경우 개체를 평등이나 비항 등으로 비교할 수 있지만 SQL 문에서만 비교할 수 있으며 직접 PL/SQL 블록이 아닙니다.

견적에서 Database Object-Relational Developer's Guide

if you do not declare one of these methods, you can only compare objects in SQL statements, and only for equality or inequality.

create or replace type point_t is object (x number, y number); 
/

select case 
     when point_t(1,1) = point_t(1,1) then 'OK' 
     else 'FAIL' 
     end as cmp_res 
    from dual; 


set serveroutput on; 
declare 
    l_p1 point_t := point_t(1,2); 
    l_p2 point_t := point_t(1,2); 
    l_res varchar2(7) := 'OK'; 
begin 
    select 'FAIL' 
    into l_res 
    from dual 
    where l_p1 != l_p2; -- put it in the where clause just for the sake 
         -- of demonstration. Can do comparison in the 
         -- select list as well. 
    dbms_output.put_line('p1 = p2 : ' || l_res); 
end; 

결과 :

Type created. 

CMP_RES 
------- 
OK  

1 row selected. 

p1 = p2 : FAIL 
PL/SQL procedure successfully completed. 

그러나

당신이 객체 비교 규칙을 정의 할 필요가 PL/SQL 블록에서 직접 객체를 비교 할 필요가 (있는 경우 하나의 객체가 동일/불균등, 다른 객체보다 크거나 작음, 특히 객체의 속성이 많은 경우) MAP 또는 ORDER 가지 방법을 구현해야합니다.