数値を返すだけのビューって便利だよね

以下のような数字を返すだけビューを作成しておくと、何かと便利なことが多い。

 /*0~9までの数値を返すだけのVIEW*/
 create view vnum as
   select 0 as n union all
   select 1 as n union all
   select 2 as n union all
   select 3 as n union all
   select 4 as n union all
   select 5 as n union all
   select 6 as n union all
   select 7 as n union all
   select 8 as n union all
   select 9 as n
 ;

どのような場面に使うのかというと、以前紹介した1年分の年月日を生成する時や、歯抜けのIDを全て求める時などである。

これらのSQL文に上記のビューを適用すれば、発行するSQL文を短くすることができる。

実際に1年分の年月日を生成するのSQL文を書き換えてみよう。

比較しやすいように、SQL文を再掲。

 /*1年分の年月日生成*/
 select date_format(date_add('20100101', interval(number) day), '%Y%m%d') as yyyymmdd
 from (
   select hundred.n + tens.n + ones.n as number
   from (
     select 0 as n union all
     select 1 as n union all
     select 2 as n union all
     select 3 as n union all
     select 4 as n union all
     select 5 as n union all
     select 6 as n union all
     select 7 as n union all
     select 8 as n union all
     select 9 as n
   ) as ones cross join (
     select 0 as n union all
     select 10 as n union all
     select 20 as n union all
     select 30 as n union all
     select 40 as n union all
     select 50 as n union all
     select 60 as n union all
     select 70 as n union all
     select 80 as n union all
     select 90 as n
   ) as tens cross join (
     select 0 as n union all
     select 100 as n union all
     select 200 as n union all
     select 300 as n
   ) as hundred
 ) as dummy
 where date_format(date_add('20100101', interval(number) day), '%Y%m%d') < '20110101'
 order by yyyymmdd asc;

このSQL文に今回紹介したビューを適用すると、以下のようになる。

 /*1年分の年月日生成*/
 select date_format(date_add('20100101', interval(number) day), '%Y%m%d') as yyyymmdd
 from (
   --select hundred.n * 100 + tens.n * 10 + ones.n as number
   --from vnum as ones
   --cross join vnum as tens
   --cross join (select n from vnum where n between 0 and 3) as hundred
   select hundred.n + tens.n + ones.n as number
   from vnum as ones
   cross join (select n * 10 as n from vnum) as tens
   cross join (select n * 100 as n from vnum where n between 0 and 3) as hundred
 ) as dummy
 where date_format(date_add('20100101', interval(number) day), '%Y%m%d') < '20110101'
 order by yyyymmdd asc;

以上、数値を返すだけのビューって、作っておくと使い回しができて便利だよね、というお話でした。

