Oracle與Mysql的SQL轉換

//
// 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();
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章