Elic,
CREATE TABLE t(x int, y int);
CREATE OR REPLACE PACKAGE comp_pkg AS
TYPE t_type IS TABLE OF t%ROWTYPE;
FUNCTION f_pipe RETURN t_type PIPELINED;
FUNCTION is_records_equal(x t%ROWTYPE, y t%ROWTYPE) RETURN BOOLEAN;
end comp_pkg;
/
CREATE OR REPLACE PACKAGE BODY comp_pkg AS
gT t_type;
FUNCTION f_pipe RETURN t_type PIPELINED IS
BEGIN
PIPE ROW(gT(1)); PIPE ROW(gT(2));
END f_pipe;
FUNCTION is_records_equal(x t%ROWTYPE, y t%ROWTYPE) RETURN BOOLEAN IS
lCNT NUMBER;
BEGIN
gT := t_type(x, y);
SELECT COUNT(*)
INTO lCNT
FROM (SELECT DISTINCT * FROM TABLE(comp_pkg.f_pipe));
RETURN (lCNT = 1);
END is_records_equal;
END comp_pkg;
/
SET SERVEROUTPUT ON SIZE 100000;
DECLARE
r1 t%ROWTYPE;
r2 t%ROWTYPE;
BEGIN
r1.x:=1; r1.y:=1;
r2.x:=1; r2.y:=1;
dbms_output.put_line(CASE WHEN comp_pkg.is_records_equal(r1, r2) THEN '=' ELSE '<>' END);
r1.x:=1; r1.y:=1;
r2.x:=1; r2.y:=2;
dbms_output.put_line(CASE WHEN comp_pkg.is_records_equal(r1, r2) THEN '=' ELSE '<>' END);
r1.x:=1; r1.y:=1;
r2.x:=1; r2.y:=NULL;
dbms_output.put_line(CASE WHEN comp_pkg.is_records_equal(r1, r2) THEN '=' ELSE '<>' END);
r1.x:=1; r1.y:=NULL;
r2.x:=1; r2.y:=NULL;
dbms_output.put_line(CASE WHEN comp_pkg.is_records_equal(r1, r2) THEN '=' ELSE '<>' END);
END;
/
Получаем:
=
<>
<>
=