Guest User

Untitled

a guest
Apr 20th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 1.49 KB | None | 0 0
  1. -- convert from hex to dec only using datatypes number and varchar2
  2. CREATE OR REPLACE PROCEDURE convert_to_dec(p_input IN VARCHAR2)
  3. IS
  4.   l_str VARCHAR2(12);
  5.   l_val NUMBER;
  6.   l_bin VARCHAR2(4000) := ' ';
  7.   e_invalid_input EXCEPTION;
  8. BEGIN
  9.   l_str := LOWER(p_input);
  10.   FOR i IN 1..LENGTH(l_str)
  11.   LOOP
  12.     l_val := ASCII(SUBSTR(l_str,i,1))-87;
  13.    
  14.     IF l_val BETWEEN 10 AND 15 THEN
  15.      
  16.         IF l_val - 8 >= 0 THEN
  17.            l_val := l_val - 8;
  18.            l_bin := l_bin||'1';
  19.         ELSE
  20.            l_bin := l_bin||'0';
  21.         END IF;
  22.    
  23.         IF l_val - 4 >= 0 THEN
  24.            l_val := l_val - 4;
  25.            l_bin := l_bin||'1';
  26.         ELSE
  27.            l_bin := l_bin||'0';
  28.         END IF;
  29.    
  30.         IF l_val - 2 >= 0 THEN
  31.            l_val := l_val - 2;
  32.            l_bin := l_bin||'1';
  33.         ELSE
  34.            l_bin := l_bin||'0';
  35.         END IF;  
  36.      
  37.         IF l_val - 1 >= 0 THEN
  38.            l_val := l_val - 1;
  39.            l_bin := l_bin||'1';
  40.         ELSE
  41.            l_bin := l_bin||'0';
  42.         END IF;          
  43.  
  44.     ELSE
  45.       RAISE e_invalid_input;
  46.     END IF;
  47.   END LOOP;
  48.  
  49.   l_bin := LTRIM(l_bin);
  50.  
  51.   l_val := 0;
  52.  
  53.   FOR i IN 1..LENGTH(l_bin)-1
  54.   LOOP
  55.     IF SUBSTR(l_bin,LENGTH(l_bin)-i,1) = '1' THEN
  56.       l_val := l_val + POWER(2,i);  
  57.     END IF;
  58.   END LOOP;
  59.  
  60.   DBMS_OUTPUT.put_line(l_val);
  61. EXCEPTION
  62.   WHEN e_invalid_input THEN
  63.     DBMS_OUTPUT.put_line('"'||l_str||'" contains characters that are not a,b,c,d,e,f');
  64. END;
Add Comment
Please, Sign In to add comment