Hatena::ブログ(Diary)

マイノート

2015-03-29

2015-03-28

Oracleのテーブル定義をExcelシートに出力する(2)


http://d.hatena.ne.jp/tigerii/20120730/1343660136

で作ったプログラムを見直す。


前回は ./show_user_tables.pl HR でHRが所有するテーブルを一行ずつ出力し、./table_info2.xls.pl ではテーブル毎にテーブル定義をselectして、出力結果をexcelファイルに書き込んだ。

$ ./show_user_tables.pl HR | ./table_info2xls.pl


今回は、DB接続情報とownerを渡して、xml形式で出力する。

(ora_table_info.pl)

#!/usr/bin/env perl

use DBI;

$ENV{ORACLE_HOME}='/u01/app/oracle/product/11.2.0/xe';
$driver = 'Oracle';

if( $ARGV[0] =~ /(\S+)\/(\S+)\@(\S+):(\d+)\/(\S+)/ ){
  $user     = $1;
  $password = $2;
  $hostname = $3;
  $port     = $4;
  $sid      = $5;
}else{
  die "usage: ora_table_info.pl <user>/<password>@<hostname>:<port>/<sid> <owner>"
}

#dbi:$driver:database=$db;host=$host;port=$port
$dbh = DBI->connect("dbi:$driver:host=$hostname;sid=$sid;port=$port",$user,$password);

$sql_table_name = <<EOS;
select table_name
from all_tables where owner='$ARGV[1]'
order by table_name
EOS
$sth_table_name = $dbh->prepare($sql_table_name);
$sth_table_name->execute();

while($table_name=$sth_table_name->fetchrow_array()){

$sql_table_info = <<EOS;
select utcol.column_name,
       utcol.data_type,
       utcol.data_length,
       uccom.comments
from user_tab_cols utcol, user_col_comments uccom
where utcol.table_name = '$table_name' and
      utcol.table_name = uccom.table_name and
      utcol.column_name = uccom.column_name
EOS

  $sth_table_info = $dbh->prepare($sql_table_info);
  $sth_table_info->execute();

  print "<table name=\"$table_name\">\n";

  print "  <row><!--header-->\n";
  for($i=0; $i<$sth_table_info->{NUM_OF_FIELDS}; $i++){
    print "    <column name=\"$sth_table_info->{NAME}->[$i]\">$sth_table_info->{NAME}->[$i]<\/column>\n";
  }
  print "  <\/row><!--header-->\n";

  while(@row=$sth_table_info->fetchrow_array()){
    print "  <row>\n";
    for($i=0; $i<$sth_table_info->{NUM_OF_FIELDS}; $i++){
      print "    <column name=\"$sth_table_info->{NAME}->[$i]\">$row[$i]<\/column>\n";
    }
    print "  <\/row>\n";
  }

  print "</table>\n";

  $sth_table_info->finish();

}

$sth_table_name->finish();
$dbh->disconnect();

実行してみる

$ ./ora_table_info.pl 
usage: ora_table_info.pl <user>/<password>@<hostname>:<port>/<sid> <owner> at ./ora_table_info.pl line 15.
$ ./ora_table_info.pl hr/hr@192.168.0.19:1521/xe HR
<table name="COUNTRIES">
  <row><!--header-->
    <column name="COLUMN_NAME">COLUMN_NAME</column>
    <column name="DATA_TYPE">DATA_TYPE</column>
    <column name="DATA_LENGTH">DATA_LENGTH</column>
    <column name="COMMENTS">COMMENTS</column>
  </row><!--header-->
  <row>
    <column name="COLUMN_NAME">COUNTRY_ID</column>
    <column name="DATA_TYPE">CHAR</column>
    <column name="DATA_LENGTH">2</column>
    <column name="COMMENTS">Primary key of countries table.</column>
  </row>
  <row>
    <column name="COLUMN_NAME">COUNTRY_NAME</column>
    <column name="DATA_TYPE">VARCHAR2</column>
    <column name="DATA_LENGTH">40</column>
    <column name="COMMENTS">Country name</column>
  </row>
  <row>
    <column name="COLUMN_NAME">REGION_ID</column>
    <column name="DATA_TYPE">NUMBER</column>
    <column name="DATA_LENGTH">22</column>
    <column name="COMMENTS">Region ID for the country. Foreign key to region_id column in the departments table.</column>
  </row>
</table>
<table name="DEPARTMENTS">
...
  <row>
    <column name="COLUMN_NAME">REGION_NAME</column>
    <column name="DATA_TYPE">VARCHAR2</column>
    <column name="DATA_LENGTH">25</column>
    <column name="COMMENTS"></column>
  </row>
</table>


xmlの出力結果を読み込んで、\<table\>...\<\/table\>毎にシートに分けてexcelに書き込む予定

2015-03-25

2015-03-20

国産化黎明期の家庭用電化機器

http://gyao.yahoo.co.jp/player/11022/v00001/v0000000000000000002/

お手紙を頂いた時は 夢ではないかと思いました。

うれしくてうれしくて心がうきうきしてきました。

■配信期間

2015年3月10日〜2015年3月23日

■番組

TALES OF 機械遺産

2015-03-18

2015-03-15

内部結合と外部結合

inner joinouter join の違いと覚え方の自分用まとめ(外部表、駆動表もメモ)

http://web.plus-idea.net/2013/04/join-outer-inne/



