Advertisement
kivilevd

MoveZeroes task solution

Jun 29th, 2023
1,952
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 1.80 KB | None | 0 0
  1. --- MoveZeroes task solution. Kivilev DS. Oracle Developer
  2. DECLARE
  3.   TYPE t_nums IS TABLE OF NUMBER(38);
  4.   v_actual_nums   t_nums := t_nums(0, 12, 1, 3, 0);
  5.   v_expected_nums t_nums := t_nums(12, 1, 3, 0, 0);
  6.  
  7.   PROCEDURE move_element_to_end(p_nums                  IN OUT NOCOPY t_nums
  8.                                ,p_move_element_position PLS_INTEGER
  9.                                ,p_size_limit            PLS_INTEGER) IS
  10.     v_tmp NUMBER(38);
  11.   BEGIN
  12.     FOR i IN p_move_element_position .. p_size_limit - 1 LOOP
  13.       v_tmp := p_nums(i + 1);
  14.       p_nums(i + 1) := p_nums(i);
  15.       p_nums(i) := v_tmp;
  16.     END LOOP;
  17.   END;
  18.  
  19.   FUNCTION move_zeroes(p_nums t_nums) RETURN t_nums IS
  20.     v_current_position NUMBER := 1;
  21.     v_final_position   NUMBER := p_nums.COUNT;
  22.     v_nums             t_nums := p_nums;
  23.   BEGIN
  24.     LOOP
  25.       EXIT WHEN v_current_position > v_final_position;
  26.    
  27.       IF (v_nums(v_current_position) = 0) THEN
  28.         move_element_to_end(v_nums, v_current_position, v_final_position);
  29.         v_final_position := v_final_position - 1;
  30.       ELSE
  31.         v_current_position := v_current_position + 1;
  32.       END IF;
  33.    
  34.     END LOOP;
  35.  
  36.     RETURN v_nums;
  37.   END;
  38.  
  39.   PROCEDURE test(p_expected_nums t_nums
  40.                 ,p_actual_nums   t_nums) IS
  41.   BEGIN
  42.     IF (p_expected_nums IS NULL OR p_actual_nums IS NULL OR p_expected_nums.COUNT != p_actual_nums.COUNT) THEN
  43.       raise_application_error(-20100, 'Arrays are not equals');
  44.     END IF;
  45.     FOR i IN p_expected_nums.FIRST .. p_expected_nums.LAST LOOP
  46.       IF (p_expected_nums(i) != p_actual_nums(i)) THEN
  47.         raise_application_error(-20100, 'Arrays are not equals');
  48.       END IF;
  49.     END LOOP;
  50.   END;
  51.  
  52. BEGIN
  53.   v_actual_nums := move_zeroes(v_actual_nums);
  54.   test(v_expected_nums, v_actual_nums);
  55. END;
  56. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement