// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package com.saf.sql.utils; import java.util.HashSet; import java.util.Set; import java.util.Stack; public class Translate { public static Set<String> mSniffSet = new HashSet(); static { mSniffSet.add("AND"); mSniffSet.add("OR"); mSniffSet.add("IN"); } public Translate() { } public static void main(String[] args) { String pSql = "SELECT DISTINCT C.USR_USRID, C.USR_CAPTION,C.USR_EMAIL1 FROM BF_TASK_USER A, SSF_USERS C LEFT JOIN BF_USER_ROLE_ORG B ON B.F_USER_ID=C.USR_USRID WHERE 1=1 AND((A.F_ISUSER='1' AND A.F_USER_ID=C.USR_USRID) OR (A.F_ISUSER='0' AND A.F_USER_ID = B.F_ROLE_ID AND (( B.F_ORG_ID IS NOT NULL AND B.F_ORG_ID LIKE A.F_ORG_ID||'%' ) OR ((B.F_ORG_ID IS NULL OR B.F_ORG_ID='') AND C.USR_ORGID LIKE A.F_ORG_ID||'%' )) AND (A.F_PROJECT_ID IS NULL OR A.F_PROJECT_ID='' OR (EXISTS (SELECT 1 FROM BF_PROJECT D WHERE D.F_MANAGER=C.USR_USRID AND D.F_ID=A.F_PROJECT_ID))))) AND F_TASK_SN=?"; String pSql2 = translateOracleSql2MysqlSql(pSql); System.out.println(pSql2); } public static String translateOracleSql2MysqlSql(String pSql) { int index = pSql.indexOf("||"); if (index == -1) { return pSql; } else { Stack<Character> pInStack = new Stack(); translateOracleSql2MysqlSql(pInStack, pSql, 0); return getInStackString(pInStack).toString(); } } public static void translateOracleSql2MysqlSql(Stack<Character> pInStack, String pSql, int startIndex) { int index = pSql.indexOf("||", startIndex); if (index == -1) { putStringChar2Stack(pSql.substring(startIndex), pInStack); } else { Stack<Character> pOutStack = new Stack(); Stack<Character> pSniffStack = new Stack(); String pSub = pSql.substring(startIndex, index); putStringChar2Stack(pSub, pInStack); boolean isSpaceEable = true; boolean singleQuoteOn = false; int bracketCount = 0; boolean sniffEnable = false; while(!pInStack.isEmpty()) { Character pPopChr = (Character)pInStack.pop(); pOutStack.push(pPopChr); if (sniffEnable) { pSniffStack.push(pPopChr); } if (!Character.isWhitespace(pPopChr)) { isSpaceEable = false; } if (Character.isWhitespace(pPopChr)) { if (bracketCount == 0 && !singleQuoteOn && !isSpaceEable) { if (sniffEnable) { sniffEnable = false; String pFuncName = getOutStackString(pSniffStack).trim().toUpperCase(); if (mSniffSet.contains(pFuncName)) { while(!pSniffStack.isEmpty()) { pSniffStack.pop(); pInStack.push((Character)pOutStack.pop()); } } } break; } } else if (pPopChr.equals(')')) { ++bracketCount; } else if (pPopChr.equals('(')) { if (bracketCount == 0) { pInStack.push(pPopChr); pOutStack.pop(); break; } --bracketCount; if (bracketCount == 0) { isSpaceEable = true; sniffEnable = true; } } else if (pPopChr.equals('\'')) { if (bracketCount == 0) { if (singleQuoteOn) { singleQuoteOn = true; break; } singleQuoteOn = true; } } else if (!pPopChr.equals('?') && !pPopChr.equals('.') && !Character.isJavaIdentifierPart(pPopChr)) { if (bracketCount == 0 && !singleQuoteOn) { pInStack.push(pPopChr); pOutStack.pop(); break; } } else { isSpaceEable = false; } } putStringChar2Stack(" CONCAT(", pInStack); putStack2Stack(pOutStack, pInStack); putStringChar2Stack(",", pInStack); index += 2; isSpaceEable = true; singleQuoteOn = false; bracketCount = 0; sniffEnable = false; int index2 = pSql.indexOf("||", index); if (index2 == -1) { index2 = pSql.length(); } while(index < index2) { Character pChar = pSql.charAt(index); pInStack.push(pChar); if (sniffEnable) { pSniffStack.push(pChar); } ++index; if (!Character.isWhitespace(pChar)) { isSpaceEable = false; } if (Character.isWhitespace(pChar)) { if (bracketCount == 0 && !singleQuoteOn && !isSpaceEable) { sniffEnable = true; isSpaceEable = true; } } else if (pChar.equals('(')) { if (sniffEnable) { sniffEnable = false; } ++bracketCount; } else if (pChar.equals(')')) { if (bracketCount == 0) { pInStack.pop(); --index; break; } --bracketCount; if (bracketCount == 0) { break; } } else if (pChar.equals('\'')) { if (bracketCount == 0) { if (singleQuoteOn) { singleQuoteOn = false; break; } singleQuoteOn = true; } } else if (!pChar.equals('?') && !pChar.equals('.') && !Character.isJavaIdentifierPart(pChar)) { if (bracketCount == 0 && !singleQuoteOn) { pInStack.pop(); --index; break; } } else { isSpaceEable = false; if (sniffEnable) { sniffEnable = false; pInStack.pop(); --index; break; } } } if (bracketCount > 0) { translateOracleSql2MysqlSql(pInStack, pSql, index); putStringChar2Stack(")", pInStack); } else { putStringChar2Stack(")", pInStack); translateOracleSql2MysqlSql(pInStack, pSql, index); } } } public static void putStringChar2Stack(String pStr, Stack<Character> pStack) { char[] var5; int var4 = (var5 = pStr.toCharArray()).length; for(int var3 = 0; var3 < var4; ++var3) { char ch = var5[var3]; pStack.push(ch); } } public static void putStack2Stack(Stack<Character> pSrcStack, Stack<Character> p2Stack) { while(!pSrcStack.isEmpty()) { p2Stack.push((Character)pSrcStack.pop()); } } public static String getInStackString(Stack<Character> pStack) { if (pStack.isEmpty()) { return ""; } else { StringBuffer pBuffer = new StringBuffer(); for(int i = 0; i < pStack.size(); ++i) { pBuffer.append(pStack.get(i)); } return pBuffer.toString(); } } public static String getOutStackString(Stack<Character> pStack) { if (pStack.isEmpty()) { return ""; } else { StringBuffer pBuffer = new StringBuffer(); for(int i = pStack.size() - 1; i > -1; --i) { pBuffer.append(pStack.get(i)); } return pBuffer.toString(); } } }
Oracle與Mysql的SQL轉換
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.