現有SQL腳本,要羅列出腳本里sql陳述句中涉及到的目標表名,目標表所有欄位,目標表欄位對應的原表名,映射關系,怎么能快速完成啊?一個400多行的SQL用了兩小時才找完,看著100多個腳本欲哭無淚,求大佬們出出主意,有沒有啥方法能從sql陳述句里分析出欄位對應的原表和目標表啊?
uj5u.com熱心網友回復:
只用sql的話很難把,用python的話很簡單,遍歷sql檔案,分割sql陳述句到串列,然后正則運算式匹配就行了把uj5u.com熱心網友回復:
這個是決議sql了,直接找工具類去。我找到一個java的,不過不知道能不能支持復雜大sql
https://github.com/alibaba/druid/wiki/Druid_SQL_AST
uj5u.com熱心網友回復:
扒了一套代碼,不過應該實作不了你的要求。如果表別名瞎寫的話,人都看不出來,別說是機器了。import java.util.List;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor;
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor;
import com.alibaba.druid.util.Utils;
public class MySqlPerfTest {
private String sql;
public static void main(String[] args) throws Exception {
MySqlPerfTest test = new MySqlPerfTest();
test.setUp();
test.execMySql(test.sql);
System.out.println(test.execMySql(test.sql));
}
protected void setUp() throws Exception {
//sql = "SELECT * FROM T";
sql = "SELECT ID, NAME, AGE FROM USER WHERE ID = ? union all SELECT ID, NAME, AGE FROM USER2, user3 t2 where 1 = 2 and 33 = dfg and user2.d = t2.asdf";
// sql = Utils.readFromResource("benchmark/sql/ob_sql.txt");
}
public void test_pert() throws Exception {
for (int i = 0; i < 10; ++i) {
perfMySql(sql);
}
}
long perfMySql(String sql) {
// long startYGC = TestUtils.getYoungGC();
// long startYGCTime = TestUtils.getYoungGCTime();
// long startFGC = TestUtils.getFullGC();
long startMillis = System.currentTimeMillis();
for (int i = 0; i < 1000 * 1000; ++i) {
execMySql(sql);
}
long millis = System.currentTimeMillis() - startMillis;
// long ygc = TestUtils.getYoungGC() - startYGC;
// long ygct = TestUtils.getYoungGCTime() - startYGCTime;
// long fgc = TestUtils.getFullGC() - startFGC;
// System.out.println("MySql\t" + millis + ", ygc " + ygc + ", ygct " + ygct + ", fgc " + fgc);
return millis;
}
private String execMySql(String sql) {
StringBuilder out = new StringBuilder();
OracleOutputVisitor visitor = new OracleOutputVisitor(out);
//MySqlOutputVisitor visitor = new MySqlOutputVisitor(out);
// MySqlStatementParser parser = new MySqlStatementParser(sql);
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
for (SQLStatement statement : statementList) {
statement.accept(visitor);
visitor.println();
}
return out.toString();
}
}
uj5u.com熱心網友回復:
我一會兒運行一下試試效果,大佬知道有啥軟體可以分析Oracle sql血緣關系的嗎?有的話推薦一下啊
uj5u.com熱心網友回復:
這個是分析Oracle sql血緣關系的,大佬知道有啥軟體工具能實作這功能嗎,求推薦
uj5u.com熱心網友回復:
這個是分析Oracle sql血緣關系的,大佬知道有啥軟體工具能實作這功能嗎,求推薦
uj5u.com熱心網友回復:
血緣關系?,啥意思,貼出來原檔案看看uj5u.com熱心網友回復:
這個sql能正常跑嗎?如果可以,就把他建成視圖,然后通過user_dependencies去找依賴關系uj5u.com熱心網友回復:
結貼,謝謝大佬們!轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/16339.html
標籤:基礎和管理
上一篇:求助
