MySQLの最新バージョン5.6がついにリリース!!! http://nippondanji.blogspot.jp/2013/02/mysql-56-mysql56.html 今回のバージョンアップは、目立った機能追加は無くて、性能の改善が中心のようです。 ・オプティマイザの改善 ・レプリケーションの改善 ・InnoDBのパフォーマンス改善 前回の5.5リリースが2010年12月だったから、2年ぶりのバージョンアップ。 MySQLはマイナーバージョンアップであっても、ガッツリと性能アップしてくるんで楽しみですな。 ミドルウェアのバージョンアップでワクワクするのはMySQLさんぐらいやでー。 test.png
PostgreSQL ver 8.4 で動作済み

以下のように数字が入っている文字列を昇順・降順したいと思います。

 例 )
  jaswill1
  jaswill2
  jaswill3

【文字列ソート】

 ORDER BY
    TO_NUMBER ( SUBSTRING ( USR_ID FROM ‘[0-9].*$’ ) , ‘[9]’ ) , USR_ID


ORDER NY句に記述されている「SUBSTRING」で部分文字列(後ろの‘[9]’)を取得し、

「TO_NUMBER」で数値に変更しています。FORM句では条件に該当するものを取得します。

あとは昇順か降順かをORDER BY句に追記するだけです。




あと、よくあるのが重複チェックですね。

せっかくなので、メモメモ φ(。。)



【重複データ取得】————————————————————–

 SELECT
    A.USR_ID AS USR_ID
 FROM
    TABLE_A A
 WHERE
    A.DELETE_FLG = 0
 GROUP BY
    A.USR_ID
 HAVING
    COUNT ( A.USR_ID )  >  1 
—————————————————————————————



 っで、↑コレを【文字列ソート】と組み合わせると・・・



【重複データの文字列ソート】————————————————

 SELECT
    A.USR_ID AS USR_ID
 FROM

    TABLE_A A
 WHERE

    A.DELETE_FLG = 0
    AND

    EXISTS
    (  SELECT
         AA.USR_ID AS USR_ID
     FROM

         TABLE_A AA
     WHERE

          AA.USR_ID = A.USR_ID
     GROUP BY

                    AA.USR_ID
     HAVING

                    COUNT ( AA.USR_ID )  >  1
    )
 ORDER BY
     TO_NUMBER ( SUBSTRING ( A.USR_ID FROM ‘[0-9].*$’ ) , ‘[9]’ ) , A.USR_ID
    ,A.USR_ID DESC(ASC)

—————————————————————————————

・・・雑だけど気にしない。

これで、重複した文字列をソートできます。

分かりやすいように、ナンバー(No)とかつけると、順番になっている事が分かりやすいと思います。

ちょっとした備忘録です。
こんにちは、Mizutaniです。

PostgreSQLで正規表現ができることをネットで調り、さっそくトライ!
したのですが、検索の仕方が悪かったのか、日本語交じりだとうまくいきませんでした。
なので、基礎的な正規表現の例を紹介します。
ちなみにバージョンは PostgreSQL 8.4です。


◆正規表現はPostgreSQLで用意されているものを用います。

SELECT * FROM table_a WHERE id ~ ‘[0-9]+’;

これを応用します。



◆半角英数字も問題なくチェックできます。

SELECT * FROM table_a WHERE id ~ ‘[0-9a-zA-Z]*’;




◆ただし、このままだと日本語が混じった文(abcあd)は判断できなかったので修正。

SELECT * FROM table_a WHERE id ~ ‘^[0-9a-zA-Z]*$’;


これで半角英数字のチェックはできると思います。
意外と簡単にできますね。


◆ちなみに、
~ (チルダ)は必ずパターンの先頭に書きます。
先頭以外に配置してしまうとリテラルとして解釈されるので注意。
あと は行の終わりを意味します。

以上です。

Oracle11gの罠

こんばんわ。くまぜみです。

 

昨日からの台風で、名古屋は100万人避難勧告がでたり

電車が止まったりで・・・。

 

本日、ユーザ様から電話がありました。

「データベースへ接続できません。ってでるんだけど」

 

何も変更してないことを確認。

まずはOSのリブート。復旧しない。

 

リモートサポートができないユーザ様だったので大変。

アラートファイルを送ってもらったり、サービスの起動状況を確認してもらったり。

 

Oracleは、正常に動作しているっぽいなぁ。

アプリ側の設定も確認。特に異常なし。なんでだ。

 

ユーザ様には申し訳ないが、Sqlplusで接続確認をお願いした。

「ORA-28001って出てますね。」

 

あまり聞いたことがないエラーだな。

 

インターネットで検索すると、大量にヒット!

 

Oracle11gから、デフォルトのユーザプロファイルでパスワードの有効期限が180日になっているとのこと。パスワードを無期限にするには、以下の手順を実施。

(ユーザ様に、sqlplusにて実施をお願いとは、申し訳なかった・・・。)

1.sqlplus sys/<パスワード> as sysdba
2.alter profile default limit password_life_time unlimited;
3.alter user <ユーザID> identified by <新パスワード>;
4.alter user <ユーザID> account unlock;

 

再度システムへログインできるかの確認を依頼。

(結果をビクビクしながら待ってました。)

 

「つながりました。」とユーザ様のお声。

 

ほっとしました。

解決するまでに、2時間程度かかってしまいました。

 

勉強しておかないとね。。。

Oracleバックアップの覚書2

mogeraです。

Oracleバックアップについての覚書その2

エラーコード:ORA-00600とは
SI ObjectBrowserのデータ生成ツールを使ってテストデータを10万件ほど生成しているときに発生。

固有のエラーコードがない内部エラーはこれで出力されるそうです。いわゆる「不明なエラー」なので発生する状況は様々。
マニュアルにはサポートに問い合わせるように、といったことが書かれています。
http://download.oracle.com/docs/cd/E16338_01/server.112/b56318/e0.htm#sthref17

そういうわけにもいかないので手順をさかのぼってエラー再現性を探ってみました。
どうやら今回の場合は表領域の空きが不足したのが原因のようです。
使用していたUSERS表領域を拡張したら成功しました。

データファイル:USERS01.DBF
ファイルサイズ:10MB⇒100MBに拡張
AUTOEXTEND:1MB

自動拡張するから大丈夫、と考えていたのが拙かったようです。
ではどれぐらいの領域を確保すればいいのか。
簡単に1行当たりのデータサイズを調べます。
列ごとの平均バイト数を合算して行のサイズとします。

表:TESTには10万レコードをランダム生成しての結果。
SELECT ROUND((AVG(VSIZE(ID))
+AVG(VSIZE(TESTNAME))
+AVG(VSIZE(CREATEDATE))
+AVG(VSIZE(UPDATEDATE))
),9) AS AVG_ROW_SIZE
FROM TEST_USER.TEST

結果: AVG_ROW_SIZE
68.41405

1行当たり約70バイトで計算すれば、10万行で7MB必要になります。
USERSには別のテストデータもあったので、それで容量が足りなくなったのでしょう。
しかし何故自動拡張が機能しなかったかは解りません…


プロフィール

愛知県名古屋市にあるジャスウィルで働く社員です。
ジャスウィルは大学事業に特化したシステムを提案しています。『大学向け事務・教務統合パッケージ―TriR Campus』を開発しています。