Advertisement
niks32

Untitled

Apr 4th, 2023
1,146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 2.69 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. BEGIN
  10.  
  11.     SELECT T_ELEMENT INTO v_existFlag FROM dllvalues_dbt WHERE t_List = OBJTYPE_FSFM_EXCHANGE_ERRORS AND t_Code = token;
  12.     RETURN v_existFlag;
  13.    
  14.     EXCEPTION WHEN NO_DATA_FOUND THEN RETURN 0;
  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.      
  28.       IF (SUBSTR(str, v_currPos, 1) = 'X') THEN
  29.         BEGIN
  30.             SELECT t_Code INTO v_ErrorCodeTMP FROM dllvalues_dbt WHERE t_List = OBJTYPE_FSFM_EXCHANGE_ERRORS AND T_ELEMENT = v_currPos;              
  31.             v_ErrorCodeStr := v_ErrorCodeStr || ';' || v_ErrorCodeTMP;
  32.             EXCEPTION WHEN OTHERS THEN NULL;
  33.         END;
  34.       END IF;
  35.      
  36.       v_currPos := v_currPos + 1;
  37.    END LOOP;
  38.      
  39.    -- Удаляем первый символ (;) и возвращаем новую строку
  40.    v_ErrorCodeStr := SUBSTR(v_ErrorCodeStr, 2);
  41.    
  42.    RETURN v_ErrorCodeStr;
  43. END;
  44.  
  45.  
  46.    
  47. FUNCTION RemoveDuplicates(str IN VARCHAR2)
  48. RETURN VARCHAR2
  49. IS
  50.   v_str VARCHAR2(4000) := str;
  51.   v_new_str VARCHAR2(4000) := '';
  52.   v_ErrCodeFlag VARCHAR2(10):= 'OOOOOOOOOO';
  53.   v_existFlag NUMBER := 0;
  54. BEGIN
  55.   WHILE LENGTH(v_str) > 0 LOOP
  56.     IF INSTR(v_str, ';') > 0 THEN
  57.       -- Получаем очередной токен и обрезаем строку
  58.       DECLARE
  59.         v_token VARCHAR2(100) := SUBSTR(v_str, 1, INSTR(v_str, ';')-1);      
  60.       BEGIN
  61.         v_str := SUBSTR(v_str, INSTR(v_str, ';')+1);
  62.         v_existFlag := IsExist(v_token);
  63.        
  64.         IF (v_existFlag != 0) THEN
  65.             v_ErrCodeFlag := SUBSTR(v_ErrCodeFlag, 1, v_existFlag - 1) || 'X' || SUBSTR(v_ErrCodeFlag, v_existFlag + 1);
  66.         END IF;
  67.       END;
  68.     ELSE
  69.       -- Остался последний токен в строке
  70.       DECLARE
  71.         v_token VARCHAR2(100) := v_str;
  72.       BEGIN
  73.         -- Проверяем, есть ли этот токен в новой строке
  74.         v_existFlag := IsExist(v_token);
  75.         IF (v_existFlag != 0) THEN
  76.              v_ErrCodeFlag := SUBSTR(v_ErrCodeFlag, 1, v_existFlag - 1) || 'X' || SUBSTR(v_ErrCodeFlag, v_existFlag + 1);
  77.         END IF;
  78.         v_str := '';
  79.       END;
  80.     END IF;
  81.   END LOOP;
  82.  
  83.   RETURN BildErrorCodeStr(v_ErrCodeFlag);
  84. END;
  85.  
  86.  
  87.  
  88. BEGIN
  89.     DBMS_OUTPUT.put_line(RemoveDuplicates('00001;00004;00003;00003;111;55'));
  90. END;
  91. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement