閱讀495 返回首頁    go windows


訂閱數據SQL封裝簡介__數據訂閱_用戶指南_數據傳輸-阿裏雲

數據訂閱SDK訂閱到的數據為DTS自定義格式,本小節簡單介紹各種類型SQL語句解析的代碼實現。

DDL解析

如果一個Record 是DDL語句,那麼這個Record 的操作類型為DDL。且DDL語句存儲在第一列的value中。具體獲取DDL語句的代碼如下:

  1. String ddl_string;
  2. Record.Type type=record.getOpt();
  3. if(type.equals(Record.Type.DDL)){
  4. List<DataMessage.Record.Field> fields = record.getFieldList();
  5. ddl_string = fields.get(0).getValue().toString();
  6. }

Insert 解析

如果一個Record 是Insert語句,那麼這個Record的操作類型為INSERT。具體獲取Insert完整語句的代碼如下:

  1. StringBuilder insert_string=new StringBuilder();
  2. Record.Type type=record.getOpt();
  3. DataMessage.Record.Field field;
  4. StringBuilder FieldName=new StringBuilder();
  5. StringBuilder FieldValue = new StringBuilder();
  6. if(type.equals(Record.Type.INSERT)){
  7. int i=0;
  8. List<DataMessage.Record.Field> fields = record.getFieldList();
  9. for (; i < fields.size(); i++) {
  10. field = fields.get(i); FieldName.append('`'+field.getFieldname().toLowerCase()+'`');
  11. FieldValue.append(field.getValue());
  12. if (i != fields.size() - 1) {
  13. FieldName.append(',');
  14. FieldValue.append(',');
  15. }
  16. }
  17. insert_string.append("insert "+ record.getTablename()+"("+FieldName.toString()+") values("+FieldValue.toString()+");");
  18. }

Update 解析

如果一個Record 是Update語句,那麼這個Record的操作類型為UPDATE。

update更新前的字段存儲在:Record.getFieldList()中索引為偶數的Field,更新後的字段值存儲在:索引為奇數的Field。

下麵的示例代碼介紹當update的表有主鍵時,獲取Insert完整語句的代碼示例:

  1. StringBuilder update_string=new StringBuilder();
  2. Record.Type type=record.getOpt();
  3. DataMessage.Record.Field field;
  4. StringBuilder SetValue = new StringBuilder();
  5. StringBuilder WhereCondition = new StringBuilder();
  6. String ConditionStr;
  7. boolean hasPk=false;
  8. boolean pkMode=false;
  9. boolean hasSet=false;
  10. if(type.equals(Record.Type.UPDATE)){
  11. int i=0;
  12. DataMessage.Record.Field OldField = null;
  13. DataMessage.Record.Field NewField = null;
  14. List<DataMessage.Record.Field> fields = record.getFieldList();
  15. for (; i <fields.size() ; i++) {
  16. if (i % 2 == 0) {
  17. OldField = fields.get(i);
  18. continue;
  19. }
  20. NewField = fields.get(i);
  21. if (field.isPrimary()) {
  22. if (hasPk) {
  23. WhereCondition.append(" and ");
  24. }
  25. //where old value
  26. ConditionStr = getFieldValue(OldField);
  27. if(ConditionStr==null){ WhereCondition.append("`"+field.getFieldname().toLowerCase()+"`" + " " + "is null");
  28. }else{
  29. WhereCondition.append("`"+field.getFieldname().toLowerCase()+"`"+" = "+ NewField.getValue());
  30. }
  31. hasPk = true;
  32. }
  33. if (hasSet) {
  34. SetValue.append(COMMA);
  35. }
  36. SetValue.append("`"+field.getFieldname().toLowerCase()+"`" + " = " + field.getValue());
  37. String setStr = getFieldValue(field);
  38. hasSet = true;
  39. }
  40. update_string.append("Update "+record.getTablename() +" Set " + SetValue + " Where "+WhereCondition +";");
  41. }

Delete 解析

如果一個Record 是Delete語句,那麼這個Record的操作類型為DELETE。下麵的代碼示例簡單介紹當delete對應的表有主鍵時,如何獲取完整的Delete語句:

  1. StringBuilder delete_string=new StringBuilder();
  2. Record.Type type=record.getOpt();
  3. DataMessage.Record.Field field;
  4. StringBuilder FieldName=new StringBuilder();
  5. StringBuilder FieldValue = new StringBuilder();
  6. StringBuilder DeleteCondition = new StringBuilder();
  7. boolean hasPk=false;
  8. boolean pkMode=false;
  9. if(type.equals(Record.Type.DELETE)){
  10. int i=0;
  11. List<DataMessage.Record.Field> fields = record.getFieldList();
  12. delete_string.append("Delete From" + record.getTablename() + "where");
  13. // 表是否有主鍵?
  14. if (record.getPrimaryKeys() != null) {
  15. pkMode = record.getPrimaryKeys().length() > 0 ? true : false;
  16. }
  17. for (; i < fields.size(); i++) {
  18. if ((pkMode && !field.isPrimary())) {
  19. continue;
  20. }
  21. if (hasPk) {
  22. delete_string.append(" and ");
  23. }
  24. delete_string.append(field.getFieldname() + "=" + field.getValue());
  25. hasPk = true;
  26. }
  27. delete_string.append(";");
  28. }

Replace 解析

如果源庫執行了Replace語句,那麼這個Record的操作類型為UPDATE或INSERT。當replace設置的值不存在時,Record的操作類型為INSERT,當replace設置的值存在時,Record的操作類型為UPDATE。

Begin 解析

如果一個Record 是Begin語句,那麼這個Record的操作類型為BEGIN。begin語句沒有實際內容,所以不需要對Field做處理,隻需要判斷操作為begin即可,具體獲取代碼如下:

  1. StringBuilder sql_string = new StringBuilder();
  2. Record.Type type = record.getOpt();
  3. if(type.equals(Record.Type.BEGIN)){
  4. sql_string.append("Begin");
  5. }

Commit 解析

如果一個Record 是Commit語句,那麼這個Record的操作類型為COMMIT。commit語句沒有實際內容,所以不需要對Field做處理,隻需要判斷操作為commit即可。

  1. StringBuilder sql_string = new StringBuilder();
  2. Record.Type type = record.getOpt();
  3. if(type.equals(Record.Type.COMMIT)){
  4. sql_string.append("commit");
  5. }

最後更新:2016-11-23 16:04:15

  上一篇:go SDK快速入門__數據訂閱_用戶指南_數據傳輸-阿裏雲
  下一篇:go SDK示例代碼運行簡介__數據訂閱_用戶指南_數據傳輸-阿裏雲