いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

テーブルデータ出力スクリプト

仕事で、テーブルデータをXMLで取得する必要が
あったので、書いたgroovyスクリプト。
10分くらいでなぐり書きしたので、見た目の良さとか
処理効率についてはご勘弁を。
ちなみに、oracle専用です。
実行すると標準出力にXMLがわらわら出てきます。

//
// vim: set ts=2 sw=2 et ft=java:
//
import java.io.File

import groovy.sql.Sql
import groovy.xml.MarkupBuilder

// 実際のDBの情報を設定
sql = Sql.newInstance("JDBC URL", 
                      "JDBC USER ID", 
                      "JDBC PASSWORD", 
                      "JDBC DRIVER")


tableNamesList = []
sql.eachRow("select table_name from user_tables"){ tables |
	tableNamesList.add(tables.table_name)
}

println '<?xml version="1.0" encoding="Shift_JIS"?>'

xml = new MarkupBuilder()
xml.tables(){
  tableNamesList.each{ tableName |
    columnDataList = []
    map            = null

    sql.eachRow("select column_name, data_type, data_length from user_tab_columns where table_name = ${tableName}"){ columnData |
      map = ["columnName":columnData.column_name, "dataType":columnData.data_type, "dataLength":columnData.data_length]

      columnDataList.add(map)
      
      map = null
    }

    selectPart   = columnDataList.collect{ it.columnName }.join(",")

    // 何故か"select ${selectPart} from ${tableName}"ってやるとエラーになる・・
    dataFetchSql = "select " + selectPart + " from " + tableName

    xml.table(name:tableName){
      sql.eachRow(dataFetchSql){ rowData |
          xml.row(){
            columnValue = null
            columnDataList.each{ columnData |
              columnValue = rowData.getString(columnData.columnName)

              columnValue = (columnValue == null) ? "" : columnValue

              xml.column(name:columnData.columnName, value:columnValue, type:columnData.dataType, length:columnData.dataLength)
          }
        }
      }
    }
  }
}

Groovyは後発のスクリプト言語なので
rubyとかpythonのいいところどりをしていて
なかなかイイ感じ。
ruby知っている人にはわかり易い言語だと思います。




================================
過去の記事については、以下のページからご参照下さい。