PL / SQL如何比较两个关联数组?

时间:2018-02-19 03:07:25

标签: oracle plsql

如何检查两个关联数组是否相同? E.g。

ARRAY1('ID') := 1;
ARRAY1('NAME') := 'Joe';

ARRAY2('ID') := 1;
ARRAY2('NAME') := 'Joe';

-- and i want to do like this
IF ARRAY1 = ARRAY2 THEN
   -- Do something.
END IF;

2 个答案:

答案 0 :(得分:2)

您可以使用函数比较两个关联数组来比较键和值:

DECLARE
  TYPE test_array IS TABLE OF VARCHAR2(200) INDEX BY VARCHAR2(10);
  array1 test_array;
  array2 test_array;
  array3 test_array;

  FUNCTION is_equal(
    arr1 test_array,
    arr2 test_array
  ) RETURN BOOLEAN
  IS
    i VARCHAR2(10);
  BEGIN
    i := arr1.FIRST;
    WHILE i IS NOT NULL LOOP
      -- Check if the keys in the first array do not exists in the
      -- second array or if the values are different.
      IF    ( NOT arr2.EXISTS( i ) )
         OR ( arr1(i) <> arr2(i) )
         OR ( arr1(i) IS NULL AND arr2(i) IS NOT NULL )
         OR ( arr1(i) IS NOT NULL AND arr2(i) IS NULL )
      THEN
        RETURN FALSE;
      END IF;
      i := arr1.NEXT(i);
    END LOOP;

    i := arr2.FIRST;
    WHILE i IS NOT NULL LOOP
      -- Check if there are any keys in the second array that do not
      -- exists in the first array.
      IF    ( NOT arr1.EXISTS( i ) )
      THEN
        RETURN FALSE;
      END IF;
      i := arr2.NEXT(i);
    END LOOP;

    RETURN TRUE;
  END;
BEGIN
  array1('ID')   := '1';
  array1('NAME') := 'Joe';

  array2('ID')   := '1';
  array2('NAME') := 'Joe';

  array3('ID')   := '1';
  array3('NAME') := 'Joe';
  array3('XYZ')  := 'ABC';

  IF is_equal( array1, array2 ) THEN
    DBMS_OUTPUT.PUT_LINE( '1 and 2 are the same' );
  ELSE
    DBMS_OUTPUT.PUT_LINE( '1 and 2 are different' );
  END IF;

  IF is_equal( array1, array3 ) THEN
    DBMS_OUTPUT.PUT_LINE( '1 and 3 are the same' );
  ELSE
    DBMS_OUTPUT.PUT_LINE( '1 and 3 are different' );
  END IF;
END;
/

输出:

1 and 2 are the same
1 and 3 are different

答案 1 :(得分:0)

Oracle文档是你的朋友。

https://docs.oracle.com/database/121/LNPLS/composites.htm#LNPLS99915

特别是:

您无法将关联数组变量与值NULL或彼此进行比较。

这意味着,如果你需要将关联数组相互比较,你只有两个选择......逐个元素地检查它们,例如在一个循环中(在一个数组的元素上 - 并确保你检查到看看他们是否有相同数量的元素);或者,如果您经常需要这样做,请编写自己的函数,以这种方式比较数组,并在需要时调用它。

请不要问为什么Oracle没有为此提供本机PL / SQL功能;你很可能得不到答案。