ちなみにテーブルを作っても良いのであれば、内部でunion文をいくつも使っているビューよりもテーブルのほうが有利なのは、explainの結果を見れば明らかですな。というか、見なくても(ry。

2010/08/09追記: SQL文を一部修正。

「select hundred.n * 100 + tens.n * 10 + ones.n as number~」(修正前)と「select hundred.n + tens.n + ones.n as number~」(修正後)とでは、10000回実行した場合、ビューの場合では0.18secの差が、テーブルの場合では0.08secの差が出たので(私の環境での話。benchmarkを使用して計測)。

2010年08月08日(日) 22時48分  

1年分の年月日を生成する

1年分の年月日を生成する場合、大抵はExcelを使ったり、プログラムを作って生成しまう場合が多い。

この1年分の年月日をSQLで生成生成する場合は、以下のようなSQL文を発行すれば生成できる。

 /*1年分の年月日生成*/
 select date_format(date_add('20100101', interval(number) day), '%Y%m%d') as yyyymmdd
 from (
   select hundred.n + tens.n + ones.n as number
   from (
     select 0 as n union all
     select 1 as n union all
     select 2 as n union all
     select 3 as n union all
     select 4 as n union all
     select 5 as n union all
     select 6 as n union all
     select 7 as n union all
     select 8 as n union all
     select 9 as n
   ) as ones cross join (
     select 0 as n union all
     select 10 as n union all
     select 20 as n union all
     select 30 as n union all
     select 40 as n union all
     select 50 as n union all
     select 60 as n union all
     select 70 as n union all
     select 80 as n union all
     select 90 as n
   ) as tens cross join (
     select 0 as n union all
     select 100 as n union all
     select 200 as n union all
     select 300 as n
   ) as hundred
 ) as dummy
 where date_format(date_add('20100101', interval(number) day), '%Y%m%d') < '20110101'
 order by yyyymmdd asc;

データベースに接続できる環境ならば、上記のSQL文をプログラムを書くよりも早いかもしれない。

2010年01月09日(土) 23時43分  

Oracleと空文字とNULL

そうか、Oracleは空文字をNULLとして扱うのか……。

なんだか違和感を感じる。

慣れ親しんでいるのは上の図のようなイメージだけど、Oracleの場合は下の図のようなイメージ?

「” IS NULL」がTRUEになるのはちょっと不思議。

使いづらいような気がするけれど、慣れの問題なのかな(苦笑)

2009年12月20日(日) 23時03分  

Excel VBAで簡易SQLクライアントを作成してみた(Excelでデータベースに接続)

ふとExcel VBAを使ったMySQLへの接続を試していないことを思い出したので、試してみることに。というわけで、早速ネットで情報収集を開始。

Excel VBAを使ってデータベースに接続する方法にはいくつかのやり方があるようで、私はそのうちのADOによる接続方法を試してみることにした。

ODBCドライバとデータソースはこれまでの間にすでにインストール&設定済みなので、あとはExcel VBAでコーディングするだけ。とは言え、VBAは今までほとんど書いたことがなかったので、少し時間がかかってしまった。

で、いつもならばselect文を発行して結果が抽出できれば満足して終わりなのだが、Excel上からMySQLのデータベースの更新もできれば便利かもと思い、Excel VBAの勉強を兼ねてさらに試行錯誤すること数時間。

そうしてできたのが、下図のようなもの。

null値を判定できなかったため、null値と空文字(または0)を区別できないが、エラーは一応ちゃんと取得できている(っぽい)。

接続文字列は外部ファイルに定義して、Excel VBAを書き換えなくても済むようにしてみた。接続してみたのはMySQLだけだが、接続したいデータベースのODBCドライバとデータソースをインストール&設定すれば、おそらく他のデータベースでも利用可能だと思われる。

というわけで、とりあえず完成。成果物はこちら

2009年11月13日(金) 23時10分  

SQL*Plus接続メモ

コマンドプロンプトからOracleのSQL*Plusを使ってデータベースに接続する方法のメモ。

sqlplus username/password@host[:port][/serviceName]

デフォルトのポート番号は、1521。

また、ローカル・ネーミングを使って接続する方法は、以下のようになる。

sqlplus username/password@oracle_net

ローカル・ネーミングを使って接続する場合は、ネットサービス名(上記の例ではoracle_net)とそれに対応する接続文字列がtnsname.oraという定義ファイルに格納されていることが前提。

実行ファイルを指定して起動する場合は、

sqlplus username/password@host[:port][/serviceName] @filename.sql

または

sqlplus username/password@oracle_net @filename.sql

となる。

実行ファイルの実行結果のみをリダイレクトしたい場合は、サイレンとモードでSQL*Plusを起動する。

sqlplus -S username/password@host[:port][/serviceName] @filename.sql > result.txt

または

sqlplus -S username/password@oracle_net @filename.sql > result.txt

その他のSQL*Plusの使い方は、SHIFT the Oracleに詳しく紹介されている。

2008年10月31日(金) 23時41分  

ExcelからMSQueryを使ってデータベース(MySQL)に接続する

JavaアプレットでMySQLへ接続する記事からすでに1週間以上経ってしまったが、データベースクエリ(MSQuery)が用意できたので、MySQLへ接続してExcelへデータを抽出してみた。

MySQLからExcelへデータを抽出するまでの一連の流れを動画にしてみた(スクリーンショットを掲載すると、数が多すぎるので……)。

途中、クエリーを発行(上図)した結果が文字化けして返ってきている(下図)が、これは私の環境で動作しているMySQLのデータベースのデフォルト文字コードセットをutf-8に設定しているため。

そのまま無視して「Microsoft Office Excelにデータを返す(R)」を選択すれば、Excelには正常なデータが返却されてくる。

ODBCドライバとMSQueryが用意できれば、結構簡単にMySQLのテーブルを抽出できることがわかった。MSQueryからMySQLのテーブルを更新することも可能。

けれども、ExcelからMySQLに対して動的にクエリーを発行してテーブルのレコードを抽出したり更新したりするにはVBAを使用する必要があるみたいですな。

2008年03月08日(土) 22時40分  

JavaアプレットからDBに接続

帰宅して、JavaアプレットからMySQLのデータベースに接続するプログラムを書いてみる。いや、正しくは先日作成したJavaアプリケーションやJSPのソースをコピーしただけと言ったほうが正しいかも。まずはJavaアプレットから。

package javadb;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.sql.*;

public class DBConnectApplet extends JApplet {
    /**
     *
     */
    private static final long serialVersionUID = 1L;

    private Connection db = null;

    public void init() {
        try {
            //JDBCドライバの読み込み
            Class.forName("com.mysql.jdbc.Driver").newInstance();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void start() {
        String sql_server = "localhost";
        String sql_user    = "hogehoge";
        String sql_pass    = "fizzbuzz";
        String sql_db    = "dbname";
        //String sql_url    = "jdbc:mysql://localhost/" + sql_db;
        String sql_url = "jdbc:mysql://localhost/dbname?user=hogehoge&password=fizzbuzz";
        try {
            //MySQLのデータベースへ接続
            //db = DriverManager.getConnection(sql_url, sql_user, sql_pass);
            db = DriverManager.getConnection(sql_url);

            //目的のテーブルを操作

            //ステートメントオブジェクトの取得
            Statement stmt = db.createStatement();

            //クエリの準備
            String query = "select id, name, address, tel, fax, mail, site, station from company";

            //クエリーを実行して結果セットを取得
            ResultSet rs = stmt.executeQuery(query);

            //テーブルカラムの設定
            String[] tableColumn = {    " id",    "name",    "address",    "tel",    "fax",    "mail",    "site",    "station",    };

            DefaultTableModel tableModel = new DefaultTableModel(tableColumn, 0);
            JTable table = new JTable(tableModel);

            //検索された行数分ループ
            while (rs.next()) {
                Object[] tableData = {
                        String.format("%4d", rs.getInt("id")),
                        rs.getString("name"),
                        rs.getString("address"),
                        rs.getString("tel"),
                        rs.getString("fax"),
                        rs.getString("mail"),
                        rs.getString("site"),
                        rs.getString("station"),
                };

                //テーブルデータをテーブルに登録
                tableModel.addRow(tableData);

                //コンソールにも出力してみる
                System.out.printf("%2dt%st%st%st%st%st%st%sn",
                        rs.getInt("id"),
                        rs.getString("name"),
                        rs.getString("address"),
                        rs.getString("tel"),
                        rs.getString("fax"),
                        rs.getString("mail"),
                        rs.getString("site"),
                        rs.getString("station")
                );
            }

            //スクロールペインにテーブルを登録
            JScrollPane scroll = new JScrollPane();
            scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
            scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
            scroll.getViewport().add(table);

            //スクロールペインをアプレットに登録
            getContentPane().add(scroll);

            //データベースから切断
            stmt.close();

            //MySQLのデータベースとの接続を切断
            db.close();
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

次に、HTMLファイル中のappletタグの部分を抜粋。

<applet height="480" archive="./mysql-connector-java-5.1.5-bin.jar" width="640" code="javadb.DBConnectApplet.class"></applet>

違うのは、JDBCドライバを登録する部分と、データを表示させる部分ぐらいかもしれない。JDBCドライバは、Javaアプレットの場合は<applet>タグに指定する形になる。ちなみにJavaアプレットでは、セキュリティの関係上からDBに接続することはほとんど無い模様。いろいろと制約があるので、確かに不便かも。

データを表示させる部分は、コンソール出力に加えて、アプレットなのでJTableを使用してみた。

コンソール出力の結果はどこで確認出来るかというと、Internet Explolerの場合だと、Javaコンソールで確認出来る。

追記: Javaアプレットからデータベースに接続する (2009/11/08追加)

package javadb;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.sql.*;

public class DBConnectApplet extends JApplet {
/**
*
*/
private static final long serialVersionUID = 1L;

private Connection db = null;

public void init() {
try {
//JDBCドライバの読み込み
Class.forName(“com.mysql.jdbc.Driver”).newInstance();
}
catch (Exception e) {
e.printStackTrace();
}
}

public void start() {
String sql_server = “localhost”;
String sql_user    = “hogehoge”;
String sql_pass    = “fizzbuzz”;
String sql_db    = “dbname”;
//String sql_url    = “jdbc:mysql://localhost/” + sql_db;
String sql_url = “jdbc:mysql://localhost/dbname?user=hogehoge&password=fizzbuzz”;
try {
//MySQLのデータベースへ接続
//db = DriverManager.getConnection(sql_url, sql_user, sql_pass);
db = DriverManager.getConnection(sql_url);

//目的のテーブルを操作

//ステートメントオブジェクトの取得
Statement stmt = db.createStatement();

//クエリの準備
String query = “select id, name, address, tel, fax, mail, site, station from company”;

//クエリーを実行して結果セットを取得
ResultSet rs = stmt.executeQuery(query);

//テーブルカラムの設定
String[] tableColumn = {    ” id”,    “name”,    “address”,    “tel”,    “fax”,    “mail”,    “site”,    “station”,    };

DefaultTableModel tableModel = new DefaultTableModel(tableColumn, 0);
JTable table = new JTable(tableModel);

//検索された行数分ループ
while (rs.next()) {
Object[] tableData = {
String.format(“%4d”, rs.getInt(“id”)),
rs.getString(“name”),
rs.getString(“address”),
rs.getString(“tel”),
rs.getString(“fax”),
rs.getString(“mail”),
rs.getString(“site”),
rs.getString(“station”),
};

//テーブルデータをテーブルに登録
tableModel.addRow(tableData);

//コンソールにも出力してみる
System.out.printf(“%2d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n”,
rs.getInt(“id”),
rs.getString(“name”),
rs.getString(“address”),
rs.getString(“tel”),
rs.getString(“fax”),
rs.getString(“mail”),
rs.getString(“site”),
rs.getString(“station”)
);
}

//スクロールペインにテーブルを登録
JScrollPane scroll = new JScrollPane();
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scroll.getViewport().add(table);

//スクロールペインをアプレットに登録
getContentPane().add(scroll);

//データベースから切断
stmt.close();

//MySQLのデータベースとの接続を切断
db.close();
}
catch (SQLException e) {
e.printStackTrace();
}
}
}

2008年02月29日(金) 23時45分  

データベース接続部分を比較してみた

ふと、自分が扱えるプログラミング言語でデータベースへ接続する部分を比較してみたくなったので、書いてみた。表示のさせ方はそれぞれ異なるけれど、取得しているデータはどのプログラミング言語も同じ。

接続先はデスクトップPC上のMySQLサーバーで、テーブルは去年PHPの勉強で作成したものを利用。

Perl

#!/usr/local/bin/perl

use strict;
use warnings;
binmode STDERR, ":encoding(shiftjis)";
$/ = "\r\n";

use Encode;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
use DBI;

#MySQLの設定
my $sql_server = 'localhost';
my $sql_user   = 'hogehoge';
my $sql_pass   = 'fizzbuzz';
my $sql_db     = 'dbname';

#MySQLのデータベースへ接続
my $db = DBI->connect("DBI:mysql:$sql_user:$sql_server", $sql_user, $sql_pass, {RaiseError => 0, PrintError => 1});

#クエリの準備
my $sth = $db->prepare("select id, name, address, tel, fax, mail, site, station from company");

#クエリーを実行して結果を取得
$sth->execute;
while (my @row = $sth->fetchrow_array) {
    #undef要素があれば、 "null" という文字列を代入(warning回避)
    @row = map {    $_ = (defined($_) ? $_ : "null")    } @row;
    #grep {    $_ = (defined($_) ? $_ : "null")    } @row;    #上の行は、grepを使っても書ける

    print encode("shiftjis", decode("Guess", join("\t", @row))), "\n";
}
$sth->finish;

#データベースから切断
$db->disconnect;

exit;

PHP

<?php
print '<?xml version="1.0" encoding="EUC_JP"?>'."\n";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; Charset=euc-jp" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta name="Robots" content="noindex, nofollow" />
<meta name="Robots" content="noarchive" />

<title>db-connect</title>

<link type="text/css" rel="stylesheet" href="./default.css" />
<link type="text/css" rel="stylesheet" href="./default-style.css" />
</head>

<body>
<h1>db-connect</h1>

<hr />

<table>
<caption>Company List</caption>
<tr>
<th>id</th>
<th>name</th>
<th>address</th>
<th>tel</th>
<th>fax</th>
<th>mail</th>
<th>site</th>
<th>station</th>
</tr>

<?php
$sql_server = "localhost";
$sql_user = "hogehoge";
$sql_pass = "fizzbuzz";
$sql_db  = "dbname";

//MySQLのデータベースへ接続
$db = mysql_connect($sql_server, $sql_user, $sql_pass);

//データベースの選択
mysql_select_db($sql_db, $db);

//クエリの準備
$query = "select id, name, address, tel, fax, mail, site, station from company";

//クエリーを実行して結果を取得
$rows = mysql_query($query, $db);

//データベースから切断
mysql_close();

//検索された行数分ループ
while ($row = mysql_fetch_assoc($rows)) {
    print <<<TEXT_HTML

<tr>
<td>{$row['id']}</td>
<td>{$row['name']}</td>
<td>{$row['address']}</td>
<td>{$row['tel']}</td>
<td>{$row['fax']}</td>
<td>{$row['mail']}</td>
<td>{$row['site']}</td>
<td>{$row['station']}</td>
</tr>

TEXT_HTML;
}
?>

</table>

<hr />

</body>
</html>

JSP

<?xml version="1.0" encoding="EUC_JP"?>
<%@ page import="java.sql.*" %>
<%@ page language="java" contentType="text/html; charset=euc-jp" pageEncoding="euc-jp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; Charset=euc-jp" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta name="Robots" content="noindex, nofollow" />
<meta name="Robots" content="noarchive" />

<title>db-connect</title>

<link type="text/css" rel="stylesheet" href="./default.css" />
<link type="text/css" rel="stylesheet" href="./default-style.css" />
</head>

<body>
<h1>db-connect</h1>

<hr />

<table>
<caption>Company List</caption>
<tr>
<th>id</th>
<th>name</th>
<th>address</th>
<th>tel</th>
<th>fax</th>
<th>mail</th>
<th>site</th>
<th>station</th>
</tr>

<%
    String sql_server = "localhost";
    String sql_user = "hogehoge";
    String sql_pass = "fizzbuzz";
    String sql_db = "dbname";
    //String sql_url = "jdbc:mysql://localhost/" + sql_db;
    String sql_url = "jdbc:mysql://localhost/dbname?user=hogehoge&password=fizzbuzz";

    try {
        //JDBCドライバの読み込み
        Class.forName("com.mysql.jdbc.Driver").newInstance();

        //MySQLのデータベースへ接続
        //Connection db = DriverManager.getConnection(sql_url, sql_user, sql_pass);
        Connection db = DriverManager.getConnection(sql_url);

        //ステートメントオブジェクトの取得
        Statement stmt = db.createStatement();

        //クエリの準備
        String query = "select id, name, address, tel, fax, mail, site, station from company";

        //クエリーを実行して結果を取得
        ResultSet rs = stmt.executeQuery(query);

        //検索された行数分ループ
        while(rs.next()){
%>

<tr>
<td><%= rs.getInt("id") %></td>
<td><%= rs.getString("name") %></td>
<td><%= rs.getString("address") %></td>
<td><%= rs.getString("tel") %></td>
<td><%= rs.getString("fax") %></td>
<td><%= rs.getString("mail") %></td>
<td><%= rs.getString("site") %></td>
<td><%= rs.getString("station") %></td>
</tr>

<%
        }

        //データベースから切断
        stmt.close();

        //MySQLのデータベースとの接続を切断
        db.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
%>

</table>

<hr />

</body>
</html>

Javaアプリケーション

import java.sql.*;

public class DBConnect {
    public static void main(String[] args) {
        String sql_server = "localhost";
        String sql_user    = "hogehoge";
        String sql_pass    = "fizzbuzz";
        String sql_db    = "dbname";
        //String sql_url    = "jdbc:mysql://localhost/" + sql_db;
        String sql_url = "jdbc:mysql://localhost/dbname?user=hogehoge&password=fizzbuzz";

        try {
            //JDBCドライバの読み込み
            Class.forName("com.mysql.jdbc.Driver").newInstance();

            //MySQLのデータベースへ接続
            //Connection db = DriverManager.getConnection(sql_url, sql_user, sql_pass);
            Connection db = DriverManager.getConnection(sql_url);

            //目的のテーブルを操作

            //ステートメントオブジェクトの取得
            Statement stmt = db.createStatement();

            //クエリの準備
            String query = "select id, name, address from company";

            //クエリーを実行して結果を取得
            ResultSet rs = stmt.executeQuery(query);

            //検索された行数分ループ
            while (rs.next()) {
                System.out.printf("%2d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
                    rs.getInt("id"),
                    rs.getString("name"),
                    rs.getString("address"),
                    rs.getString("tel"),
                    rs.getString("fax"),
                    rs.getString("mail"),
                    rs.getString("site"),
                    rs.getString("station")
                );
            }

            //データベースから切断
            stmt.close();

            //MySQLのデータベースとの接続を切断
            db.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

こうしてみると、JavaアプリケーションとJSPはデータを表示させる部分が異なるだけで、データベースへ接続する処理は全く同じなのがわかる。異なるのは、JSPの場合はJDBCドライバを所定のディレクトリに用意しておくぐらい。

PHPはphp.iniの設定でデータベースを扱えるように変更、PerlはDBIモジュールとDBD::mysqlモジュールをuseすれば、それぞれデータベースにアクセス出来るようになる。

本当はRubyとExcelでも試してみたかったのだが、Rubyはまだ習得出来ておらず、またExcelはMyODBCは用意出来たのだが、データベースクエリが用意出来なかったので、今回は割愛。

今回試した中では、一番手軽にデータベースへ接続出来たのは、Perlだった。なんと言ってもモジュールさえ利用出来れば、接続出来てしまうというのが理由。

その次は、PHP。設定が必要だが、一度設定してしまえば、あとは関数をコールするだけというお手軽さ。実行速度の面もPerlと並んで申し分ない。

残るJSPとJavaアプリケーションは、コードの再利用性という面では一番かもしれないけれど、接続出来るようにするまでの手間は微妙、実行速度は早いと思う。

以上、独断と偏見に満ちた、私の環境での比較結果。

また時間が出来たら、次回はRubyとExcel、Javaアプレット等からデータベースへ接続できるかどうかも試してみたい。

2008年02月24日(日) 23時50分