Visual Representation of SQL Joins

http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

http://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_V2.png



左外部結合のSQL

SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE ..


SQL標準である SQL-92 や SQL-99 の仕様書(というか標準文書)はどこで見ることができますか。日本語訳があるとなお良しです。

http://q.hatena.ne.jp/1085111702



OUTERは書かなくてよい?

http://savage.net.au/SQL/sql-92.bnf.html#qualified%20join

2015-03-11

2015-03-07

2015-03-04

2015-02-28

FIBA タスクフォース「JAPAN 2024 TASKFORCE」

http://www.japan2024.jp/

今後の動きとスケジュール

JAPAN 2024 TASKFORCE」は、2015年6月までに以下の3つの大きな課題について関係者間での合意形成を目指します。

http://www.japan2024.jp/img/chart.png

主に上記の1〜3それぞれのA〜Cを議論し、その経過を公開してまいります。

http://www.japan2024.jp/img/schedule.png


林修の金曜言葉塾〜梅

http://www.tv-asahi.co.jp/onair/info.php?b=yajiplus&id=5677

東風吹かば 匂ひおこせよ 梅の花 あるじなしとて 春を(な)忘れそ

それから 「松竹梅」 という言葉、これも中国から来ています。

      

寒さの中 花を咲かせる梅と、寒くても緑を保つ 松 と 竹、中国では 「歳寒三友」 と呼ばれました。厳しい時にも離れることのない三人の友という意味で、ですからそもそも 「松竹梅」 には、上下の隔てはありませんでした。

グローバル変数

関数の中でグローバル変数をいじるプログラムは寒気がする。

AWKでは、関数定義のなかの引数は局所的(local)で、その他のすべての変数は大域的(global)らしい。。


(list: fmt.awk)

#!/usr/bin/awk -f

/./  { for (i=1; i<=NF; i++) addword($i) }
/^$/ { printline(); print "" }
END  { printline() }

function addword(w){
  if (length(line) + length(w) > 60)
    printline()
  line = line " " w
}

function printline(){
  if (length(line) > 0){
    print substr(line, 2) #先頭の空白を除去する
    line = ""
  }
}

https://books.google.co.jp/books?id=to6M9_dbjosC&pg=PA229&lpg=PA229&dq=awk+fmt+60&source=bl&ots=3_I2GgqZ_c&sig=3DciodYOJkEw1qvHhbPFGXVcPwY&hl=ja&sa=X&ei=3cLxVN6iG4S1mAXk0IHQBw&ved=0CCsQ6AEwAg#v=onepage&q=awk%20fmt%2060&f=false


上のプログラムを書き直してみる。

(list: fmt2.awk)

#!/usr/bin/awk -f

/./ {
      for(i=1; i<=NF; i++) {
        if( length(line) + length($i) > 60){
          print substr(line,2)
          line = " " $i
        }else{
          line = line " " $i
        }
      }
    }
/^$/{
      print substr(line,2)
      print ""
      line = ""
    }
END {
      print substr(line,2)
    }

なんともいえない微妙なできばえ。。。



(list: fmt3.awk)

#!/usr/bin/awk -f

BEGIN { line = "" }
/./ {
      for(i=1; i<=NF; i++){
        line = addword(line, $i)
      }
    }
/^$/{
      line = printline(line)
      print ""
    }
END {
      printline(line)
    }

function addword(line, w){
  if( length(line) + length(w) > 60 ){
    printline(line)
    return " " w
  }else{
    return line " " w
  }
}

function printline(line){
  if (length(line) > 0){
    print substr(line,2)
  }
  return ""
}

実行してみる。

$ more sample.txt
AWK is an interpreted programming language designed for text processing and typically used as a data extraction and reporting tool. It is a standard feature of most Unix-like operating systems.

AWK was created at Bell Labs in the 1970s,[2] and its name is derived from the family names of its authors  Alfred Aho, Peter Weinberger, and Brian Kernighan.
$ ./fmt.awk sample.txt
AWK is an interpreted programming language designed for text
processing and typically used as a data extraction and
reporting tool. It is a standard feature of most Unix-like
operating systems.

AWK was created at Bell Labs in the 1970s,[2] and its name
is derived from the family names of its authors Alfred Aho,
Peter Weinberger, and Brian Kernighan.

$ ./fmt2.awk sample.txt
AWK is an interpreted programming language designed for text
processing and typically used as a data extraction and
reporting tool. It is a standard feature of most Unix-like
operating systems.

AWK was created at Bell Labs in the 1970s,[2] and its name
is derived from the family names of its authors Alfred Aho,
Peter Weinberger, and Brian Kernighan.

プロセス置換機能を使って結果を比較する

$ diff <(./fmt.awk sample.txt ) <(./fmt3.awk sample.txt )

http://d.hatena.ne.jp/tigerii/20120826/1345952762

2015-02-23

銀座線全面リニューアル

http://www.tokyometro.jp/ginza/#


銀座線渋谷駅を130m動かす

http://kenplatz.nikkeibp.co.jp/article/const/news/20130626/621731/

同時に進む駅ビル建て替えや駅前広場整備などの事業と調整しながら、10年度の着工から10年以上をかけた一大移設プロジェクトだ。その間、銀座線の営業は止めない。

「工程や作業スペースなど各事業者間の調整だけで、1年以上かかった」

2015-02-21

2015-02-18

2015-02-16

2015-02-13