4种进制共12个转换函数,虽然有的转换直接使用to_char()和to_number()就可以实现,但我还是把它们整理到一起,使用和查找都方便。

部分函数需要先创建type_str_agg类型和f_stragg函数才能使用,这两个对象的代码也附在之后。

 

 
  
  1. CREATE OR REPLACE PACKAGE pkg_number_trans IS 
  2.  
  3.   FUNCTION f_bin_to_oct(p_str IN VARCHAR2) RETURN VARCHAR2;  
  4.     
  5.   FUNCTION f_bin_to_dec(p_str IN VARCHAR2) RETURN VARCHAR2;  
  6.     
  7.   FUNCTION f_bin_to_hex(p_str IN VARCHAR2) RETURN VARCHAR2;  
  8.  
  9.   FUNCTION f_oct_to_bin(p_str IN VARCHAR2) RETURN VARCHAR2;  
  10.     
  11.   FUNCTION f_oct_to_dec(p_str IN VARCHAR2) RETURN VARCHAR2;  
  12.  
  13.   FUNCTION f_oct_to_hex(p_str IN VARCHAR2) RETURN VARCHAR2;  
  14.     
  15.   FUNCTION f_hex_to_bin(p_str IN VARCHAR2) RETURN VARCHAR2;  
  16.  
  17.   FUNCTION f_hex_to_oct(p_str IN VARCHAR2) RETURN VARCHAR2;  
  18.  
  19.   FUNCTION f_hex_to_dec(p_str IN VARCHAR2) RETURN VARCHAR2;  
  20.     
  21.   FUNCTION f_dec_to_bin(p_int IN VARCHAR2) RETURN VARCHAR2;  
  22.  
  23.   FUNCTION f_dec_to_oct(p_int IN VARCHAR2) RETURN VARCHAR2;  
  24.  
  25.   FUNCTION f_dec_to_hex(p_int IN VARCHAR2) RETURN VARCHAR2;  
  26.     
  27. END pkg_number_trans;  
  28. /  
  29. CREATE OR REPLACE PACKAGE BODY pkg_number_trans IS 
  30.  
  31.  
  32.   FUNCTION f_bin_to_oct(p_str IN VARCHAR2) RETURN VARCHAR2 IS 
  33.     ----------------------------------------------------------------------------------------------------------------------  
  34.     -- 对象名称: f_bin_to_oct  
  35.     -- 对象描述: 二进制转换八进制  
  36.     -- 输入参数: p_str 二进制字符串  
  37.     -- 返回结果: 八进制字符串  
  38.     -- 测试用例: SELECT pkg_number_trans.f_bin_to_oct('11110001010') FROM dual;  
  39.     -- 备    注: 需要定义f_stragg函数和type_str_agg类型  
  40.     ----------------------------------------------------------------------------------------------------------------------  
  41.     v_return VARCHAR2(4000);  
  42.     v_bin    VARCHAR2(4000);  
  43.   BEGIN 
  44.     v_bin := substr('00' || p_str, -3 * ceil(length(p_str) / 3));  
  45.     SELECT f_stragg(data1) INTO v_return  
  46.       FROM (SELECT (CASE upper(substr(v_bin, (rownum - 1) * 3 + 1, 3))  
  47.                      WHEN '000' THEN '0' 
  48.                      WHEN '001' THEN '1' 
  49.                      WHEN '010' THEN '2' 
  50.                      WHEN '011' THEN '3' 
  51.                      WHEN '100' THEN '4' 
  52.                      WHEN '101' THEN '5' 
  53.                      WHEN '110' THEN '6' 
  54.                      WHEN '111' THEN '7' 
  55.                    END) data1  
  56.               FROM dual  
  57.             CONNECT BY rownum <= length(v_bin) / 3);  
  58.     RETURN v_return;  
  59.   EXCEPTION  
  60.     WHEN OTHERS THEN 
  61.       RETURN NULL;  
  62.   END f_bin_to_oct;  
  63.  
  64.   FUNCTION f_bin_to_dec(p_str IN VARCHAR2) RETURN VARCHAR2 IS 
  65.     ----------------------------------------------------------------------------------------------------------------------  
  66.     -- 对象名称: f_bin_to_dec  
  67.     -- 对象描述: 二进制转换十进制  
  68.     -- 输入参数: p_str 二进制字符串  
  69.     -- 返回结果: 十进制字符串  
  70.     -- 测试用例: SELECT pkg_number_trans.f_bin_to_dec('11110001010') FROM dual;  
  71.     ----------------------------------------------------------------------------------------------------------------------  
  72.     v_return  VARCHAR2(4000);  
  73.   BEGIN 
  74.     SELECT SUM(data1) INTO v_return  
  75.       FROM (SELECT substr(p_str, rownum, 1) * power(2, length(p_str) - rownum) data1  
  76.               FROM dual  
  77.             CONNECT BY rownum <= length(p_str));  
  78.     RETURN v_return;  
  79.   EXCEPTION  
  80.     WHEN OTHERS THEN 
  81.       RETURN NULL;  
  82.   END f_bin_to_dec;  
  83.  
  84.   FUNCTION f_bin_to_hex(p_str IN VARCHAR2) RETURN VARCHAR2 IS 
  85.     ----------------------------------------------------------------------------------------------------------------------  
  86.     -- 对象名称: f_bin_to_hex  
  87.     -- 对象描述: 二进制转换十六进制  
  88.     -- 输入参数: p_str 二进制字符串  
  89.     -- 返回结果: 十六进制字符串  
  90.     -- 测试用例: SELECT pkg_number_trans.f_bin_to_oct('11110001010') FROM dual;  
  91.     -- 备    注: 需要定义f_stragg函数和type_str_agg类型  
  92.     ----------------------------------------------------------------------------------------------------------------------  
  93.     v_return VARCHAR2(4000);  
  94.     v_bin    VARCHAR2(4000);  
  95.   BEGIN 
  96.     v_bin := substr('000' || p_str, -4 * ceil(length(p_str) / 4));  
  97.     SELECT f_stragg(data1) INTO v_return  
  98.       FROM (SELECT (CASE upper(substr(v_bin, (rownum - 1) * 4 + 1, 4))  
  99.                      WHEN '0000' THEN '0' 
  100.                      WHEN '0001' THEN '1' 
  101.                      WHEN '0010' THEN '2' 
  102.                      WHEN '0011' THEN '3' 
  103.                      WHEN '0100' THEN '4' 
  104.                      WHEN '0101' THEN '5' 
  105.                      WHEN '0110' THEN '6' 
  106.                      WHEN '0111' THEN '7' 
  107.                      WHEN '1000' THEN '8' 
  108.                      WHEN '1001' THEN '9' 
  109.                      WHEN '1010' THEN 'A' 
  110.                      WHEN '1011' THEN 'B' 
  111.                      WHEN '1100' THEN 'C' 
  112.                      WHEN '1101' THEN 'D' 
  113.                      WHEN '1110' THEN 'E' 
  114.                      WHEN '1111' THEN 'F' 
  115.                    END) data1  
  116.               FROM dual  
  117.             CONNECT BY rownum <= length(v_bin) / 4);  
  118.     RETURN v_return;  
  119.   EXCEPTION  
  120.     WHEN OTHERS THEN 
  121.       RETURN NULL;  
  122.   END f_bin_to_hex;  
  123.  
  124.   FUNCTION f_oct_to_bin(p_str IN VARCHAR2) RETURN VARCHAR2 IS 
  125.     ----------------------------------------------------------------------------------------------------------------------  
  126.     -- 对象名称: f_oct_to_bin  
  127.     -- 对象描述: 八进制转换二进制  
  128.     -- 输入参数: p_str 八进制字符串  
  129.     -- 返回结果: 二进制字符串  
  130.     -- 测试用例: SELECT pkg_number_trans.f_oct_to_bin('3612') FROM dual;  
  131.     -- 备    注: 需要定义f_stragg函数和type_str_agg类型  
  132.     ----------------------------------------------------------------------------------------------------------------------  
  133.     v_return VARCHAR2(4000);  
  134.   BEGIN 
  135.     SELECT to_char(to_number(f_stragg(data1))) INTO v_return  
  136.       FROM (SELECT (CASE upper(substr(p_str, rownum, 1))  
  137.                      WHEN '0' THEN '000' 
  138.                      WHEN '1' THEN '001' 
  139.                      WHEN '2' THEN '010' 
  140.                      WHEN '3' THEN '011' 
  141.                      WHEN '4' THEN '100' 
  142.                      WHEN '5' THEN '101' 
  143.                      WHEN '6' THEN '110' 
  144.                      WHEN '7' THEN '111' 
  145.                    END) data1  
  146.               FROM dual  
  147.             CONNECT BY rownum <= length(p_str));  
  148.     RETURN v_return;  
  149.   EXCEPTION  
  150.     WHEN OTHERS THEN 
  151.       RETURN NULL;  
  152.   END f_oct_to_bin;  
  153.  
  154.   FUNCTION f_oct_to_dec(p_str IN VARCHAR2) RETURN VARCHAR2 IS 
  155.     ----------------------------------------------------------------------------------------------------------------------  
  156.     -- 对象名称: f_oct_to_dec  
  157.     -- 对象描述: 八进制转换十进制  
  158.     -- 输入参数: p_str 八进制字符串  
  159.     -- 返回结果: 十进制字符串  
  160.     -- 测试用例: SELECT pkg_number_trans.f_oct_to_dec('3612') FROM dual;  
  161.     ----------------------------------------------------------------------------------------------------------------------  
  162.     v_return  VARCHAR2(4000);  
  163.   BEGIN 
  164.     SELECT SUM(data1) INTO v_return  
  165.       FROM (SELECT substr(p_str, rownum, 1) * power(8, length(p_str) - rownum) data1  
  166.               FROM dual  
  167.             CONNECT BY rownum <= length(p_str));  
  168.     RETURN v_return;  
  169.   EXCEPTION  
  170.     WHEN OTHERS THEN 
  171.       RETURN NULL;  
  172.   END f_oct_to_dec;  
  173.     
  174.   FUNCTION f_oct_to_hex(p_str IN VARCHAR2) RETURN VARCHAR2 IS 
  175.     ----------------------------------------------------------------------------------------------------------------------  
  176.     -- 对象名称: f_oct_to_bin  
  177.     -- 对象描述: 八进制转换十六进制  
  178.     -- 输入参数: p_str 八进制字符串  
  179.     -- 返回结果: 十六进制字符串  
  180.     -- 测试用例: SELECT pkg_number_trans.f_oct_to_hex('3612') FROM dual;  
  181.     ----------------------------------------------------------------------------------------------------------------------  
  182.     v_return VARCHAR2(4000);  
  183.     v_bin    VARCHAR2(4000);  
  184.   BEGIN 
  185.     SELECT pkg_number_trans.f_oct_to_bin(p_str) INTO v_bin FROM dual;  
  186.     SELECT pkg_number_trans.f_bin_to_hex(v_bin) INTO v_return FROM dual;  
  187.     RETURN v_return;  
  188.   EXCEPTION  
  189.     WHEN OTHERS THEN 
  190.       RETURN NULL;  
  191.   END f_oct_to_hex;  
  192.  
  193.   FUNCTION f_dec_to_bin(p_int IN VARCHAR2) RETURN VARCHAR2 IS 
  194.     ----------------------------------------------------------------------------------------------------------------------  
  195.     -- 对象名称: f_dec_to_bin  
  196.     -- 对象描述: 十进制转换二进制  
  197.     -- 输入参数: p_str 十进制字符串  
  198.     -- 返回结果: 二进制字符串  
  199.     -- 测试用例: SELECT pkg_number_trans.f_dec_to_bin('1930') FROM dual;  
  200.     ----------------------------------------------------------------------------------------------------------------------  
  201.     v_return VARCHAR2(4000);  
  202.     v_hex    VARCHAR2(4000);  
  203.   BEGIN 
  204.     SELECT pkg_number_trans.f_dec_to_hex(p_int) INTO v_hex FROM dual;  
  205.     SELECT pkg_number_trans.f_hex_to_bin(v_hex) INTO v_return FROM dual;  
  206.     RETURN v_return;  
  207.   EXCEPTION  
  208.     WHEN OTHERS THEN 
  209.       RETURN NULL;  
  210.   END f_dec_to_bin;  
  211.     
  212.   FUNCTION f_dec_to_oct(p_int IN VARCHAR2) RETURN VARCHAR2 IS 
  213.     ----------------------------------------------------------------------------------------------------------------------  
  214.     -- 对象名称: f_dec_to_oct  
  215.     -- 对象描述: 十进制转换八进制  
  216.     -- 输入参数: p_str 十进制字符串  
  217.     -- 返回结果: 八进制字符串  
  218.     -- 测试用例: SELECT pkg_number_trans.f_dec_to_oct('1930') FROM dual;  
  219.     ----------------------------------------------------------------------------------------------------------------------  
  220.     v_return VARCHAR2(4000);  
  221.     v_bin    VARCHAR2(4000);  
  222.   BEGIN 
  223.     SELECT pkg_number_trans.f_dec_to_bin(p_int) INTO v_bin FROM dual;  
  224.     v_bin := substr('00' || v_bin, -3 * ceil(length(v_bin) / 3));  
  225.     SELECT f_stragg(data1) INTO v_return  
  226.       FROM (SELECT (CASE upper(substr(v_bin, (rownum - 1) * 3 + 1, 3))  
  227.                      WHEN '000' THEN '0' 
  228.                      WHEN '001' THEN '1' 
  229.                      WHEN '010' THEN '2' 
  230.                      WHEN '011' THEN '3' 
  231.                      WHEN '100' THEN '4' 
  232.                      WHEN '101' THEN '5' 
  233.                      WHEN '110' THEN '6' 
  234.                      WHEN '111' THEN '7' 
  235.                    END) data1  
  236.               FROM dual  
  237.             CONNECT BY rownum <= length(v_bin) / 3);  
  238.     RETURN v_return;  
  239.   EXCEPTION  
  240.     WHEN OTHERS THEN 
  241.       RETURN NULL;  
  242.   END f_dec_to_oct;  
  243.     
  244.   FUNCTION f_dec_to_hex(p_int IN VARCHAR2) RETURN VARCHAR2 IS 
  245.     ----------------------------------------------------------------------------------------------------------------------  
  246.     -- 对象名称: f_dec_to_oct  
  247.     -- 对象描述: 十进制转换十六进制  
  248.     -- 输入参数: p_str 十进制字符串  
  249.     -- 返回结果: 十六进制字符串  
  250.     -- 测试用例: SELECT pkg_number_trans.f_dec_to_hex('1930') FROM dual;  
  251.     ----------------------------------------------------------------------------------------------------------------------  
  252.     v_return VARCHAR2(4000);  
  253.   BEGIN 
  254.     SELECT upper(TRIM(to_char(p_int, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'))) INTO v_return FROM dual;  
  255.     RETURN v_return;  
  256.   EXCEPTION  
  257.     WHEN OTHERS THEN 
  258.       RETURN NULL;  
  259.   END f_dec_to_hex;  
  260.     
  261.   FUNCTION f_hex_to_bin(p_str IN VARCHAR2) RETURN VARCHAR2 IS 
  262.     ----------------------------------------------------------------------------------------------------------------------  
  263.     -- 对象名称: f_dec_to_oct  
  264.     -- 对象描述: 十六进制转换二进制  
  265.     -- 输入参数: p_str 十六进制字符串  
  266.     -- 返回结果: 二进制字符串  
  267.     -- 测试用例: SELECT pkg_number_trans.f_hex_to_oct('78A') FROM dual;  
  268.     ----------------------------------------------------------------------------------------------------------------------  
  269.     v_return VARCHAR2(4000);  
  270.   BEGIN 
  271.     SELECT to_char(to_number(f_stragg(data1))) INTO v_return  
  272.       FROM (SELECT (CASE upper(substr(p_str, rownum, 1))  
  273.                      WHEN '0' THEN '0000' 
  274.                      WHEN '1' THEN '0001' 
  275.                      WHEN '2' THEN '0010' 
  276.                      WHEN '3' THEN '0011' 
  277.                      WHEN '4' THEN '0100' 
  278.                      WHEN '5' THEN '0101' 
  279.                      WHEN '6' THEN '0110' 
  280.                      WHEN '7' THEN '0111' 
  281.                      WHEN '8' THEN '1000' 
  282.                      WHEN '9' THEN '1001' 
  283.                      WHEN 'A' THEN '1010' 
  284.                      WHEN 'B' THEN '1011' 
  285.                      WHEN 'C' THEN '1100' 
  286.                      WHEN 'D' THEN '1101' 
  287.                      WHEN 'E' THEN '1110' 
  288.                      WHEN 'F' THEN '1111' 
  289.                    END) data1  
  290.               FROM dual  
  291.             CONNECT BY rownum <= length(p_str));  
  292.     RETURN v_return;  
  293.   EXCEPTION  
  294.     WHEN OTHERS THEN 
  295.       RETURN NULL;  
  296.   END f_hex_to_bin;  
  297.     
  298.   FUNCTION f_hex_to_oct(p_str IN VARCHAR2) RETURN VARCHAR2 IS 
  299.     ----------------------------------------------------------------------------------------------------------------------  
  300.     -- 对象名称: f_dec_to_oct  
  301.     -- 对象描述: 十六进制转换八进制  
  302.     -- 输入参数: p_str 十六进制字符串  
  303.     -- 返回结果: 八进制字符串  
  304.     -- 测试用例: SELECT pkg_number_trans.f_hex_to_oct('78A') FROM dual;  
  305.     ----------------------------------------------------------------------------------------------------------------------  
  306.     v_return VARCHAR2(4000);  
  307.     v_bin    VARCHAR2(4000);  
  308.   BEGIN 
  309.     SELECT pkg_number_trans.f_hex_to_bin(p_str) INTO v_bin FROM dual;  
  310.     SELECT pkg_number_trans.f_bin_to_oct(v_bin) INTO v_return FROM dual;  
  311.     RETURN v_return;  
  312.   EXCEPTION  
  313.     WHEN OTHERS THEN 
  314.       RETURN NULL;  
  315.   END f_hex_to_oct;  
  316.     
  317.   FUNCTION f_hex_to_dec(p_str IN VARCHAR2) RETURN VARCHAR2 IS 
  318.     ----------------------------------------------------------------------------------------------------------------------  
  319.     -- 对象名称: f_hex_to_dec  
  320.     -- 对象描述: 十六进制转换十进制  
  321.     -- 输入参数: p_str 十六进制字符串  
  322.     -- 返回结果: 十进制字符串  
  323.     -- 测试用例: SELECT pkg_number_trans.f_hex_to_dec('78A') FROM dual;  
  324.     ----------------------------------------------------------------------------------------------------------------------  
  325.     v_return  VARCHAR2(4000);  
  326.   BEGIN 
  327.     SELECT SUM(data1) INTO v_return  
  328.       FROM (SELECT (CASE upper(substr(p_str, rownum, 1))  
  329.                      WHEN 'A' THEN '10' 
  330.                      WHEN 'B' THEN '11' 
  331.                      WHEN 'C' THEN '12' 
  332.                      WHEN 'D' THEN '13' 
  333.                      WHEN 'E' THEN '14' 
  334.                      WHEN 'F' THEN '15' 
  335.                      ELSE substr(p_str, rownum, 1)  
  336.                    END) * power(16, length(p_str) - rownum) data1  
  337.               FROM dual  
  338.             CONNECT BY rownum <= length(p_str));  
  339.     RETURN v_return;  
  340.   EXCEPTION  
  341.     WHEN OTHERS THEN 
  342.       RETURN NULL;  
  343.   END f_hex_to_dec;  
  344.     
  345. END pkg_number_trans;  
  346. /  
  347.  
  348.  
  349. CREATE OR REPLACE TYPE type_str_agg AS OBJECT  
  350. (  
  351.   total VARCHAR2(4000),  
  352.  
  353.   STATIC FUNCTION odciaggregateinitialize(sctx IN OUT type_str_agg)  
  354.     RETURN NUMBER,  
  355.  
  356.   MEMBER FUNCTION odciaggregateiterate  
  357.   (  
  358.     SELF  IN OUT type_str_agg,  
  359.     VALUE IN VARCHAR2  
  360.   ) RETURN NUMBER,  
  361.  
  362.   MEMBER FUNCTION odciaggregateterminate  
  363.   (  
  364.     SELF        IN type_str_agg,  
  365.     returnvalue OUT VARCHAR2,  
  366.     flags       IN NUMBER  
  367.   ) RETURN NUMBER,  
  368.  
  369.   MEMBER FUNCTION odciaggregatemerge  
  370.   (  
  371.     SELF IN OUT type_str_agg,  
  372.     ctx2 IN type_str_agg  
  373.   ) RETURN NUMBER  
  374. )  
  375. /  
  376. CREATE OR REPLACE TYPE BODY type_str_agg IS 
  377.  
  378.   STATIC FUNCTION odciaggregateinitialize(sctx IN OUT type_str_agg)  
  379.     RETURN NUMBER IS 
  380.   BEGIN 
  381.     sctx := type_str_agg(NULL);  
  382.     RETURN odciconst.success;  
  383.   END;  
  384.  
  385.   MEMBER FUNCTION odciaggregateiterate  
  386.   (  
  387.     SELF  IN OUT type_str_agg,  
  388.     VALUE IN VARCHAR2  
  389.   ) RETURN NUMBER IS 
  390.   BEGIN 
  391.     SELF.total := SELF.total || VALUE;  
  392.     RETURN odciconst.success;  
  393.   END;  
  394.  
  395.   MEMBER FUNCTION odciaggregateterminate  
  396.   (  
  397.     SELF        IN type_str_agg,  
  398.     returnvalue OUT VARCHAR2,  
  399.     flags       IN NUMBER  
  400.   ) RETURN NUMBER IS 
  401.   BEGIN 
  402.     returnvalue := SELF.total;  
  403.     RETURN odciconst.success;  
  404.   END;  
  405.  
  406.   MEMBER FUNCTION odciaggregatemerge  
  407.   (  
  408.     SELF IN OUT type_str_agg,  
  409.     ctx2 IN type_str_agg  
  410.   ) RETURN NUMBER IS 
  411.   BEGIN 
  412.     SELF.total := SELF.total || ctx2.total;  
  413.     RETURN odciconst.success;  
  414.   END;  
  415.  
  416. END;  
  417. /  
  418.  
  419.  
  420. CREATE OR REPLACE FUNCTION f_stragg(p_input VARCHAR2) RETURN VARCHAR2  
  421.   PARALLEL_ENABLE  
  422.   AGGREGATE USING type_str_agg;  
  423. /