2016-11-30 3 views
3

Sur Oracle 11gR2, j'ai créé un type d'objet PL/SQL simple. Lorsque vous essayez de comparer deux cas pour l'égalité/inégalité, je reçois une erreur PLS-00526: A MAP or ORDER function is required for comparing objects in PL/SQL, même si le Oracle documentation indique clairement que"PLS-00526: Une fonction MAP ou ORDER est requise" lors de la comparaison d'objets pour l'égalité

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

Voici l'exemple PL/code SQL j'ai utilisé pour reproduire l'erreur:

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; 
/
+0

Intéressant. Le comportement semble contredire la documentation. –

Répondre

2

Oui, si ni la méthode MAP ni ORDER n'est spécifiée, vous pouvez comparer les objets pour l'égalité ou l'inégalité, mais UNIQUEMENT dans les instructions SQL, PAS directement dans un bloc PL/SQL.

Citation de 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; 

Résultat:

Type created. 

CMP_RES 
------- 
OK  

1 row selected. 

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

Mais s'il est nécessaire de comparer directement les objets en bloc PL/SQL que vous devez définir des règles de comparaison d'objets (lorsque un objet est égal/inégal, supérieur ou inférieur à un autre objet, en particulier lorsqu'un objet possède de nombreuses propriétés) MAP ou ORDER méthodes doivent être mises en œuvre.