@@ -1670,4 +1670,193 @@ CREATE OR REPLACE TYPE BODY t_json IS
1670
1670
unpin(':i', p_unpin_tree, bind(p_index));
1671
1671
END;
1672
1672
1673
+ -- Value comparison
1674
+
1675
+ MEMBER FUNCTION compare_to (
1676
+ p_value IN t_json
1677
+ )
1678
+ RETURN t_json_mismatches IS
1679
+
1680
+ v_path t_varchars;
1681
+ v_mismatches t_json_mismatches;
1682
+
1683
+ PROCEDURE add_mismatch (
1684
+ p_code IN VARCHAR2
1685
+ ) IS
1686
+ BEGIN
1687
+ v_mismatches.EXTEND(1);
1688
+ v_mismatches(v_mismatches.COUNT) := t_json_mismatch(v_path, p_code);
1689
+ END;
1690
+
1691
+ PROCEDURE push_name (
1692
+ p_name IN VARCHAR2
1693
+ ) IS
1694
+ BEGIN
1695
+ v_path.EXTEND(1);
1696
+ v_path(v_path.COUNT) := p_name;
1697
+ END;
1698
+
1699
+ PROCEDURE pop_name IS
1700
+ BEGIN
1701
+ v_path.TRIM(1);
1702
+ END;
1703
+
1704
+ PROCEDURE visit_value (
1705
+ p_left IN t_json,
1706
+ p_right IN t_json
1707
+ ) IS
1708
+
1709
+ v_left_type CHAR;
1710
+ v_left_value VARCHAR2(4000);
1711
+
1712
+ v_right_type CHAR;
1713
+ v_right_value VARCHAR2(4000);
1714
+
1715
+ v_parent_id NUMBER;
1716
+
1717
+ v_left_keys t_varchars;
1718
+ v_right_keys t_varchars;
1719
+
1720
+ v_left_i PLS_INTEGER;
1721
+ v_right_i PLS_INTEGER;
1722
+
1723
+ v_left_key VARCHAR2(4000);
1724
+ v_right_key VARCHAR2(4000);
1725
+
1726
+ v_compare PLS_INTEGER;
1727
+
1728
+ PROCEDURE missing_left IS
1729
+ BEGIN
1730
+
1731
+ push_name(v_right_key);
1732
+ add_mismatch('ML');
1733
+ pop_name;
1734
+
1735
+ v_right_i := v_right_i + 1;
1736
+
1737
+ END;
1738
+
1739
+ PROCEDURE missing_right IS
1740
+ BEGIN
1741
+
1742
+ push_name(v_left_key);
1743
+ add_mismatch('MR');
1744
+ pop_name;
1745
+
1746
+ v_left_i := v_left_i + 1;
1747
+
1748
+ END;
1749
+
1750
+ PROCEDURE compare_keys IS
1751
+ BEGIN
1752
+
1753
+ IF v_left_key = v_right_key THEN
1754
+ v_compare := 0;
1755
+ ELSIF v_left_type = 'A' THEN
1756
+ IF LPAD(v_left_key, 12, '0') > LPAD(v_right_key, 12, '0') THEN
1757
+ v_compare := 1;
1758
+ ELSE
1759
+ v_compare := -1;
1760
+ END IF;
1761
+ ELSE
1762
+ IF v_left_key > v_right_key THEN
1763
+ v_compare := 1;
1764
+ ELSE
1765
+ v_compare := -1;
1766
+ END IF;
1767
+ END IF;
1768
+
1769
+ END;
1770
+
1771
+ BEGIN
1772
+
1773
+ p_left.dump(v_parent_id, v_left_type, v_left_value);
1774
+ p_right.dump(v_parent_id, v_right_type, v_right_value);
1775
+
1776
+ IF v_left_type != v_right_type THEN
1777
+
1778
+ add_mismatch('TM');
1779
+
1780
+ ELSIF v_left_type IN ('S', 'N', 'B') THEN
1781
+
1782
+ IF v_left_value != v_right_value THEN
1783
+ add_mismatch('VM');
1784
+ END IF;
1785
+
1786
+ ELSIF v_left_type != 'E' THEN
1787
+
1788
+ v_left_keys := p_left.get_keys;
1789
+ v_right_keys := p_right.get_keys;
1790
+
1791
+ v_left_i := 1;
1792
+ v_right_i := 1;
1793
+
1794
+ WHILE v_left_i <= v_left_keys.COUNT
1795
+ OR v_right_i <= v_right_keys.COUNT
1796
+ LOOP
1797
+
1798
+ IF v_left_i > v_left_keys.COUNT THEN
1799
+
1800
+ v_right_key := v_right_keys(v_right_i);
1801
+ missing_left;
1802
+
1803
+ ELSIF v_right_i > v_right_keys.COUNT THEN
1804
+
1805
+ v_left_key := v_left_keys(v_left_i);
1806
+ missing_right;
1807
+
1808
+ ELSE
1809
+
1810
+ v_left_key := v_left_keys(v_left_i);
1811
+ v_right_key := v_right_keys(v_right_i);
1812
+ compare_keys;
1813
+
1814
+ IF v_compare = -1 THEN
1815
+
1816
+ missing_right;
1817
+
1818
+ ELSIF v_compare = 1 THEN
1819
+
1820
+ missing_left;
1821
+
1822
+ ELSE
1823
+
1824
+ push_name(v_left_key);
1825
+
1826
+ visit_value(
1827
+ p_left.get(':name', bind(v_left_key)),
1828
+ p_right.get(':name', bind(v_right_key))
1829
+ );
1830
+
1831
+ pop_name;
1832
+
1833
+ v_left_i := v_left_i + 1;
1834
+ v_right_i := v_right_i + 1;
1835
+
1836
+ END IF;
1837
+
1838
+ END IF;
1839
+
1840
+ END LOOP;
1841
+
1842
+ END IF;
1843
+
1844
+ END;
1845
+
1846
+ BEGIN
1847
+
1848
+ IF p_value IS NULL THEN
1849
+ -- Right value not specified!
1850
+ error$.raise('JDC-00051');
1851
+ END IF;
1852
+
1853
+ v_path := t_varchars();
1854
+ v_mismatches := t_json_mismatches();
1855
+
1856
+ visit_value(self, p_value);
1857
+
1858
+ RETURN v_mismatches;
1859
+
1860
+ END;
1861
+
1673
1862
END;
0 commit comments