Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.56 KB | None | 0 0
  1. import java.sql.{DriverManager, ResultSet, ResultSetMetaData}
  2.  
  3. object SelectToInsertSample extends App {
  4.  
  5. Class.forName("org.postgresql.Driver")
  6.  
  7. withResource(
  8. DriverManager.getConnection(
  9. "jdbc:postgresql://localhost:5432/test_db",
  10. "root",
  11. "password"
  12. )
  13. ) { connection =>
  14. connection.setSchema("ec")
  15. withResource(connection.createStatement) { statement =>
  16. statement.setFetchSize(500)
  17.  
  18. val sql =
  19. """
  20. |SELECT
  21. | c.*
  22. | , o.*
  23. | , od.*
  24. |FROM
  25. | customers c LEFT JOIN orders o
  26. | on c.id = o.customer_id
  27. | LEFT JOIN order_details od
  28. | on o.id = od.order_id;
  29. """.stripMargin
  30. val resultSet = statement.executeQuery(sql)
  31.  
  32. while (resultSet.next()) {
  33. val meta: ResultSetMetaData = resultSet.getMetaData
  34. val columnCount = meta.getColumnCount
  35.  
  36. Range(0, columnCount)
  37. .map(findColumnMetaAndValue(meta, resultSet, _))
  38. .groupBy(_.tableName)
  39. .foreach(printInsertSQL)
  40. }
  41. }
  42. }
  43.  
  44. def findColumnMetaAndValue: (ResultSetMetaData, ResultSet, Int) => ColumnMetaAndValue = { (meta, resultSet, i) =>
  45. val columnIndex = i + 1
  46. ColumnMetaAndValue(
  47. meta.getTableName(columnIndex),
  48. columnIndex,
  49. meta.getColumnName(columnIndex),
  50. meta.getColumnTypeName(columnIndex),
  51. resultSet.getString(columnIndex)
  52. )
  53. }
  54.  
  55. def printInsertSQL(entry: (String, Seq[ColumnMetaAndValue])): Unit = {
  56. val (tableName, values) = entry
  57.  
  58. if (values.nonEmpty && !values.forall(_.value == null)) {
  59. val (columnNames, sqlValues) = values
  60. .map(v => (v.columnName, v.sqlValue))
  61. .unzip
  62.  
  63. val sql =
  64. s"INSERT INTO $tableName ${columnNames.mkString("(", ", ", ")")} VALUES ${sqlValues.mkString("(", ", ", ")")};"
  65. println(sql)
  66. } else ()
  67. }
  68.  
  69. def withResource[T <: AutoCloseable, R](resource: T)(f: T => R) {
  70. try {
  71. f(resource)
  72. } finally {
  73. resource.close()
  74. }
  75. }
  76. }
  77.  
  78. case class ColumnMetaAndValue(
  79. tableName: String,
  80. columnIndex: Int,
  81. columnName: String,
  82. columnTypeName: String,
  83. value: String
  84. ) {
  85. val NumberOrBoolPrefixes = List(
  86. "bigserial",
  87. "serial",
  88. "smallserial",
  89. "smallint",
  90. "integer",
  91. "bigint",
  92. "numeric",
  93. "numeric",
  94. "real",
  95. "double precision",
  96. "boolean",
  97. "int",
  98. "float",
  99. "decimal",
  100. "bool",
  101. )
  102.  
  103. def sqlValue: String =
  104. if (NumberOrBoolPrefixes.exists(columnTypeName.startsWith) || value == null) value
  105. else s"'$value'"
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement