Archive for the ‘技術集シリーズ’ Category

Oracle日付をWHEREに指定する方法

木曜日, 6月 9th, 2011

WHERE句で、条件指定する値の側にもTO_DATEは付けられるのね。。。
基本を知っていれば分かりそうなものだが、
いざとなると書けないので覚書。

SQL> SELECT * FROM plan_table
WHERE timestamp > TO_DATE(‘2011/06/03’, ‘YYYY/MM/DD’)
ORDER BY timestamp;

ちなみに、時刻まで指定したければ

SQL> SELECT * FROM plan_table
WHERE timestamp > TO_DATE(‘2011/06/03 00:00:00’, ‘YYYY/MM/DD HH24:MI:SS’)
ORDER BY timestamp

ちなみに、今日のデータを対象にしたければ

SQL> SELECT * FROM plan_table
WHERE timestamp > TO_DATE(TO_CHAR(SYSDATE, ‘YYYY/MM/DD’), ‘YYYY/MM/DD’)
ORDER BY timestamp

#SYSDATEを使っている時点で、今日以降のデータなんてあり得ない。
 不等号を使っているので、今日以降という言い方ができるがあえて、
 今日のデータと表記した。

個人情報の一部をマスクするSQL

日曜日, 5月 29th, 2011

電話番号の一部をマスクして更新する。
03-1111-1111のようにハイフンつき12桁を想定。

SQL> UPDATE 顧客マスタ set 電話番号 = substr(電話番号, 0, 8)||’****’;
10行が更新されました。

電話番号の一部をマスクして表示する。
03-1111-1111のようにハイフンつき12桁を想定。

SQL> SELECT SUBSTR(電話番号, 0, 8)||’****’ AS 電話番号 FROM 顧客マスタ;

電話番号
——————————————————————————–
03-1111-****
03-2222-****
052-111-****

[参考]
Oracle Technology Network (OTN) Japan – 掲示板:項目の指定の一部のみをupdateする方法

ORA-01114

木曜日, 5月 5th, 2011

ORA-01114: ファイル***(ブロック番号*)への書込みI/Oエラーが発生しました。
ORA-27072: skgfdisp: I/Oエラーが発生しました。
Linux Error: 28: No space left on device

SELECT文を流したときにこんなエラーが発生しました。

ググッて見る。


「ORA-01114: ファイル***(ブロック番号*)への書込みI/Oエラーが発生しました。」
について

こんな資料が見つかりました。
Oracle9iデータベース・エラー・メッセージ, リリース2(9.2) ←PDFです。
Oracle9iデータベース・エラー・メッセージ, リリース2(9.2) ←PDFです。
2011/08/31 リンク切れのため修正

3-32ページより該当部分を抜粋

ORA-01114 ファイル string(ブロック番号 string)への書込み
I/O エラーが発生しました。

原因 : ファイルが保存されているデバイスが、
オフラインになっている可能性があります。
そのファイルが一時ファイルの場合、
そのデバイスは領域不足である可能性があります。
これは、一時ファイルのディスク領域が、
ファイル作成時に割り当てられるとはかぎらないために
発生する場合があります。
処置処置処置処置 : デバイスへのアクセス権限を
正しく設定するか、または不要なファイルを削除して、
領域を解放してください。


Linux Error: 28: No space left on device

「No space left on device」の対応
ディスク空き容量が無くなっていました。

df -hでチェックしたら、
Oracleテンポラリで使用しているパーティションと同じところが
100%になっていました。

・テンポラリの場所を確認

SQL> select NAME from v$tempfile;
NAME
——————–
/u01/TEMP01.dbf

・容量を確認
[root@localhost root]# df -h
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/*** 20G 19G 0 100% /u01

※一部情報を削っています。

u01が100%になっていました。


SQLチューニングで参考になったサイトをメモ

水曜日, 4月 27th, 2011

SQLチューニングで参考になったサイトをメモ

■SQL単位の実行時間を計測する
SQL> set timing on
SQL> ここで、計測したいSQLを流す。
止めたくなったら
SQL> set timing off

参考
SQLの実行時間を表示する
■INよりEXISTSのほうが早いことが多い
SELECT ~ FROM emp
WHERE EXISTS (
SELECT * FROM emp2 WHERE emp.id = emp2.id)

EXISTS句でつかうSELECTの次は、アスタリスクが有効らしい。

参考
2つの副問い合わせの違い IN 条件か EXISTS 条件か
OracleのEXISTS句で質問です。 EXISTSの後のSELECT文で…

■FROM句の記述順序
 レコードが多いテーブル順に記述する。

■WHERE句の記述順序
 レコードが少ないテーブル順に記述する。

参考書籍として
プログラマのためのSQL
(ジョー・セルコ 著 秋田 昌幸 訳 ピアソン・エデュケーション 発行)
があります。
この本のポイントが、
SQLを速くするぞにまとめられていて、この本を読む前に予備知識として参考になった。

OracleからMySQLへの移行にともなうWebシステム修正

水曜日, 1月 26th, 2011

OracleからMySQLへの移行に伴い、
アプリの修正をしています。
ローカルPCでEclipseを使って開発しています。


データ移行

「MySQL Migration Toolkit」を使いました。
(ダウンロード先はこちら

参考
OracleからMySQLへのデータ移行手順

同ツール起動後、
Initialized Java loaderエラーになってしまったので
> MySQLMigrationTool.exe -debug
で解決。
※事前に、
 MySQLMigrationTool.exeの存在するフォルダに
 移動しておくことが前提。

参考
MySQL Migration Toolkitを使用してのOracleからの移行 その2


「No suitable driver found for jdbc~」エラー発生
MySQLドライバがない?らしい。

参考
Java, Servlet: No suitable driver found for “~” の原因と解決法

そこで、JDBCドライバを入手(入手先はこちら
mysql-connector-java-5.1.14.zip を
ダウンロードしてきました。
そして、解凍したもののうち
「mysql-connector-java-5.1.14-bin.jar」を
libディレクトリに置きました。

参考
JDBCドライバの取得(MySQL用)

無事解決しました。


シェルスクリプト 最初の1文字を取得したい

水曜日, 10月 27th, 2010
[testuser@localhost ~]$ TEST=12345
[testuser@localhost ~]$ echo ${TEST:0:1}
1

参考
処理系コレクション:Linux:bash

主キーと候補キー

日曜日, 4月 11th, 2010

応用情報技術者試験の追い込み中。
自分での大きな勘違いを発見したので
防備録として投稿します。

関係データベースの候補キーの説明として、適切なものはどれか。

ア 値を空値(ナル)にすることはできない列又は列の値
イ 検索の高速化のために、属性の値と対応するデータの格納位置を記録した列又は列の組
ウ 異なる表の列の値として存在しなければならない列又は列の組
エ 表の行を唯一に識別できる列又は列の組

正解:エ
(データベース試験 平成14年度 春 問23)

私の解答は、アでした。
エは主キーのことと思っていましたが、厳密には異なるようです。

候補キーとは、表の中でユニークなもの。
主キーとは、いくつかある候補キーの中から1つ選んだもの。

例としては、都道府県表を考える。
都道府県コード、都道府県名、...
現状、同一都道府県名は存在しないので、
都道府県コード、都道府県どちらでもユニークになる。
よってこの場合の候補キーは、「都道府県コード」と「都道府県名」
そして、この候補キーから一つ選んだものが主キー。
都道府県名は変更されることもあり得るので、変更される可能性のない
「都道府県コード」を主キーとして採用する。
という意味と解釈しました。

なるほど。というわけで、来週の試験でこの問題が出たらいいな。
※あくまで私の見解なのでご了承ください。

参考
候補キー(ウィキペディア)
主キー(ウィキペディア)

Oracleでテーブル名変更時の罠?

木曜日, 12月 3rd, 2009

PHP+Oracleのシステムの保守を担当して約1年が経ちました。
今までは主にpostgreSQLでしたので、違いに苦しみながら
またひとつ罠にかかりそうになりました。

それはテーブル名を変更です。

テーブル名を変更するには下記でできます。

ALTER TABLE 変更前テーブル名 RENAME TO 変更後テーブル名;

しかし、インデックスや主キーなど各種制約は変更されません。

そこで、制約を直すのも手ですが、忘れると嫌なので
オブジェクトブラウザで現在のSQLをコピーして
テーブル名だけ変えて、新しく作ったほうが簡単かな、と思ったりしました。

新しく作った後で、古いテーブルからデータをコピー

INSERT INTO 古いテーブル名
SELECT * FROM 新しいテーブル名;

古いテーブルを削除

DROP TABLE 古いテーブル名;

ちなみに、ひとつひとつ直していく方法もメモしておきます。

主キーを追加する。

ALTER TABLE テーブル名
ADD [ CONSTRAINT 主キー名 ]
PRIMARY KEY (列名1, 列名2 ..) ;

主キーを削除する。

ALTER TABLE テーブル名
DROP PRIMARY KEY;

新しいテーブルに対して
主キーを追加して、古いテーブルに対して、主キーを削除する。
という手順です。

■参考にさせていただいたサイト
テーブル定義の変更(列の追加、変更、削除) – オラクル・Oracle SQL 入門
(上記サイトのトップページ:SHIFT the Oracle )

第4回PHP懇親会発表のフォローアップ

金曜日, 11月 20th, 2009

PHP懇親会での私の発表へのご意見と
私の考えを入れたフォローアップを掲載いたします。

発表資料を含んだ記事はこちら

————————————————–
■Oracle
postgreSQLのようなpg_escape_string()が無い中
どのような方法を使っていますか?

・(私が発表したbindを使うことに加えて)
バリデーションをすること。
→入力値であれば、想定値があると思うので
チェックして、どこがおかしいのか画面に表示する。
たとえば、郵便番号なら数字とハイフン以外NGで
間違って全角を使っていたら画面に表示することで
ユーザもどこを修正したらよいか分かる。
・PDOライブラリを使う。
→PDOとは PHP Data Object の略。
PHP 5.1から実装された、
新しいデータベース抽象化のためのクラス。
各データベースに対して固有のPDOドライバを用意することで、
共通のAPIを用いたデータアクセスを可能にしつつ、
ネイティブドライバに近い高速な処理を実現している。
http://www.weblio.jp/content/PDO より

PDOでは主要なDBが使えるので、組み込まれている関数を使えば
割と簡易にSQLインジェクション対策ができそうです。

PHPマニュアルにも解説がありますね。
————————————————–
■フレームワークのよさは?

・フォームの入力チェックなど良く使う処理が
簡易に書ける。pg_escape_string()などの処理も
ミスや漏れが無く、全てに適用できる。
・学習期間は必要だが、2回目以降に生きてくる。
→初期投資と考えれば、
フレームワークに限ったことではありませんね。

・Cake PHPについて、動画が公開されています。
Cake PHP ハンズオン
私も時間を見つけて少しずつ見ています。
————————————————–
■フラグの型は何型?
例:削除フラグ 1は数字型?文字型?

・TINYINT これはINTとは違う。
CHAR型と幅は同じ。C言語的な発想。メモリの節約になる。

[TINYINT]1バイト、-128~127
[INT]4バイト、-2147483648~2147483647

参考
int(1)とtinyintについて

tinyint

————————————————–
■変数の命名について

・少なくとも自分の中では、方法を統一しておくべき。
・変数名は、DBのカラム名にあわせたほうが良い。

まずは自分なりのポリシーを持つことですね。
メンバで開発する場合は、お互いに話し合って
規約を統一することも必要になると思います。

代表的なものに
ハンガリアン記法
また、Pearのドキュメントにコーディング規約もあります。
ここの第4章内が命名規約

これらの多くの方が見ていると思うのもを参考に
自分なりの方法にアレンジしていくのが良さそう。
————————————————–
■エラー判定、変数比較

戻り値からエラーかどうか判定する手法ですが
あくまで処理で何が戻ってくるか、によりますね。

true or false と決まっているなら
falseをエラーにすればよい。

厄介なのは、数字が戻る可能性があったら
0は正なのか?
その辺を踏まえたうえで
emptyで比較する、というご意見もいただきました。
————————————————-

第4回PHP懇親会に参加しました。

日曜日, 11月 15th, 2009

第4回PHP懇親会に参加しました。

勉強会は初参加でしたので、参加しようか非常に迷いましたが
参加してよかったと思います。

まずは、OSCなど大きなイベントに参加して
セッションを聞く側でしたので、吸収することは多かったのですが
自分から発信するには敷居が高い気がしていました。

今回参加する決め手になったのは、
全員発表すること、ということで、自分の開発のスタイルと
気になっていることの質問形式で進めました。

皆さんから多くの意見をいただいたので、
さらに勉強して、フィードバックできればと思います。

この場を借りて、皆様にお礼申し上げます。
ありがとうございました。

昨日の発表資料です。
第4回PHP懇親会発表資料20091114