MySQL5.1でFEDERATED TABLE

テーマ:
MySQL5.1にてFEDERATED TABLEを使ってみました。
詳しくはMySQLのリファレンスを参照デス
リファレンスはコチラ→http://dev.mysql.com/doc/refman/5.1/ja/federated-create.html

さて、FEDERATED TABLEとは端的に言うとOracleのDB LINKのようなものです。
HOST1とHOST2があって、今回はHOST1に実データを持ったテーブルがある仮定で、HOST2からHOST1のテーブルを参照するようにしてみます。

まず、FEDERATED TABLEを使うためには、HOST2がFEDERATEDエンジンをサポートしている必要があります。
FEDERATEDエンジンはMySQL5.0以降から。
HOST1は、FEDERATEDエンジンをサポートしている必要はないそうです。

HOST1では、リンクされる(実データを持っている)テーブルを作成します。
エンジンは何でもいいようですが、今回はInnoDBで実験してみました。

まずは、リンクされるテーブルの作成。これは普通にテーブルを作るだけです。
CREATE TABLE HOST1.link_table(
ID VARCHAR(4)
,COL1 VARCHAR(256)
)ENGINE=InnoDB
DEFAULT CHARSET=sjis
;

次に、FEDERATED TABLEの作成
CREATE TABLE HOST2.federated_table(
ID VARCHAR(4)
,COL1 VARCHAR(256)
)ENGINE=FEDERATED
DEFAULT CHARSET=sjis
CONNECTION='mysql://[user]:[password]@[hostname]/[database]/[table]
;
[]の中身はそれぞれ
 user:接続するためのユーザID
 password:接続するためのパスワード
 hostname:接続先ホスト名
 database:接続先データベース名
 table:接続先テーブル名
となっています。

SELECT * FROM federated_table で、CONNECTIONで指定したテーブルが参照できるようになりました。

ちなみに、もうひとつ、CREATE SERVER構文を使って、あらかじめコネクション用の定義を用意しておく、という方法もあるようです。

まだ実験段階なので、気になることが少々。
1.HOST1とHOST2で定義が違ってもOKなのか?
2.CREATE SERVERを使ってみる

また、FEDERATED TABLEの制限事項として
・トランザクションをサポートしていない
・ALTER TABLE、DROP TABLE等、定義を変更するようなSQLは発行不可能
等等、あるようです。

ORACLEとは違ってテーブル単位のリンクなので、ORACLE→MySQLと使ってくると若干違和感がありました。

気になることはまた追記します。
AD

VB.NETとMySQLで画像処理

テーマ:
VB.NETとMySQLを使って、画像の格納・参照をしてみました。
環境はVisualStudio2005、MySQL5.1です。

まず、MySQLで画像を格納するには、BLOB型の、MEDIUMBLOBを使って、バイナリデータとして格納します。

まずはテーブルの作成。
CREATE TABLE test_table(
IMG_ID char(4) NOT NULL
,IMG1 MEDIUMBLOB
)
普通にInnoDBでOKでした。MyISAMは試していません。
BLOB型を扱いやすくした(?)エンジンがプラグインで作られているらしい。
ここを参照

で、VB.NETから画像を格納してみる。(SQLオンリーでは不可能みたいです)

Dim con As New MySqlConnection
con = OpenConnection 'コネクションのオープン。

Dim sql As String
sql ="INSERT INTO test_table( "
sql+=" IMG_ID "
sql+=" ,IMG1 "
sql+=") VALUES ( "
sql+=" '0001' "
sql+=" ? "
sql+=")"

'SQLコマンド設定
Dim cmd As New MySqlCommand(sql,con)
'パラメータ(画像のバイナリデータ)を追加
cmd.Parameters.Add("?",MySqlDbType.Blob).Value = System.IO.File.ReadAllBytes(画像のフルパス)

cmd.ExecuteNonQuery

System.IO.File.ReadAllBytesで、画像のパスを指定するとByte型でバイナリデータを取得できるので、取得したバイナリデータをDBへ格納することでINSERTは完了です。

MySQLQueryBrowserでも、BLOB型の中身を参照することが可能でした。

参照は、

Dim con As New MySqlConnection
con = OpenConnection

Dim sql As String = "SELECT * FROM test_table"
'SQLコマンドの設定
Dim adapter As New MySqlDataAdapter(str,con)
Dim dt as New DataTable '取得したデータ格納用
'データの取得
adapter.Fill(dt)

'画像のバイナリデータをByte型配列として取得
Dim binaryText as Byte()
binaryText = Ctype(dt.Rows(0).Item("IMG1"),Byte())

'バイナリデータを画像に変換
Dim imgConv As ImageConverter()
Dim img As Image = Ctype(imgConv.ConvertFrom(binaryText),Image)

PictureBox1.Image = img 'ピクチャーボックスに表示

以上で、Image型変数のimgにバイナリから変換した画像が入っているので、PictureBoxなり、DataGridViewのImage型のカラムなりに格納してやればOKでした。

BLOB型ということで、カラム自体の容量が結構大きいので、DBには画像へのパスだけ持っておいて、画像は別の場所に置く方法も検討した方が良い感じでした。
負荷テストとかはしてないので不明です。後日やってみようと思いました。
AD

SQLの長さ

テーマ:

最近、コメントスパム、トラックバックスパムが増えてきましたねー

自分だけか?


今日はがつがつとSQLを組んでおりました(Oracle9i)。


職場の人に「プログラムみてー」って言われたけど気にしない!



サブクエリを乱立して(200個くらい)、横並びでデータを出すようなSQLを組んでたのですが

どうも、妙なところでSQLエラーが出る。

内容も

ORA-00936:式がありません。 が出るので、そこを修正してやると

ORA-00923:FROMキーワードが指定の位置にありません。


今度はおまえか!

そこを直すと

ORA-00936:式がありません。 のエンドレス。


SQL自体が長すぎなのだろうか と思って削ってみると出なかったので、なんかの文字制限がある様子。


でもネットで調べた限りでは文字制限ないような・・・?

スクリプトをテキストファイルに落として SQLPLUS実行時に、@フルパス でやるとうまくいくかも って記事を見つけたので明日試してみることに。



とりあえず、長すぎるSQLはよろしくないようです。

AD

前に書いたオートメーションエラー。


結局よくわからなかったので、VB(6.0)からExcel出力する関数を作りましたよっと。




で、今回はOracleバージョンについてのメモ。


バージョンが3パターン。

Oracle 8i(8.1.0)

Oracle 9i(9.2.0)

Oracle 10g(10.1.0)


で。

実テーブルが8iと10gにあって、マスタが10g・トランデータが8iにあって。

8iと10gを結合したら、データの中身は合ってるはずなのに、データが落ちる。



ので、9i→8iの実テーブルにSYNONYMはって、10gと9iを結合したらうまくいった。


バージョンの違い?

頼むぜOracleさんよ・・・。



多分、これのほかにもバージョンが違いすぎると色々不具合でるっぽい。

オートメーションエラー

テーマ:

環境:VB6.0

Oracle9i

Spread6.0


SpreadのメソッドでExportToExcelっていうEXCEL出力のものがある。


この子がオートメーションエラーで落ちよります・・・。

メモってないのでエラーコードは忘れましたが・・・。


281・・・なんとかっていうようなエラーコード。

内容は

起動されたオブジェクトはクライアントから切断されました。



さくっと調べてみた。

1.EXCELプロセスの多重起動?

2.Oracl Object for OLE(oo4o)のエラー?

3.Spreadのバージョン?(3.0だと不具合があるらしい)

4.dll、ocxで、レジストされてるバージョン?



1・2・3は調べてみた。

EXCELプロセスは起動してないので、違う。

oo4oは使ってない(ADO接続だった)ので、違う。

Spreadのバージョンによる不具合ではなさそう(6.0だし)



あとはマイナーバージョンでも確認してみるしかないか・・・。


ネットで検索したら結構悩んでる人が多かったので、事例自体はあるのに、解決策が出てこない・・・。


最悪、EXCEL出力だけ別関数で組むかー?

説明の難しさ

テーマ:

説明というか、新人に理解させるのは非常に難しい。

わからないことも理解してもらわないといけない・・・・。


仕事の話をしていても、やってほしいことがステキに伝わってません・・・!

わからないのにわかりましたっていうな(゚Д゚)


とりあえず愚痴はここまで。



今日はORACLEに苦しんだ。

うちのシステムは種々の理由で8i・9i・10gが共存してる。


10gは某企業に委託して開発してもらったシステムなんですが

NCLOBなんてワケノワカラナイ型を使ってくれたせいで、8i・9iと互換がない・・・。


これ普通にINSERTできるのか・・・?

UPDATEも怪しいのでは・・・。



そもそも、現場で使ってるソフトがNCLOB対応してねぇぇぇーっ(゚Д゚)


色々勘弁してくださいorz




またこっから愚痴w



こっちの説明も悪いかもしれないけどさぁー。

テーブルスキーマなんて聞かずに理解できるわけねーだろっ。


サーバ名がわかりませんって・・・。

サーバ名の調査はお願いしてません。



人の話はよく聞きましょう・・・。


理解できなければ。その場で聞き返しましょう・・・。


後から聞かれる身になって考えてください。

ソースの組み方

テーマ:

趣向を変えようかと。(ブログの


Myメモ的な使い方でもしてみようかと。

Google検索とかで、技術系の人の参考にでもなれば是幸い。


でも、あくまで自分のメモ・x・



新人のソースを見てて思う。

自分で 長い と自分でわかってるなら処理ごとに関数化してくれ、と。


TrueかFalseで処理分ける関数作ったほうがソース見やすいでしょ・・・。メンテもしやすいし。


時と場合によるんだろうけど、VBで1つのプロシージャで100行以上あるってどうなの・・。



とりあえず、ぱっと見ただけで5つとか指摘すべき点が見つかるソースは直さないとまずいでしょ・・・。


まぁ、入った当初と比べれば格段にマシなソースを組むようになったから成長はしてるんだろうけど、今ひとつなぁ。

自分の組んだソースくらいは人に説明できるようにしておいくれよ・・・。


久しぶりの日記。

テーマ:

まず、更新滞ってすいません。

色々忙しかったもので。


ネタもなかったし。


よっし~さんコメントありがとうございますー。



私は訪問した記憶がないですが、知らぬ間にどこかのリンクをたどっていったのかも(笑)




更新してなかったので、近況報告ということで・・・。


ただいま、通勤片道2時間~2時間半のところに通勤しています。

いや、キツイ・・・。


残業あるとさらにキツイ・・・。


仕事自体はそこまできつくないのに、仕事の後帰るのに疲れる。



9月末でおわりだー!


と思ってたら10月からまた通勤片道2時間・・・。




殺す気か、上司よ・・・。


もっと近いところであるじゃないかー・・・・。




そんな感じの朔太郎です。


ってか、プログラマーっぽい仕事がしてぇー。

工場で立ちっぱなしなんていやだよ(笑)



下っ端だからって、これはないんじゃないの・・・・

最近多いけどバトン。

テーマ:

バトンに意味があるのかないのかはわからないけど、見ちゃったのでやってみる。


■まず始めに高校名は?

愛知県のどっかの高校


■何科でしたか?

情報技術
 
■この高校に入るためにしたことは?

何もしてないなー


■制服は?

学ラン。紺のストライプ
 
■何で通ってた?

自転車と電車。たまにバス。


■部活はなんでしたか?

入ってなかった。
 
■バイトはなにをしていましたか?

マクドナルドと焼き鳥屋


■一番好きだった先生は?

好きな先生がいません。


■一番好きだった教科は?

敢えて挙げるなら 体育。一番ラクだった
       
■一番好きだった場所は?

オープンテラス。秋くらいが涼しくて最高。
 
■一年生のときの思い出は?

中退しかけたこと。


■二年生のときの思い出は?

修学旅行かな・・・。


■三年生のときの思い出は?

いろんな奴と仲良くなったこと。今でもよく遊ぶ。
  
■高校のときのマイブームは?

ドラム?


■高校のときのあだ名は?

まっちゃん とか。一人だけ朔太郎って呼んでる人もいたなぁ(笑)


■高校時代の友人に一言!

暇だったらまた遊びに行きます。


■一年、二年、三年でのクラスを教えてください。

んー 覚えてない。


■主にどんなことを勉強していましたか?

シスアド。あとは趣味でプログラムを少々


■高校時代に取得した資格を教えてください。

第二種電気工事士
危険物乙種第1・2・4・6・類
情報技術検定2級
計算技術検定3級
初級シスアド
 
■取っておけばよかった!と思う資格ありますか?

原付と基本情報


■テストでの順位は?

トップ5以内


■クラスで何番目に頭良かった?

真面目に勉強してないからわからんけど、順位的にはトップ5以内でしょ?


■休み時間は何をして過ごしていましたか?

寝たり話したり。
 
■休み時間でした失敗は?

寝たこと?もっといろんな奴と話せばよかった。


■放課後はどう過ごしていましたか?

即帰宅。たまに遊ぶか、バイト。


■高校時代の最大の自慢を教えてください。

なんだろう・・・。ないかも。


■高校時代の最大の汚点

世間知らずだったこと。


■恋はしていましたか?

男子校ってこともあって、恋愛はなかった。


■中学と高校は何が違いましたか?

色々変わりました。
特に周りの人が自分に対して先入観がなかったから付き合いやすかった。(いい意味で。仲良くなりやすかったってこと)


■きらいな先生はいましたか?いたらあだ名も教えてください。

いっぱいいすぎてあげられないなぁ。


■高校のときのきらいな友達のイニシャルを教えてください。

あまり嫌いな奴はいなかった。
生理的に嫌な奴はいたけど。


■高校生活は充実していましたか?

それなりに。
 
■高校生に戻りたいですか?

戻りたいなー


■高校のときに戻れたら最初に何をしますか?

いろんな奴としゃべる。
あとは、遊ぶ。


■高校のとき付き合ってた人から電話が来ました…一言どうぞ。

付き合ってた人いませんから。


■仲間内での自分のキャラはどんなんでしたか?

真面目で頭いい奴と思われてたんじゃないの?
特に意識したことないし、意識する必要もない。