Advertisement
niks32

Untitled

Apr 4th, 2023
1,159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 2.54 KB | None | 0 0
  1.  
  2. DECLARE
  3.     OBJTYPE_FSFM_EXCHANGE_ERRORS CONSTANT INTEGER := 4500; -- Коды ошибок обмена с ФСФМ
  4.    
  5. FUNCTION IsExist(token IN VARCHAR2)
  6. RETURN NUMBER
  7. IS
  8.     v_existFlag NUMBER := 0;
  9.    -- NO_DATA_FOUND EXCEPTION;
  10. BEGIN
  11.     SELECT T_ELEMENT INTO v_existFlag FROM dllvalues_dbt WHERE t_List = OBJTYPE_FSFM_EXCHANGE_ERRORS AND t_Code = token;
  12.     EXCEPTION
  13.         WHEN NO_DATA_FOUND THEN RETURN 0;
  14.     RETURN v_existFlag;
  15. END;
  16.    
  17.  
  18. FUNCTION BildErrorCodeStr(str IN VARCHAR2)
  19. RETURN VARCHAR2
  20. IS
  21.     v_ErrorCodeStr VARCHAR2 (4000) := '';
  22.     v_currPos NUMBER := 0;
  23.     v_ErrorCodeTMP VARCHAR2 (10) := '';
  24. BEGIN
  25.     LOOP
  26.       EXIT WHEN v_currPos > LENGTH(str);
  27.       IF (SUBSTR(str, v_currPos, 1) = 'X') THEN
  28.         SELECT t_Code INTO v_ErrorCodeTMP FROM dllvalues_dbt WHERE t_List = OBJTYPE_FSFM_EXCHANGE_ERRORS AND T_ELEMENT = v_currPos;
  29.                          
  30.         v_ErrorCodeStr := ';' || v_ErrorCodeStr || v_ErrorCodeTMP;
  31.       END IF;
  32.      
  33.       v_currPos := v_currPos + 1;
  34.    END LOOP;
  35.    
  36.    -- Удаляем первый символ (;) и возвращаем новую строку
  37.    v_ErrorCodeStr := SUBSTR(v_ErrorCodeStr, 2);
  38.    
  39.    RETURN v_ErrorCodeStr;
  40. END;
  41.    
  42. FUNCTION RemoveDuplicates(str IN VARCHAR2)
  43. RETURN VARCHAR2
  44. IS
  45.   v_str VARCHAR2(4000) := str;
  46.   v_new_str VARCHAR2(4000) := '';
  47.   v_ErrCodeFlag VARCHAR2(10):= 'OOOOOOOOOO';
  48.   v_existFlag NUMBER := 0;
  49. BEGIN
  50.   WHILE LENGTH(v_str) > 0 LOOP
  51.     IF INSTR(v_str, ';') > 0 THEN
  52.       -- Получаем очередной токен и обрезаем строку
  53.       DECLARE
  54.         v_token VARCHAR2(100) := SUBSTR(v_str, 1, INSTR(v_str, ';')-1);      
  55.       BEGIN
  56.         v_existFlag := IsExist(v_token);
  57.         IF (v_existFlag != 0) THEN
  58.             v_ErrCodeFlag := SUBSTR(v_existFlag, 1, v_existFlag - 1) || 'X' || SUBSTR(v_existFlag, v_existFlag + 1);
  59.         END IF;
  60.       END;
  61.     ELSE
  62.       -- Остался последний токен в строке
  63.       DECLARE
  64.         v_token VARCHAR2(100) := v_str;
  65.       BEGIN
  66.         -- Проверяем, есть ли этот токен в новой строке
  67.         v_existFlag := IsExist(v_token);
  68.         IF (v_existFlag != 0) THEN
  69.              v_ErrCodeFlag := SUBSTR(v_existFlag, 1, v_existFlag - 1) || 'X' || SUBSTR(v_existFlag, v_existFlag + 1);
  70.         END IF;
  71.       END;
  72.     END IF;
  73.   END LOOP;
  74.  
  75.   RETURN BildErrorCodeStr(v_ErrCodeFlag);
  76. END;
  77.  
  78.  
  79.  
  80. BEGIN
  81.     DBMS_OUTPUT.put_line(RemoveDuplicates('00001;22;22;111;111;55'));
  82. END;
  83. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement