ORACLE 用32進制表示月中的一天

        WHEN 'YMD' THEN
             v_year := to_char(SYSDATE, 'Y');
             v_month := FN_CONVERT_DECIMAL_TO_BASE(to_number(to_char(SYSDATE, 'MM')),32,1);
             v_day := FN_CONVERT_DECIMAL_TO_BASE(to_number(to_char(SYSDATE, 'DD')),32,1);
             v_str := v_year || v_month || v_day;

        WHEN 'YMDD' THEN 
              v_year := to_char(SYSDATE, 'Y');
              v_month := FN_CONVERT_DECIMAL_TO_BASE(to_number(to_char(SYSDATE, 'MM')),16,1);
              v_day :=to_char(SYSDATE, 'DD');

FUNCTION FN_CONVERT_DECIMAL_TO_BASE (P_DECIMAL_NUM IN INTEGER, P_DIGITAL_TYPE IN VARCHAR2, P_LEN IN INTEGER) RETURN VARCHAR2

IS    v_result_str        VARCHAR2 (20)   := '0';

   v_replace_str       VARCHAR2 (8000);  

  v_baseindex         INT             := 1;  

  v_quotient          INT             := p_decimal_num;

   v_digit             INT             := P_LEN - 1;

   v_digit_loop        INT             := 0;  

  v_basenumber        INT             := 0;  

  v_basebeginnumber   INT             := 10;  

  v_decodesql         VARCHAR2 (1000);  

  v_remainder         INT             := 0;

   v_baseloopnumber    INT             := 0;

   v_base_10            VARCHAR2(10) := '0123456789';  

v_base_16            VARCHAR2(16) := '0123456789ABCDEF';  

v_base_30            VARCHAR2(30) := '0123456789ABCDEFGHJKLMNPQRTWXY';  

v_base_32            VARCHAR2(32) := '0123456789ABCDEFGHJKLMNPRSTVWXYZ';

  v_base_33            VARCHAR2(33) := '0123456789ABCDEFGHJKLMNPQRSTVWXYZ';

  v_base_34            VARCHAR2(34) := '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ';  

v_base_36            VARCHAR2(36) := '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

  v_base_code          varchar2(62) := '';

BEGIN  

CASE

P_DIGITAL_TYPE     WHEN '10' THEN      

    v_basenumber :=  LENGTH(v_base_10);   

       v_base_code  := v_base_10;   

  WHEN '16' THEN        

  v_basenumber :=  LENGTH(v_base_16);      

    v_base_code  := v_base_16;  

   WHEN '30' THEN        

  v_basenumber :=  LENGTH(v_base_30);   

       v_base_code  := v_base_30;   

  WHEN '32' THEN        

  v_basenumber :=  LENGTH(v_base_32);  

        v_base_code  := v_base_32;   

  WHEN '33' THEN         

v_basenumber :=  LENGTH(v_base_33);    

      v_base_code  := v_base_33;  

   WHEN '34' THEN        

  v_basenumber :=  LENGTH(v_base_34);     

     v_base_code  := v_base_34;    

WHEN '36' THEN        

  v_basenumber :=  LENGTH(v_base_36);  

         v_base_code  := v_base_36;   

END CASE;      

   v_baseloopnumber := v_basenumber - 10;   

v_digit_loop := v_digit;   

   IF v_basenumber = 10

THEN     

RETURN LPAD(P_DECIMAL_NUM,P_LEN,'0');   

   ELSE    

  v_result_str := LPAD(v_result_str,v_digit,'0');

   END IF;         

   LOOP      

v_decodesql :=             v_decodesql          || ''''          || v_basebeginnumber          || ''','''          || SUBSTR (v_base_code, v_basebeginnumber + 1, 1)          || ''',';   

    v_basebeginnumber := v_basebeginnumber + 1;    

   v_baseloopnumber := v_baseloopnumber - 1;  

     EXIT WHEN v_baseloopnumber = 0;    END LOOP;

   LOOP    

   v_remainder := MOD (v_quotient, v_basenumber);

      EXECUTE IMMEDIATE    'select Decode('                         || v_remainder                         || ' ,'                         || v_decodesql                         || v_remainder                         || ')    From dual '                    INTO v_replace_str;

      v_result_str :=             SUBSTR (v_result_str, 0, v_digit_loop)          || v_replace_str          || SUBSTR (v_result_str, v_digit_loop + 2, v_digit - v_digit_loop);       v_quotient := FLOOR (v_quotient / v_basenumber);       v_digit_loop := v_digit_loop - 1;       EXIT WHEN v_digit_loop < 0;    END LOOP;

   RETURN v_result_str; END FN_CONVERT_DECIMAL_TO_BASE;

原文地址:https://www.cnblogs.com/bedfly/p/10944297.html