首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java 编撰 Oracle函数

2012-10-17 
java 编写 Oracle函数create or replace and compile java source named base64 aspackage cn.com.pansky.

java 编写 Oracle函数

    create or replace and compile java source named base64 as      package cn.com.pansky.util;            /**      * This is a base 64 conversion class based on RFC 2045 6.8.      * Base64 Content-Tranfser-Encoding...      * @version 1.0      */      public final class  Base64 {                static private final int  BASELENGTH         = 255;          static private final int  LOOKUPLENGTH       = 64;          static private final int  TWENTYFOURBITGROUP = 24;          static private final int  EIGHTBIT           = 8;          static private final int  SIXTEENBIT         = 16;          static private final int  SIXBIT             = 6;          static private final int  FOURBYTE           = 4;          static private final int  SIGN               = -128;          static private final char PAD                = '=';          static private final boolean fDebug          = false;          static final private byte [] base64Alphabet        = new byte[BASELENGTH];          static final private char [] lookUpBase64Alphabet  = new char[LOOKUPLENGTH];                static {                    for (int i = 0; i<BASELENGTH; i++) {                  base64Alphabet[i] = -1;              }              for (int i = 'Z'; i >= 'A'; i--) {                  base64Alphabet[i] = (byte) (i-'A');              }              for (int i = 'z'; i>= 'a'; i--) {                  base64Alphabet[i] = (byte) ( i-'a' + 26);              }                    for (int i = '9'; i >= '0'; i--) {                  base64Alphabet[i] = (byte) (i-'0' + 52);              }                    base64Alphabet['+']  = 62;              base64Alphabet['/']  = 63;                    for (int i = 0; i<=25; i++)                  lookUpBase64Alphabet[i] = (char)('A'+i);                    for (int i = 26,  j = 0; i<=51; i++, j++)                  lookUpBase64Alphabet[i] = (char)('a'+ j);                    for (int i = 52,  j = 0; i<=61; i++, j++)                  lookUpBase64Alphabet[i] = (char)('0' + j);              lookUpBase64Alphabet[62] = (char)'+';              lookUpBase64Alphabet[63] = (char)'/';                }                protected static boolean isWhiteSpace(char octect) {              return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);          }                protected static boolean isPad(char octect) {              return (octect == PAD);          }                protected static boolean isData(char octect) {              return (base64Alphabet[octect] != -1);          }                protected static boolean isBase64(char octect) {              return (isWhiteSpace(octect) || isPad(octect) || isData(octect));          }                public static String encode(String str) {            if(str==null || str.equals("")) return null;            return encode(str.getBytes());          }                  /**          * Encodes hex octects into Base64          *          * @param binaryData Array containing binaryData          * @return Encoded Base64 array          */          public static String encode(byte[] binaryData) {                    if (binaryData == null)                  return null;                    int      lengthDataBits    = binaryData.length*EIGHTBIT;              if (lengthDataBits == 0) {                  return "";              }                          int      fewerThan24bits   = lengthDataBits%TWENTYFOURBITGROUP;              int      numberTriplets    = lengthDataBits/TWENTYFOURBITGROUP;              int      numberQuartet     = fewerThan24bits != 0 ? numberTriplets+1 : numberTriplets;              int      numberLines       = (numberQuartet-1)/19+1;              char     encodedData[]     = null;                    encodedData = new char[numberQuartet*4+numberLines];                    byte k=0, l=0, b1=0,b2=0,b3=0;                    int encodedIndex = 0;              int dataIndex   = 0;              int i           = 0;              if (fDebug) {                  System.out.println("number of triplets = " + numberTriplets );              }                    for (int line = 0; line < numberLines-1; line++) {                  for (int quartet = 0; quartet < 19; quartet++) {                      b1 = binaryData[dataIndex++];                      b2 = binaryData[dataIndex++];                      b3 = binaryData[dataIndex++];                            if (fDebug) {                          System.out.println( "b1= " + b1 +", b2= " + b2 + ", b3= " + b3 );                      }                            l  = (byte)(b2 & 0x0f);                      k  = (byte)(b1 & 0x03);                            byte val1 = ((b1 & SIGN)==0)?(byte)(b1>>2):(byte)((b1)>>2^0xc0);                            byte val2 = ((b2 & SIGN)==0)?(byte)(b2>>4):(byte)((b2)>>4^0xf0);                      byte val3 = ((b3 & SIGN)==0)?(byte)(b3>>6):(byte)((b3)>>6^0xfc);                            if (fDebug) {                          System.out.println( "val2 = " + val2 );                          System.out.println( "k4   = " + (k<<4));                          System.out.println( "vak  = " + (val2 | (k<<4)));                      }                            encodedData[encodedIndex++] = lookUpBase64Alphabet[ val1 ];                      encodedData[encodedIndex++] = lookUpBase64Alphabet[ val2 | ( k<<4 )];                      encodedData[encodedIndex++] = lookUpBase64Alphabet[ (l <<2 ) | val3 ];                      encodedData[encodedIndex++] = lookUpBase64Alphabet[ b3 & 0x3f ];                            i++;                  }                  encodedData[encodedIndex++] = 0xa;              }                    for (; i<numberTriplets; i++) {                  b1 = binaryData[dataIndex++];                  b2 = binaryData[dataIndex++];                  b3 = binaryData[dataIndex++];                        if (fDebug) {                      System.out.println( "b1= " + b1 +", b2= " + b2 + ", b3= " + b3 );                  }                        l  = (byte)(b2 & 0x0f);                  k  = (byte)(b1 & 0x03);                        byte val1 = ((b1 & SIGN)==0)?(byte)(b1>>2):(byte)((b1)>>2^0xc0);                        byte val2 = ((b2 & SIGN)==0)?(byte)(b2>>4):(byte)((b2)>>4^0xf0);                  byte val3 = ((b3 & SIGN)==0)?(byte)(b3>>6):(byte)((b3)>>6^0xfc);                        if (fDebug) {                      System.out.println( "val2 = " + val2 );                      System.out.println( "k4   = " + (k<<4));                      System.out.println( "vak  = " + (val2 | (k<<4)));                  }                        encodedData[encodedIndex++] = lookUpBase64Alphabet[ val1 ];                  encodedData[encodedIndex++] = lookUpBase64Alphabet[ val2 | ( k<<4 )];                  encodedData[encodedIndex++] = lookUpBase64Alphabet[ (l <<2 ) | val3 ];                  encodedData[encodedIndex++] = lookUpBase64Alphabet[ b3 & 0x3f ];              }                    // form integral number of 6-bit groups              if (fewerThan24bits == EIGHTBIT) {                  b1 = binaryData[dataIndex];                  k = (byte) ( b1 &0x03 );                  if (fDebug) {                      System.out.println("b1=" + b1);                      System.out.println("b1<<2 = " + (b1>>2) );                  }                  byte val1 = ((b1 & SIGN)==0)?(byte)(b1>>2):(byte)((b1)>>2^0xc0);                  encodedData[encodedIndex++] = lookUpBase64Alphabet[ val1 ];                  encodedData[encodedIndex++] = lookUpBase64Alphabet[ k<<4 ];                  encodedData[encodedIndex++] = PAD;                  encodedData[encodedIndex++] = PAD;              } else if (fewerThan24bits == SIXTEENBIT) {                  b1 = binaryData[dataIndex];                  b2 = binaryData[dataIndex +1 ];                  l = ( byte ) ( b2 &0x0f );                  k = ( byte ) ( b1 &0x03 );                        byte val1 = ((b1 & SIGN)==0)?(byte)(b1>>2):(byte)((b1)>>2^0xc0);                  byte val2 = ((b2 & SIGN)==0)?(byte)(b2>>4):(byte)((b2)>>4^0xf0);                        encodedData[encodedIndex++] = lookUpBase64Alphabet[ val1 ];                  encodedData[encodedIndex++] = lookUpBase64Alphabet[ val2 | ( k<<4 )];                  encodedData[encodedIndex++] = lookUpBase64Alphabet[ l<<2 ];                  encodedData[encodedIndex++] = PAD;              }                    encodedData[encodedIndex] = 0xa;                          return new String(encodedData);          }                /**          * Decodes Base64 data into octects          *          * @param binaryData Byte array containing Base64 data          * @return Array containind decoded data.          */          public static byte[] decode(String encoded) {                    if (encoded == null)                  return null;                    char[] base64Data = encoded.toCharArray();              // remove white spaces              int len = removeWhiteSpace(base64Data);                          if (len%FOURBYTE != 0) {                  return null;//should be divisible by four              }                    int      numberQuadruple    = (len/FOURBYTE );                    if (numberQuadruple == 0)                  return new byte[0];                    byte     decodedData[]      = null;              byte     b1=0,b2=0,b3=0, b4=0, marker0=0, marker1=0;              char     d1=0,d2=0,d3=0,d4=0;                    int i = 0;              int encodedIndex = 0;              int dataIndex    = 0;              decodedData      = new byte[ (numberQuadruple)*3];                    for (; i<numberQuadruple-1; i++) {                        if (!isData( (d1 = base64Data[dataIndex++]) )||                      !isData( (d2 = base64Data[dataIndex++]) )||                      !isData( (d3 = base64Data[dataIndex++]) )||                      !isData( (d4 = base64Data[dataIndex++]) ))                      return null;//if found "no data" just return null                        b1 = base64Alphabet[d1];                  b2 = base64Alphabet[d2];                  b3 = base64Alphabet[d3];                  b4 = base64Alphabet[d4];                        decodedData[encodedIndex++] = (byte)(  b1 <<2 | b2>>4 ) ;                  decodedData[encodedIndex++] = (byte)(((b2 & 0xf)<<4 ) |( (b3>>2) & 0xf) );                  decodedData[encodedIndex++] = (byte)( b3<<6 | b4 );              }                    if (!isData( (d1 = base64Data[dataIndex++]) ) ||                  !isData( (d2 = base64Data[dataIndex++]) )) {                  return null;//if found "no data" just return null              }                    b1 = base64Alphabet[d1];              b2 = base64Alphabet[d2];                    d3 = base64Data[dataIndex++];              d4 = base64Data[dataIndex++];              if (!isData( (d3 ) ) ||                  !isData( (d4 ) )) {//Check if they are PAD characters                  if (isPad( d3 ) && isPad( d4)) {               //Two PAD e.g. 3c[Pad][Pad]                      if ((b2 & 0xf) != 0)//last 4 bits should be zero                          return null;                      byte[] tmp = new byte[ i*3 + 1 ];                      System.arraycopy( decodedData, 0, tmp, 0, i*3 );                      tmp[encodedIndex]   = (byte)(  b1 <<2 | b2>>4 ) ;                      return tmp;                  } else if (!isPad( d3) && isPad(d4)) {               //One PAD  e.g. 3cQ[Pad]                      b3 = base64Alphabet[ d3 ];                      if ((b3 & 0x3 ) != 0)//last 2 bits should be zero                          return null;                      byte[] tmp = new byte[ i*3 + 2 ];                      System.arraycopy( decodedData, 0, tmp, 0, i*3 );                      tmp[encodedIndex++] = (byte)(  b1 <<2 | b2>>4 );                      tmp[encodedIndex]   = (byte)(((b2 & 0xf)<<4 ) |( (b3>>2) & 0xf) );                      return tmp;                  } else {                      return null;//an error  like "3c[Pad]r", "3cdX", "3cXd", "3cXX" where X is non data                  }              } else { //No PAD e.g 3cQl                  b3 = base64Alphabet[ d3 ];                  b4 = base64Alphabet[ d4 ];                  decodedData[encodedIndex++] = (byte)(  b1 <<2 | b2>>4 ) ;                  decodedData[encodedIndex++] = (byte)(((b2 & 0xf)<<4 ) |( (b3>>2) & 0xf) );                  decodedData[encodedIndex++] = (byte)( b3<<6 | b4 );                    }                    return decodedData;          }                /**          * remove WhiteSpace from MIME containing encoded Base64 data.          *          * @param data  the byte array of base64 data (with WS)          * @return      the new length          */          protected static int removeWhiteSpace(char[] data) {              if (data == null)                  return 0;                    // count characters that's not whitespace              int newSize = 0;              int len = data.length;              for (int i = 0; i < len; i++) {                  if (!isWhiteSpace(data[i]))                      data[newSize++] = data[i];              }              return newSize;          }      }  

    create or replace and compile java source named ldapconvert as      package cn.com.pansky.util;            /**      * 这是把中文字符串转换成LDAP可导入格式的转换类      * LDAP可导入格式是先按UTF-8取字节,然后对字节进行BASE64编码      *      * @version 1.0      * @author Sheng Youfu      */      public class LDAPConvert {        private LDAPConvert() { }              /**        * 取按UTF-8编码方式字码数组并进行Base64编码        * @param str:  待处理字符串        * @return 处理后的ASCII字符串        */        public static final String encode(String str) {          if (str == null || str.length() == 0) {            return null;          } else {            try {              Base64 b64 = new Base64();              byte[] tempByte = str.getBytes("UTF-8");              String tempStr = b64.encode(tempByte);              return tempStr;            }catch(java.io.UnsupportedEncodingException ex) {              return "UnsuppoertedEncodingException";            }          }        }              /**        * 对已经编码过的字符串进行解码,先进行Base64解码得到UTF-8字节数组,然后再转换成字符串        * @param str:  待解码的字符串        * @return 解码后的字符串        */        public static final String decode(String str) {          if (str == null || str.length() == 0) {            return null;          }          else {            try {              Base64 b64 = new Base64();              byte[] tempByte = b64.decode(str);              String tempStr = new String(tempByte, "UTF-8");              return tempStr;            }catch(java.io.UnsupportedEncodingException ex) {              return "UnsuppoertedEncodingException";            }              }        }      }  

第三步: 把转换类中的两个方法封装成Oracle函数:

  
 --编码函数      CREATE OR REPLACE FUNCTION LDAPEncode (str VARCHAR2) RETURN VARCHAR2      as language java name          'cn.com.pansky.util.LDAPConvert.encode(java.lang.String)                return java.lang.String';            --解码函数      CREATE OR REPLACE FUNCTION LDAPDecode (str VARCHAR2) RETURN VARCHAR2      as language java name          'cn.com.pansky.util.LDAPConvert.decode(java.lang.String)                return java.lang.String';  

    select '      dn: uid=000000' || uid || ',cn=nsr,ou=People,dc=xmds4,dc=ldap      objectClass: top      objectClass: person      objectClass: organizationalPerson      objectClass: inetOrgPerson      objectClass: mailrecipient      objectClass: nsmessagingserveruser      cn:: ' || LDAPENCODE(rtrim(username)) || 'givenName: 000000' || uid || '      mail: 000000' || uid || '@mails.xmds.gov      mailDeliveryOption: mailbox      mailHost: mails.xmds.gov      nsmsgDisallowAccess: imap http      sn:: ' || LDAPENCODE(rtrim(username)) || 'uid: 000000' || uid || '      employeeType: dwsbh      userPassword:: e1NTSEF9K01YbzNLcGE1cmNyeVRCeWpqYzI5eUxRWnJLWmFldFhFR0JrWnc9PQ==            ' from DJ_QYFRJBXX T where T.DJBLX_DM='10'       order by uid  


转载:http://www.iteye.com/topic/38233

热点排行