データベースコンサルタントのノウハウちょい見せ

Oracle RDBMSなどのオラクル製品や各種インフラ技術(OS、ストレージ、ネットワーク)といった話題を取り上げます。著者は小田圭二、「門外不出のOracle現場ワザ」、「絵で見てわかるOracleの仕組み」、「絵で見てわかるOS/ストレージ/ネットワーク」などの著作もあります

ホーム > アーカイブ - 2012年12月

Oracleにくだらないことをさせてみたい

advent calendar素敵ですね。
毎日1つづつ窓を開けて行くイメージなんですね。

さて、JPOUG advent calendarは、私の番ですが、OracleのPL/SQLパッケージ小話(こばなし)をしようと思います。
Oracleデータベースは、何これ?というPL/SQLのパッケージをデフォルトでいろいろ持っています。気軽に覗いてみましょう。

なお、今回の内容は、1mmも役に立ちません!!!


●Oracleに日本語を変換させたい。

意外とOracleデータベースって日本語通なんです。片仮名とひらがなを理解したりします。


SQL> SELECT UTL_I18N.TRANSLITERATE ('あああ','kana_fwkatakana') FROM DUAL;

UTL_I18N.TRANSLITERATE('あああ','KANA_FWKATAKANA')
--------------------------------------------------------------------------------

アアア

ほらっ、ひらがなが片仮名になりました!
半角にしたり、全角にしたり、カタカナをひらがなにしたり、いろいろできますので、興味ある人は調べてください。使う人は居ないだろうけど・・・・・

●DBAを騙したい。Oracleクライアントの名前を詐称する

v$sessionを検索すると、SQL*Plusとか、プログラム名が表示されて身元が確認できますよね。
でも、これって詐称できるって知ってましたか?

exec DBMS_APPLICATION_INFO.SET_MODULE('java',NULL); <- SQL*Plus上で、'java'だと宣言しました。

v$sessionを検索してみます。

SQL> select machine,module from v$session where USERNAME = 'KODA';

MACHINE
--------------------------------------------------------------------------------
MODULE
--------------------------------------------------------------------------------

koda
SQL*Plus

koda
java

ほらっ、下の行を見てください。SQL*Plusなのに、javaプログラムのように見えますよ! これで身近なDBAを騙してみましょう。

●OralceのCPU時間を知りたい

SQL> select dbms_utility.get_cpu_time() from dual;

DBMS_UTILITY.GET_CPU_TIME()
---------------------------
607

俺のCPU時間は、607だって言ってます。わざわざ、OS的な統計をPL/SQLパッケージから取得する人は居ませんよねー。

●SQL IDをHASH valueにしたい

「俺はSQL IDじゃなく、HASH value派だ(?)」という人も世の中に一人くらい居ると思います。
そんな人に贈ります。

SQL> select sql_id,hash_value from v$sql where sql_text = 'select no from test';

SQL_ID HASH_VALUE
-------------------------- ----------
3tu26hh8z0ck4 300954180

SQL> select dbms_utility.SQLID_TO_SQLHASH('3tu26hh8z0ck4') from dual;

DBMS_UTILITY.SQLID_TO_SQLHASH('3TU26HH8Z0CK4')
----------------------------------------------
300954180

できたできた。SQL IDがHASH valueになりました。たぶん、使うことはありませんけどね。


●ORACLEをWebクライアントにしてみたい

DBMSのOracleをWebクライアントにしてみましょう。

$ORACLE_HOME/rdbms/admin に utlhttp.sql があります。まず、これをインスト―ルします。

'http://localhost:4664'にHTTPリクエストしてみます。

SQL> SELECT UTL_HTTP.REQUEST('http://localhost:4664') FROM DUAL;

UTL_HTTP.REQUEST('HTTP://LOCALHOST:4664')
--------------------------------------------------------------------------------


<以下略>

なんと、HTMLが表示されました! 使う人はあんまり居ないでしょうけど・・・・

#実際に使用するにはACLの設定が必要だったりするので、必要な人は調べてください。


●OracleでTCP通信をしてみたい。

次はOracleにTCP通信をさせてみましょう。好きなポート番号に通信できますよ!

$ORACLE_HOME/rdbms/admin に utltcp.sql があります。まず、これをインスト―ルします。

DECLARE
c utl_tcp.connection;
ret_val pls_integer;
BEGIN
c := utl_tcp.open_connection(remote_host => 'localhost',
remote_port => 4664,
charset => 'US7ASCII');
ret_val := utl_tcp.write_line(c, 'GET / HTTP/1.0');
ret_val := utl_tcp.write_line(c);
BEGIN
LOOP
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
END LOOP;
EXCEPTION
WHEN utl_tcp.end_of_input THEN
NULL;
END;
utl_tcp.close_connection(c);
END;
/

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
X-Content-Type-Options: nosniff
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
<以下略>

おおっ、さすがTCPの通信。HTTPの通信まで丸見えです。でも、わざわざDBMSでTCPソケットプログラミングする人は居ませんよね?

#実際に使用するにはACLの設定が必要だったりするので、必要な人は調べてください。

●最後に

他にも「Oracleをメールクライアントにしてみたい(UTL_SMTPパッケージ)」なんてのも出来ます。

「1つも役に立たないぞ」とお怒りの人も居そうです。
そういう人は「dbms_xplan display advanced」とでも入力してググってみてください。
知らない人は、へぇーと思うはずです。私からはこれ以上言えません・・・・

皆さん、よいクリスマスをお迎えください。。。。明日は、kouji_s_0808 さんです。
スポンサーサイト
[ 2012/12/07 00:24 ] 雑談 | TB(0) | CM(0)
プロフィール

odakeiji

Author:odakeiji
小田圭二 日本オラクルのテクノロジーソリューションコンサルティング統括本部においてデータベースのコンサルタントをしている。今までのキャリアでは、社内教育部隊で、データベースやOS、ネットワークを教える経験を5年ほど積んだり、コンサル部門で主にDB(インフラ含む)のコンサルを10年程度経験した。また、コンサルタントとして、主に大規模ミッションクリティカルシステムを担当。社内では”火消し”とも呼ばれ、システムトラブルの火消しをいくつも担当していたこともある。
ポリシーは、「OracleもOS上で動くアプリケーションにすぎない。だから、OS、ストレージ、ネットワークを学ぶべき。アーキテクチャから考えろ」。
スキル面の興味は、アーキテクチャ、DBA、インフラ技術、教育、コンサル手法など。
本ブログのポリシーは「週に1回、DBAやインフラ担当者の役に立つ記事を書きたい」です(守れるだけ、守りたい・・・・)
なお、本ブログにおいて示されている見解は、私自身の見解であって、オラクルの見解を必ずしも反映したものではありません。ご了承ください。

私の主な著書の紹介です。もしよかったら、お役立てください。他にもオライリーなどがあります

●「絵で見てわかるOS/ストレージ/ネットワーク データベースはこう使っている」小田圭二 著
私のポリシーである”DBMSもOSの動くアプリケーションに過ぎない”に基づいて、OSとDBMSの関係、ストレージとDBMSの関係、ネットワークとDBMSの関係、を解説した珍しい書籍です。DBを学んでひと段落したら、DB使いもインフラ全体を意識しなければなりませんが、そのような人にお勧めです。企業ユーザー向けのIT本としては、2008年度翔泳社No1だとか(最後は出版社談)。

●「絵で見てわかるOracleの仕組み」 小田圭二 著
教育に携わる者としての私の思い「丸暗記するな。アーキテクチャを知るべき。絵で説明すべき」を具体化した、Oracleの入門書です。Oracle初心者向きですが、Oracleの基礎となる部分の動きを解説しているため、バージョンに依存せずに何年先でも使えます。逆に、本書の内容を理解せずに、ひたすら丸暗記すると応用力が身につきません。この本を読むだけで何かできるようになるわけではありませんが、アーキテクチャを身につけて、本当の技術力を身につける第一歩として欲しいと思っています。

●「44のアンチパターンに学ぶDBシステム」 小田圭二 著
本書は、企業のDBシステムの設計/構築から運用管理、プロジェクト管理までの各フェーズにおけるトラブル(失敗)事例について、アンチパターン(べからず集)とその回避策/防止策として解説するものです。チェックリストとして使っていただいても構いません。分かっていてもアンチパターンは避けられないことも多いものです(政治とか)。そういう方には、同じ仲間は多いのだなと再認識していただくための一服の清涼剤としていただければと思います。

●「門外不出のOracle現場ワザ」 小田圭二 他 著
一番最初に出た本です。結構とがった内容を扱っています。
・パフォーマンス分析の考え方(私の担当)
・性能テストや障害テストの仕方、設計の注意点(主に私が執筆)
・コストベースオプティマイザ(10gベース)のアーキテクチャ
・コネクションプーリング
最新のOracleの内容は含んでいませんが、今でも性能の考え方やオプティマイザの考え方は使えるはずです。オプティマイザをここまで解説している本を私は知りません。

●「続・門外不出のOracle現場ワザ」 小田圭二 他 著
「続」の名前の通り、次に出た本です。ちょっと尖り過ぎたかもしれません^^; でも本当に使う内容を選んだつもりです。一流になりたい・他の人と差をつけたい人にお勧めでしょうか。
・性能の良いSQLの書き方
・文字化けの仕組み
・障害(特に性能やハング)の分析・対応方法(私が執筆)
・障害をリアルタイムに分析・対処する方法(私が執筆)
・オプティマイザの使い方ノウハウ
・アップグレードのノウハウ

●「データベース」小田圭二 他 著
私にしては堅い本です。なんせ、共同執筆者が大御所の國友義久先生です。階層型DBMS、ネットワーク型DBMS、リレーショナル型DBMS、XMLDBMS、OO(オブジェクト指向)DBMS、DBMSの持つ機能、DBMSのセキュリティ、データベースの著作権、監査、モデリング、正規化といった内容を網羅しており、深い記述は無いものの、DB技術全体を抑えるのに向いている一冊です。ある程度技術力がついたエンジニアの方が、DB全体を振り返りたい(勉強したい)というときの最初の1冊としてお勧めです。