2013年12月 9日 (月)

no ocijdbc11 in java.library.path on OS X Mavericks

JPOUG Advent Calendar 2013、9日目のエントリー、かつ、チューニングネタではなく Java on OS X の話という変化球 :) です。

OS X版Oracle SQL DeveloperやOracle JDeveloperで、OCI/Thick JDBCを利用しようとして以下のようなメッセージに遭遇したら...みなさんどうしてるのだろう? 

no ocijdbc11 in java.library.path

と考えだしたら眠れなくなったので、役に立つのか、たたないのかわからないけど書いておきます

私は、Oracle SQL DeveloperやOracle JDeveloperの起動シェルでDYLD_LIBRARY_PATHなどの環境変数をセットすることで対処しています。
(今となってはこれが楽だと思います。 environment.plistでなんとかできた時代もありましたけど...いまは使えないしね)

no ocijdbc11 in java.library.pathとなっている状態から解決するまでの操作をYouTubeで....


映像では、ユーザーのホームディレクトリーにOracle向け環境変数設定ファイル (この例では、oracleenvというファイルを作成してあります) を作成しておき、その設定ファイルをOracle SQL Developer等の起動シェルで読み込ませて問題を解決するまでの操作を行っています。

主演
MacBook Air (mid2013)

ホストOS、その他

  • OS X 10.9 Maveriks
  • Oracle Instant Client 11g 11.2.0.3.0 for OS X (64bit)
  • Terminal 2.4
  • VirtualBox 4.3.4 for OS X
  • Oracle SQL Developer 4.0.0 for OS X
  • Oracle JDeveloper12c 12.1.2.0.0 Studio Edition Generic

ゲストOS、その他

  • Oracle Linux Server 6.4 x86_64
  • Oracle Database 12c EE R1 for Linux x86_64

映像では見づらい方向けの解説。

事前にOracle向け設定ファイルを該当ユーザーのホームディレクトリーに作成しておきます。
この例では、oracleenvとして作成しました。(不過視ファイルとしてもよいかもしれません。)
Oracle_environment_variables


Oracle SQL Developer 4.0 for OS X

「Oracle SQL Developerメニュー」→「Preference...」を選択
002_sdev_004

「データベース」→「拡張」→「OCI/Thickドライバの使用」チェックボックス」をチェック→「テスト」ボタンをクリック
002_sdev_005

no ocijdbc11 in java.library.pathエラーとなる(ライブラリーへのパスが通ってないので当然ですよね)
002_sdev_006

「Finder」→「アプリケーション」→「SQL Developer」→「右クリック」→ポップアップメニューの「パッケージの内容表示」
002_sdev_009

「Contents」→「MacOS」→「sqldeveloper.sh」を選択
002_sdev_010

ポップアップメニュー「このアプリケーションで開く」でお好きなテキストエティタを選択
002_sdev_012

oracle向け環境設定ファイルを読み込ませるように編集。この例ではユーザーホームディレクトリにある oracleenvというファイルを読み込むように変更。
002_sdev_013

Oracle SQL Developer 4.0を再起動しOCI/Thick JDBCドライバーで接続可能か再確認
002_sdev_014

002_sdev_015


Oracle JDeveloper12c 12.1.2.0.0 Studio Edition Generic

「データベース接続編集」ダイアログの「接続のテスト」ボタンをクリックするとno ocijdbc11 in java.library.pathエラー(これもパスが通ってないのが原因なので...)
003_jdev_002

003_jdev_003

「Finder」でOracle JDeveloper12cのインストールディレクトリーからアプリケーション「JDeveloper」を右クリック
→ポップアップメニューの「パッケージの内容を表示」を選択

003_jdev_004

「Contents」→「MacOS」→「JDeveloper」を選択して右クリック→「このアプリケーションを開く」でお好きなテキストエディタを選択
003_jdev_005

oracle向け環境設定ファイルを読み込ませるように編集。この例ではユーザーホームディレクトリにある oracleenvというファイルを読み込むように変更。
003_jdev_006

Oracle JDeveloper12cを再起動し、OCI/Thick JDBCドライバーで接続可能か再確認
003_jdev_007

003_jdev_008


明日は、@dekasasaki さんの担当です。引き続き、JPOUG Advent Calendar 2013をお楽しみください。:)


| | コメント (0) | トラックバック (0)

2013年2月 3日 (日)

Instant Client v11.2.0.3.0 for Mac OS X (Intel x86) のセットアップ

ディレクトリ掘るのめんどくさいんで、Instant Client 10g for MacOS Xの時と同じくすべて同一フォルダに解凍しちゃってますが....。(^^;;;

....動作確認... :)
20130203_60648


そういえば、Instant ClientのREADME.txtには、Darwin 13.0の文字がありますな。

System name:	Darwin
Release: 11.3.0
Version: Darwin Kernel Version 11.3.0: Thu Jan 12 18:47:41 PST 2012; root:xnu-1699.24.23~1/RELEASE_X86_64
Machine: x86_64

| | コメント (0) | トラックバック (0)

Instant Client v11.2.0.3.0 for Mac OS X (Intel x86) 32bit and 64bit released !!! :)

Instant Client v11.2.0.3.0 Downloads for Mac OS X (Intel x86) 32bit and 64bit
http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html

Precompiler Downloads - Instant Client Package - (v11.2.0.3.0)
http://www.oracle.com/technetwork/topics/precomp-112010-084940.html


11g R2阪がリリースされるなんて、驚いた。うれしいことですが、驚いたお。

| | コメント (0) | トラックバック (0)

2010年10月18日 (月)

Mac de Oracle - 10万円未満 de RAC (11g編)改め、 VirtualBox de RAC (Oracle11g R1編) #1

いままでいろいろと遊んでいたPCやうちの奥さんのPCがじゃまになってきたのでCore i7 980x (6 core / ハイパースレッディングを使って12CPU)というやつ1台に集約!

さすがに"10万円未満 de"はとは言えなくなった(購入金額をVM数で割ってもちょいと足がでるが、電気代とか占有スペースとか必要に応じてVM作って遊べるのでお得だ。)ので、VirtualBox de RACと改名いたしましたw

とは言っても、Oracle11g R1 EE for Linux x86でiSCSIを使うというのは同じで、違うのは全部VMっていうところだけ。
手順もMac de Oracle - 10万円未満 de RAC (11g編)と同じ(OCFS2やASMlibのバージョンはCentOSのバージョンに対応する最新のものを利用しています。)なのでVM使ってて悩んだ所などを中心に書く予定。


・CPU - Intel Core i7-980X Extreme Edition 3.33Ghz (6 core / 12 thread) * 1
・Memory - 12GB (2GB * 6)
・Disk - S-ATA2 1TB * 2
・NIC - on board Gbit NIC
グラフィックカードは気にしてなかったので安めの、 NVIDIA GeForce GTS 250 (512MB)



Screenshotvirtualbox


Screenshotoracle_vm_virtualbox1_2


Screenshotoracle_vm_virtualbox_2


Screenshotoracle_vm_virtualbox2_2

ソフトウェアは以下の通り。

ホストOS等
・CentOS5.5 x86_64 (Kernel:2.6.18-194.17.1.e15)
・VirtualBox3.2.8 x86_64


ゲストOS等
・CentOS5.5 x86 (kernel:2.6.18-194.17.1.e15PAE)
・Openfiler2.3 x86
・Oracle11g 11.1.0.6.0 EE for Linux x86
 など…

以下、適当に書いた配置図。
VNICの設定では、外部ネットワークにも行けるようにBridge Adapterを使ったこととInterconnect向けにInternal Networkを使った(VirtualBoxのInternal NetworkはGestOS間でのみ通信できHostOSからも見えない)
Virtualbox_de_rac_11g_r1

という案で、VMごとクラッシュさせたりいろいろ悩みながらなんとかインスコ&構築done。現在は以下ような状態! :)
Oem1

Virtualbox_de_rac_11g_r1_2


次回へつづく。


関連エントリ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

| | コメント (0) | トラックバック (0)

2009年2月 6日 (金)

In Oracle Database 11g, native dynamic SQL now supports statements bigger than 32K characters

久々にOracleネタ。

Oracle11gのPL/SQLのDynamic SQLでCLOBが使えるようになったようなので試してみた。
10gまではexecute immediate文で使えるのは最大でVARCHAR2(32767)までだったワケで、ど〜〜〜〜〜〜しても(書きたくないけど・・)巨大なSQL文をダイナミックに実行しなきゃいけない人には朗報?なんでしょうね。(DWH系ではCLOBが必要なくらい巨大なクエリをダイナミックに生成するなんてこともあるんでしょうね。私は今のところ32Kを超えるクエリは書いたことないけどそれに近いのは過去1度あったかな?! という程度。)

ということで10gと11g for linux(x86)を使って確認!(ClientはMacOSX(PPC)版Instant Clientですよん

まず最初はOracle10g
execute immediate文に利用できるのはVARCHAR2(32767)が最大サイズなのでダイナミックに生成するSQL文もそのサイズに制限されちゃう。VARCHAR2(32767)を超えるとORA-06502が発生する。(尚、10gの場合でもDBMS_SQLを使えばもっと大きいサイズの動的SQLも使用できる。)

G5Server:˜ discus$ sqlplus /nolog

SQL*Plus: Release 10.1.0.3.0 - Production on 金 2月 6 1:19:22 2009

Copyright (c) 1982, 2004, Oracle. All rights reserved.

> conn scott@catfish
パスワードを入力してください:
接続されました。
SCOTT> set serveroutput on
SCOTT> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 - Prod
PL/SQL Release 10.1.0.3.0 - Production
CORE 10.1.0.3.0 Production
TNS for Linux Server: Version 10.1.0.3.0 - Production
NLSRTL Version 10.1.0.3.0 - Production

SCOTT> l
1 CREATE OR REPLACE PROCEDURE dynamic_sql_test10g(iLength IN NUMBER)
2 IS
3 vSQL VARCHAR2(32767);
4 vResult NUMBER;
5 BEGIN
6 vSQL := 'SELECT 1';
7 FOR i IN 1.. iLength LOOP
8 vSQL := vSQL || '+1';
9 END LOOP;
10 vSQL := vSQL || ' FROM DUAL';
11 EXECUTE IMMEDIATE vSQL INTO vresult;
12 DBMS_OUTPUT.PUT_LINE('Result:'||TO_CHAR(vresult));
13* END;
SCOTT> /

プロシージャが作成されました。

SCOTT> exec dynamic_sql_test10g(16374);
Result:16375

PL/SQLプロシージャが正常に完了しました。

SCOTT> exec dynamic_sql_test10g(16375);
BEGIN dynamic_sql_test10g(16375); END;

*
行1でエラーが発生しました。:
ORA-06502: PL/SQL: 数値または値のエラー:
文字列バッファが小さすぎます。が発生しました ORA-06512:
"SCOTT.DYNAMIC_SQL_TEST10G", 行10
ORA-06512: 行1

SCOTT>

11gの場合
execute immediate文にCLOBが使えるようになったことで以下のように32K超えの動的SQLも実行できちゃうのだ。

注)
以下のコードで遊ぶときは個人で遊べるデータベースでやってくださいね。(本番データベースや多数の開発者で共有しているテスト/開発データベースでとんでもなく巨大なクエリを実行すると他の方の迷惑になるので・・・・・)

SCOTT> 
SCOTT> conn scott@lampeye
パスワードを入力してください:
接続されました。
SCOTT>
SCOTT> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Linux: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

SCOTT>
SCOTT> l
1 CREATE OR REPLACE PROCEDURE dynamic_sql_test11g(iLength IN NUMBER)
2 IS
3 vSQL CLOB;
4 vResult NUMBER;
5 BEGIN
6 vSQL := 'SELECT 1';
7 FOR i IN 1.. iLength LOOP
8 vSQL := vSQL || '+1';
9 END LOOP;
10 vSQL := vSQL || ' FROM DUAL';
11 EXECUTE IMMEDIATE vSQL INTO vresult;
12 DBMS_OUTPUT.PUT_LINE('Result:'||TO_CHAR(vresult));
13* END;
SCOTT> /

プロシージャが作成されました。

SCOTT> set serveroutput on
SCOTT> exec dynamic_sql_test11g(32767);
Result:32768

PL/SQLプロシージャが正常に完了しました。

SCOTT>
SCOTT> set timi on
SCOTT> exec dynamic_sql_test11g(1000000);
Result:1000001

PL/SQLプロシージャが正常に完了しました。

経過: 00:06:25.93
SCOTT>

| | コメント (0) | トラックバック (0)

2008年10月19日 (日)

Mac de Oracle - 10万円未満 de RAC (11g編)#24

今回はOracle Net Serviceの確認

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成 その1その2その3
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成 その1その2その3
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)☆項番19.で確認してしまったので削除

19.Oracle Net Serviceの確認
まずRAC側のtnsnames.oraの内容確認から。ORCL2以下の内容をMacOSXのOracle Instant Client 10g R1のtnsnames.oraへコピーする。
[oracle@discus1 ˜]$ cat $TNS_ADMIN/tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.1.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

LISTENERS_ORCL =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = discus1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = discus2-vip)(PORT = 1521))
)

ORCL2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = discus2-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.macdeoracle.info)
(INSTANCE_NAME = orcl2)
)
)

ORCL1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = discus1-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.macdeoracle.info)
(INSTANCE_NAME = orcl1)
)
)

ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = discus1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = discus2-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.macdeoracle.info)
)
)

[oracle@discus1 ˜]$


コピー内容を確認。
G5Server:˜ discus$ tail -31 $TNS_ADMIN/tnsnames.ora
ORCL2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = discus2-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.macdeoracle.info)
(INSTANCE_NAME = orcl2)
)
)

ORCL1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = discus1-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.macdeoracle.info)
(INSTANCE_NAME = orcl1)
)
)

ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = discus1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = discus2-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.macdeoracle.info)
)
)

G5Server:˜ discus$

次にOracle Instant Client 10g R1 for MacOSX(PPC)から接続テストを行う。
G5Server:˜ discus$ sqlplus -version

SQL*Plus: Release 10.1.0.3.0 - Production

G5Server:˜ discus$ sqlplus /nolog

SQL*Plus: Release 10.1.0.3.0 - Production on 日 10月 19 10:37:35 2008

Copyright (c) 1982, 2004, Oracle. All rights reserved.

> !sw_vers
ProductName: Mac OS X Server
ProductVersion: 10.4.11
BuildVersion: 8S169

> !/usr/sbin/system_profiler SPHardwareDataType SPSoftwareDataType | grep -E '((System|Kernel) Version|CPU)'
CPU Type: PowerPC G5 (3.1)
Number Of CPUs: 2
CPU Speed: 2.7 GHz
L2 Cache (per CPU): 512 KB
System Version: Mac OS X Server 10.4.11 (8S169)
Kernel Version: Darwin 8.11.0

>
> conn sys@orcl1 as sysdba
パスワードを入力してください:
接続されました。
SYS> select instance_name from v$instance;

INSTANCE_NAME
----------------
orcl1

SYS> conn sys@orcl2 as sysdba
パスワードを入力してください:
接続されました。
SYS> select instance_name from v$instance;

INSTANCE_NAME
----------------
orcl2

SYS> conn sys@orcl as sysdba
パスワードを入力してください:
接続されました。
SYS> select instance_name from v$instance;

INSTANCE_NAME
----------------
orcl1

SYS> conn sys@orcl as sysdba
パスワードを入力してください:
接続されました。
SYS>: --ロードバランシングされて次はorcl2へ繋がるだろうな・・・・・多分。
SYS> select instance_name from v$instance;

INSTANCE_NAME
----------------
orcl2

SYS> -- gv$instanceビューでracの全インスタンスのチェック
SYS> select
2 inst_id
3 ,instance_number
4 ,instance_name
5 ,host_name
6 ,version
7 ,status
8 ,parallel
9 from
10 gv$instance;

INST_ID INSTANCE_NUMBER INSTANCE_NAME HOST_NAME VERSION STATUS PAR
---------- --------------- ---------------- ------------------------ ----------------- ------------ ---
1 1 orcl1 discus1.macdeoracle.jp 11.1.0.6.0 OPEN YES
2 2 orcl2 discus2.macdeoracle.jp 11.1.0.6.0 OPEN YES

SYS>
SYS> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Linux: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

SYS>
同様にintel x86版のMacOSXからも接続確認(^^)。intel x86 mac向けにはOracle Instant Client 10g R2が利用できる。もちろんOracle Instant Client 10g R1(PPC)をRosetta上で動作させてもOKだが。
Macintosh:˜ discus$ sqlplus -version

SQL*Plus: Release 10.2.0.4.0 - Production

Macintosh:˜ discus$ sqlplus /nolog
¥
SQL*Plus: Release 10.2.0.4.0 - Production on 日 10月 19 11:31:45 2008

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

SQL> !sw_vers
ProductName: Mac OS X
ProductVersion: 10.5.5
BuildVersion: 9F33

SQL> !/usr/sbin/system_profiler SPHardwareDataType SPSoftwareDataType | grep -E '((System|Kernel) Version|Processor (Name|Speed))'
Processor Name: Intel Core 2 Duo
Processor Speed: 2.2 GHz
System Version: Mac OS X 10.5.5 (9F33)
Kernel Version: Darwin 9.5.0

SQL> conn sys@orcl as sysdba
Enter password:
Connected.
SQL> select
2 instance_number
3 ,instance_name
4 ,status
5 ,version
6 from
7 gv$instance;

INSTANCE_NUMBER INSTANCE_NAME STATUS VERSION
--------------- ---------------- ------------ -----------------
2 orcl2 OPEN 11.1.0.6.0
1 orcl1 OPEN 11.1.0.6.0

SQL>

Yahoo! 上手く行ったね〜。Oracle11g R1でお遊びRAC環境を構築するにも物理メモリ1GBは載せないとダメね。ということで次回へつづく

追記(2008/10/19)
しまった〜、一番最後に行う予定だったMacOSXのOracle Clientからの接続テストをやっちゃった。w
しかたないので項番24.は削除しておくか。。(^^;;

| | コメント (0) | トラックバック (0)

2008年10月 6日 (月)

Mac de Oracle - 10万円未満 de RAC (11g編)#1

まずは環境から。
前回のシリーズの環境をそのまま流用。但し、各PCのメモリ不足が明確になった時点で各512MB増設し1GBとする。)

Hardware
PC2100 512MBのメモリ2枚(合計2,960円)以外は既存のH/Wを流用したので、現在の価値は5万円にも満たない。。。。はず?!

(1) PC - RAC用 - DELL Optiplex GX260 CPU:P4 2.4Ghz RAM:512MB * 1
  (尚、DBCA実行時にメモリ不足となったので。最終的には各1GBのメモリと搭載させる。)

(2) PC - iSCSI用 - DELL PowerEdge SC600 CPU : P4 1.8Ghz RAM:769MB * 1

(3) DISPLAY - DELL 15inch 液晶ディスプレイ * 1

(4) KEYBOARD, MOUSE -- DELL製 * 2セット

(5) HUB - Corega CG-SW05TXPL(100base for public)
  Corega CG-SW05GTPLB(1000base for interconnect) 各1

注)DISPLAY、Keyboard、mouseはPC数より少ないが必要に応じて繋ぎ替えて利用する。

Software
Oracle11g 11.1.0.6.0 EE for Linux x86
CentOS5.2 - 2.6.18-92.el5
Openfiler2.3 - Final Release
OCFS2(Oracle Cluster File System 2) - 1.4.1-1
Oracle Cluster Verification Utility - Linux x86(Aug 2008)
Oracle ASMLib2.0 for RHEL5
 (oracleasm-support-2.0.4-1.el5.i386
 oracleasmlib-2.0.3-1.el5.i386
 oracleasm-2.6.18-92.el5-2.0.4-1.el5.i686.rpm)


尚、Openfiler2.2(respin 2)及びOracle Enterprise Linuxを利用しているUS OTN記事ー「Build Your Own Oracle RAC Cluster on Oracle Enterprise Linux and iSCSI」も参考にしたが、Openfiler2.2と2.3では管理画面構成が異なる点、Oracle Enterprise Linuxは正式にサポートされているプラットフォームだがCentOS5.2はサポートされていないプラットフォームである点等は異なる。


そして・・・Mac De OracleですからLinuxのインストール以外はMacOSXのxtermから全て行う。(お約束)w

今回はPowerMac G5(PPC)とMacBook Pro(Intel)を利用するが、インストールなど構成はPowerMac G5から行う。
また、MacOSX用Oracle Clientは以下のOracle Instant Clientを利用する。
Oracle Instant Client for MacOSX (PPC) 10.1.0.3.0
Oracle Instant Client for MacOSX (Intel) 10.2.0.4.0

ClientにするMacも含めた配置図は以下の通り。


Racdeoracle11g




バックナンバー
10万円未満 de RAC (Oracle11g R1編)

| | コメント (0) | トラックバック (0)

2008年10月 1日 (水)

さて・・

Oracle11gMySQL5.0PostgreSQL8.3、(FireBird2.1もやるか)、それにOpenfiler2.3なども利用して旧リリースで試していたことを再度試しておこうかそろそろ。
たとえば、HeterogeneousRACのネタなど。まず、RACからやりますか..。

| | コメント (0) | トラックバック (0)

2008年9月13日 (土)

ちょいと迷惑だったストアドファンクション(つづき)

前回の続きです。

ところで何がちょっと迷惑だったのか?

まずは、マニュアルをご覧ください。

もうお分かりですよね!

例の関数、戻り値としてレコード型を返してくれるのはよいのですが、該当データが存在しなかった場合にNULLを返す作りになっています。そのレコード型はどのように比較すれば該当データが存在しないのか外部の仕様からは全く見えません。(当然、レコードがNULLであるか判定する関数も用意されていません。)

レコード型がNULLかテストできないので以下のようなコードは書けないのですよ!

SCOTT> set serveroutput on size 100000
SCOTT> l
1 DECLARE
2 members inconvenient_package.membersType;
3 BEGIN
4 members := inconvenient_package.inconvenient_function(99);
5 IF members IS NULL THEN
6 RAISE NO_DATA_FOUND;
7 ELSE
8 DBMS_OUTPUT.PUT_LINE('Dept name/id:'||members.deptname||'/'||TO_CHAR(members.deptno));
9 FOR i IN members.employees.FIRST..members.employees.LAST LOOP
10 DBMS_OUTPUT.PUT_LINE(' -- '||members.employees(i).ename);
11 END LOOP;
12 END IF;
13* END;
SCOTT> /
IF members IS NULL THEN
*
行5でエラーが発生しました。:
ORA-06550: 行5、列6:
PLS-00306: 'IS NULL'の呼出しで、引数の数または型が正しくありません。
ORA-06550: 行5、列3:PL/SQL: Statement ignored

利用する側からすると、該当データが存在しない場合のコードをどうかいて良いのかAPIからは判断がつかない(該当関数のソースコードを読まない限り判断できない)。
この点がちょいと迷惑だったわけ。

例の関数をそのまま利用した場合以下のようなコードを書かないと該当データが存在しないことを判定できない。
(赤太字部分は利用する関数のコード及びこの関数がアクセスしている表定義を見て判断する必要がある。面倒くさい! なんでAPI見ただけでコード書く事できないような共通関数があるの〜〜〜。)

SCOTT> l
1 DECLARE
2 members inconvenient_package.membersType;
3 BEGIN
4 members := inconvenient_package.inconvenient_function(99);
5 IF members.employees.COUNT = 0
6 OR members.deptno IS NULL
7 THEN
8 DBMS_OUTPUT.PUT_LINE('該当データが存在しません.');
9 ELSE
10 DBMS_OUTPUT.PUT_LINE(
11 'Dept name/id:'
12 ||members.deptname
13 ||'/'||TO_CHAR(members.deptno)
14 );
15 FOR i IN members.employees.FIRST..members.employees.LAST LOOP
16 DBMS_OUTPUT.PUT_LINE(' -- '||members.employees(i).ename);
17 END LOOP;
18 END IF;
19* END;
SCOTT> /
該当データが存在しません.

PL/SQLプロシージャが正常に完了しました。


SCOTT> l
1 DECLARE
2 members inconvenient_package.membersType;
3 BEGIN
4 members := inconvenient_package.inconvenient_function(10);
5 IF members.employees.COUNT = 0
6 OR members.deptno IS NULL
7 THEN
8 DBMS_OUTPUT.PUT_LINE('該当データが存在しません.');
9 ELSE
10 DBMS_OUTPUT.PUT_LINE(
11 'Dept name/id:'
12 ||members.deptname
13 ||'/'||TO_CHAR(members.deptno)
14 );
15 FOR i IN members.employees.FIRST..members.employees.LAST LOOP
16 DBMS_OUTPUT.PUT_LINE(' -- '||members.employees(i).ename);
17 END LOOP;
18 END IF;
19* END;
SCOTT> /
Dept name/id:ACCOUNTING/10
-- CLARK
-- KING
-- MILLER

PL/SQLプロシージャが正常に完了しました。

SCOTT>

例の関数を修正するとしたら、私個人の趣味だとNO_DATA_FOUND例外はそのままスローするように例外ハンドラー部分を削除しますね。
(ファンクションである必要も無さそうなのでプロシージャにして該当データ無しなどを表すステータスを返す方法を好む方も多いのですが。)

例の関数を修正しNO_DATA_FOUND例外をそのままスローする仕様に変更すれば共通関数のソースコードや関連する表定義まで追っかける必要は無くなりますよ!。w
以下、NO_DATA_FOUNDの例外ハンドラーを削除した例

CREATE OR REPLACE PACKAGE BODY inconvenient_package
AS
FUNCTION inconvenient_function(iDeptNo IN dept.deptNo%TYPE)
RETURN membersType
AS
members membersType;
BEGIN
SELECT
deptNo
,dName
INTO
members.deptNo
,members.deptName
FROM
dept
WHERE
deptNo = iDeptNo
;
--
SELECT *
BULK COLLECT INTO
members.employees
FROM
emp
WHERE
deptno = iDeptNo
;
RETURN members;
-- NO_DATA_FOUND例外ハンドラーを削除して利用する側でハンドリングさせる
END inconvenient_function;
END inconvenient_package;
/

前述のように修正すれば以下のようなコードを書くだけでよく余計なことに気を使う事もなくなる。(関数のコードやアクセスしている表定義なんて覗かなくても該当データが存在しない場合、NO_DATA_FOUND例外をキャッチするだけで済む)

SCOTT> l
1 DECLARE
2 members inconvenient_package.membersType;
3 BEGIN
4 BEGIN
5 members := inconvenient_package.inconvenient_function(10);
6 DBMS_OUTPUT.PUT_LINE(
7 'Dept name/id:'
8 ||members.deptname
9 ||'/'||TO_CHAR(members.deptno)
10 );
11 FOR i IN members.employees.FIRST..members.employees.LAST LOOP
12 DBMS_OUTPUT.PUT_LINE(' -- '||members.employees(i).ename);
13 END LOOP;
14 --
15 EXCEPTION
16 WHEN NO_DATA_FOUND THEN
17 DBMS_OUTPUT.PUT_LINE('該当データが存在しません。');
18 END;
19* END;
SCOTT> /
Dept name/id:ACCOUNTING/10
-- CLARK
-- KING
-- MILLER

PL/SQLプロシージャが正常に完了しました。

SCOTT> l
1 DECLARE
2 members inconvenient_package.membersType;
3 BEGIN
4 BEGIN
5 members := inconvenient_package.inconvenient_function(99);
6 DBMS_OUTPUT.PUT_LINE(
7 'Dept name/id:'
8 ||members.deptname
9 ||'/'||TO_CHAR(members.deptno)
10 );
11 FOR i IN members.employees.FIRST..members.employees.LAST LOOP
12 DBMS_OUTPUT.PUT_LINE(' -- '||members.employees(i).ename);
13 END LOOP;
14 --
15 EXCEPTION
16 WHEN NO_DATA_FOUND THEN
17 DBMS_OUTPUT.PUT_LINE('該当データが存在しません。');
18 END;
19* END;
SCOTT> /
該当データが存在しません。

PL/SQLプロシージャが正常に完了しました。

SCOTT>

2009/3/25追記:
この例では該当関数の例外ハンドラーを削除しただけですが、もし該当関数やプロシージャの例外ハンドラーでエラーログ(例えばLog4PLSQLとか)などでエラーなどを追跡しやすくするようなロジックを実装していたら・・・・例外ハンドラーを削除することは避けてくださいね。そのような場合は例外ハンドラー内で同じ例外をスローするように変更すべきです(プロジェクトの規約でユーザー定義例外をスローするようにしているところもあります。)
そのようにすることで該当関数から呼び出しもとへ同じ例外がスローされるようになります。具体的な例は別エントリで書く予定。

ついでなのでOTNオンラインマニュアルのURLを変更。(OTNのオンラインマニュアルは訂正が入るとリビジョンが上がりURLまで変っちゃうのが面倒なのよ。ほんと。。URL変らないように工夫してくれないかな。。

| | コメント (0) | トラックバック (0)

2008年9月 7日 (日)

トリガーカスケード制限 #3

前回まではLinux(32bit)環境(CentOS5)だったが気になったのでWindows XP Professional (32bit)でも試してみた。

結果を先に書くがLinux(32bit)と同じくトリガーカスケードの最大値は49となっている。ついでに調べたところOracle10g for MacOS X Serverでも同じであった。
Oracleのトリガーカスケードの最大値が32という制限値が正しい?!としても私が普段利用するプラットフォームでは49で正解のようだ。

9

以下、Windows XP Professional(32bit)上のログ

SCOTT> 
SCOTT>
SCOTT> create table master(seq# number);

表が作成されました。

SCOTT> create sequence master_seq
2 start with 1
3 increment by 1
4 nocache
5 noorder;

順序が作成されました。

SCOTT>
SCOTT> create or replace trigger ins_cascade_test
2 after insert on master
3 begin
4 insert into master values(master_seq.nextval);
5 end;
6 /

トリガーが作成されました。

SCOTT>
SCOTT> select last_number
2 from user_sequences
3 where sequence_name = 'MASTER_SEQ';

LAST_NUMBER
-----------
1

SCOTT>
SCOTT> insert into master values(-100);
insert into master values(-100)
*
行1でエラーが発生しました。:
ORA-00036: 再帰的SQLレベルの最大値(50)を超えました ORA-06512:
"SCOTT.INS_CASCADE_TEST", 行2
ORA-04088: トリガー'SCOTT.INS_CASCADE_TEST'の実行中にエラーが発生しました ORA-06512:
"SCOTT.INS_CASCADE_TEST", 行2
ORA-04088: トリガー'SCOTT.INS_CASCADE_TEST'の実行中にエラーが発生しました ORA-06512:
"SCOTT.INS_CASCADE_TEST", 行2
ORA-04088: トリガー'SCOTT.INS_CASCADE_TEST'の実行中にエラーが発生しました ORA-06512:
"SCOTT.INS_CASCADE_TEST", 行2
ORA-04088: トリガー'SCOTT.INS_CASCADE_TEST'の実行中にエラーが発生しました ORA-06512:
"SCOTT.INS_CASCADE_TEST", 行2
ORA-04088: トリガー'SCOTT.INS_CASCADE_TEST'の実行中にエラーが発生しました ORA-06512:
"SCOTT.INS_CASCADE_TEST", 行2
ORA-04088: トリガー'SCOTT.INS_CASCADE_TEST'の実行中にエラーが発生しました ORA-06512:
"SCOTT.INS_CASCADE_TEST", 行2
ORA-04088: トリガー'SCOTT.INS_CASCADE_TEST'の実行中にエラーが発生しました ORA-06512:


SCOTT>
SCOTT> select last_number
2 from user_sequences
3 where sequence_name = 'MASTER_SEQ';

LAST_NUMBER
-----------
51

SCOTT>


ところで半年振りに起動した自宅のWindowsマシンのコードレスキーボードが壊れたらしく、仕方ないのでRDCをダウンロードしてMacOSXから利用することに。。。。


7

| | コメント (0) | トラックバック (0)

2008年9月 5日 (金)

トリガーカスケード制限 #2

さて、前回のつづき。

今回は無限ループする(実際にはしませんけど)させずにトリガーカスケード制現値を確認する。(前回の実験でも十分なんですが。。)

環境は前回と同じです。

シナリオ1

32テーブルに1トリガー/表で32のINSERTトリガーを定義し正しく動作することを確認する。(カスケード制現値が49のようなのでトリガーの32連鎖では問題ないはず!)

33テーブルを作成しておく。

SCOTT> l
1 begin
2 for seq in 1..33 loop
3 execute immediate 'create table t'||to_char(seq,'FM09')|| ' (seq# number)';
4 end loop;
5* end;
SCOTT> /

PL/SQLプロシージャが正常に完了しました。

SCOTT> select table_name from user_tables where table_name like 'T%' order by table_name;

TABLE_NAME
------------------------------
T01
T02
T03
T04

・・・・中略・・・・

T30
T31
T32
T33

33行が選択されました。

SCOTT>

作成した各表に1つづつ32のトリガーを定義する。
ちなみに、イメージとしては親表にINSERT文が発行されるとトリガーが起動し子表へデータをINSERTする。以下、子表へのINSERT文でトリガーが起動し孫表へINSERT....の繰り返しでトリガーを32回起動させる。

SCOTT> l
1 declare
2 ddlstr constant varchar2(1000)
3 := 'create or replace trigger trg__$$seq$$__'
4 || ' after insert on t__$$seq$$__ '
5 || ' for each row '
6 || 'begin'
7 || ' insert into t__$$nextSeq$$__ values(:new.seq# + 1); '
8 || 'end;';
9 wkstr varchar2(2000);
10 begin
11 for seq in 1..32 loop
12 wkstr := replace(
13 replace(
14 ddlstr,'__$$seq$$__',to_char(seq,'FM09')
15 ),
16 '__$$nextSeq$$__',
17 to_char(seq+1,'FM09')
18 );
19 -- dbms_output.put_line(wkstr);
20 execute immediate wkstr;
21 end loop;
22* end;
SCOTT> /

PL/SQLプロシージャが正常に完了しました。

SCOTT>
SCOTT> l
1 select text
2 from all_source
3 where name like 'TRG__'
4 and type = 'TRIGGER'
5* order by name,line
SCOTT> /

TEXT
--------------------------------------------------------------------------------
trigger trg01 after insert on t01 for each row begin insert into t02 values(
:new.seq# + 1); end;

trigger trg02 after insert on t02 for each row begin insert into t03 values(
:new.seq# + 1); end;

trigger trg03 after insert on t03 for each row begin insert into t04 values(
:new.seq# + 1); end;

・・・・中略・・・・

trigger trg30 after insert on t30 for each row begin insert into t31 values(
:new.seq# + 1); end;

trigger trg31 after insert on t31 for each row begin insert into t32 values(
:new.seq# + 1); end;

trigger trg32 after insert on t32 for each row begin insert into t33 values(
:new.seq# + 1); end;


32行が選択されました。

SCOTT>

実行!

SCOTT> insert into t01 values(1);

1行が作成されました。

SCOTT>

正常にINSERTできたようですね。

SCOTT> set serveroutput on size 10000
SCOTT> l
1 declare
2 seq# number;
3 begin
4 for i in 1..33 loop
5 execute immediate 'select * from t'||to_char(i,'fm09') into seq#;
6 dbms_output.put_line('T'||to_char(i,'fm09')||':'||to_char(seq#));
7 end loop;
8* end;
SCOTT> /
T01:1
T02:2
T03:3

・・・・中略・・・・

T31:31
T32:32
T33:33

PL/SQLプロシージャが正常に完了しました。

SCOTT>

シナリオ2

33テーブルに1トリガー/表で33のINSERTトリガーを定義し正しく動作することを確認する。(カスケード制現値が49のようなのでトリガーの33連鎖でも問題ないはず!)


さきほどのデータはじゃまなのでロールバックしておく。

SCOTT> rollback;

ロールバックが完了しました。


テーブルとトリガーを各1つ追加作成し、トリガーを33連鎖させる。

SCOTT> create table t34 as select * from t33;

表が作成されました。

SCOTT> l
1* create or replace trigger trg33 after insert on t33 for each row begin insert into t34 values(:new.seq# + 1); end;
SCOTT>

SCOTT> l
1 select text
2 from all_source
3 where name like 'TRG__'
4 and type = 'TRIGGER'
5* order by name,line
SCOTT> /

TEXT
--------------------------------------------------------------------------------
trigger trg01 after insert on t01 for each row begin insert into t02 values(
:new.seq# + 1); end;

trigger trg02 after insert on t02 for each row begin insert into t03 values(
:new.seq# + 1); end;


・・・・中略・・・・


trigger trg32 after insert on t32 for each row begin insert into t33 values(
:new.seq# + 1); end;

trigger trg33 after insert on t33 for each row begin insert into t34 values(:new
.seq# + 1); end;


33行が選択されました。

SCOTT>


どうなりますか!。実行してみる。

SCOTT> insert into t01 values(1);

1行が作成されました。

SCOTT>

トリガーの33連鎖は無事終了。

SCOTT> l
1 declare
2 seq# number;
3 begin
4 for i in 1..34 loop
5 execute immediate 'select * from t'||to_char(i,'fm09') into seq#;
6 dbms_output.put_line('T'||to_char(i,'fm09')||':'||to_char(seq#));
7 end loop;
8* end;
SCOTT> /
T01:1
T02:2
T03:3

・・・・中略・・・・

T31:31
T32:32
T33:33
T34:34

PL/SQLプロシージャが正常に完了しました。

SCOTT>


シナリオ3

50テーブルに1トリガー/表でINSERTトリガーを定義し正しく動作することを確認する。(カスケード制現値が49のようなのでトリガーの50連鎖ではエラーがになるはず!)

SCOTT> rollback;

ロールバックが完了しました。

SCOTT> l
1 begin
2 for i in 35..52 loop
3 execute immediate 'create table t'||to_char(i,'fm09')|| ' as select * from t34';
4 end loop;
5* end;
SCOTT> /

PL/SQLプロシージャが正常に完了しました。

SCOTT>
SCOTT> l
1 declare
2 ddlstr constant varchar2(1000)
3 := 'create or replace trigger trg__$$seq$$__'
4 || ' after insert on t__$$seq$$__ '
5 || ' for each row '
6 || 'begin'
7 || ' insert into t__$$nextSeq$$__ values(:new.seq# + 1); '
8 || 'end;';
9 wkstr varchar2(2000);
10 begin
11 for seq in 34..50 loop
12 wkstr := replace(
13 replace(
14 ddlstr,'__$$seq$$__',to_char(seq,'FM09')
15 ),
16 '__$$nextSeq$$__',
17 to_char(seq+1,'FM09')
18 );
19 -- dbms_output.put_line(wkstr);
20 execute immediate wkstr;
21 end loop;
22* end;
SCOTT> /

PL/SQLプロシージャが正常に完了しました。

SCOTT>
SCOTT> l
1 select text
2 from all_source
3 where name like 'TRG__'
4 and type = 'TRIGGER'
5* order by name,line
SCOTT> /

TEXT
--------------------------------------------------------------------------------
trigger trg01 after insert on t01 for each row begin insert into t02 values(
:new.seq# + 1); end;

trigger trg02 after insert on t02 for each row begin insert into t03 values(
:new.seq# + 1); end;

trigger trg03 after insert on t03 for each row begin insert into t04 values(
:new.seq# + 1); end;

・・・・中略・・・・

trigger trg48 after insert on t48 for each row begin insert into t49 values(
:new.seq# + 1); end;

trigger trg49 after insert on t49 for each row begin insert into t50 values(
:new.seq# + 1); end;

trigger trg50 after insert on t50 for each row begin insert into t51 values(
:new.seq# + 1); end;


50行が選択されました。

SCOTT>


では実行!

SCOTT> insert into t01 values(1);
insert into t01 values(1)
*
行1でエラーが発生しました。:
ORA-00036: 再帰的SQLレベルの最大値(50)を超えました ORA-06512:
"SCOTT.TRG50", 行1
ORA-04088: トリガー'SCOTT.TRG50'の実行中にエラーが発生しました ORA-06512:
"SCOTT.TRG49", 行1
ORA-04088: トリガー'SCOTT.TRG49'の実行中にエラーが発生しました ORA-06512:
"SCOTT.TRG48", 行1
ORA-04088: トリガー'SCOTT.TRG48'の実行中にエラーが発生しました ORA-06512:
"SCOTT.TRG47", 行1
ORA-04088: トリガー'SCOTT.TRG47'の実行中にエラーが発生しました ORA-06512:
"SCOTT.TRG46", 行1
ORA-04088: トリガー'SCOTT.TRG46'の実行中にエラーが発生しました ORA-06512:
"SCOTT.TRG45", 行1
ORA-04088: トリガー'SCOTT.TRG45'の実行中にエラーが発生しました ORA-06512:
"SCOTT.TRG44", 行1
ORA-04088: トリガー'SCOTT.TRG44'の実行中にエラーが発生しました ORA-06512:
"SCOTT.TRG43", 行1
ORA-04088: トリガー'SCOTT.TRG43'の実行中にエラーが発生しました ORA-06512:
"SCOTT.TRG42", 行1
ORA-04088: トリガ


SCOTT>

おおお〜〜〜。 :) でましたね。トリガーを50連鎖させたところで制限を超えたようだ。

最後に、トリガーを49連鎖させることが可能なことを確認しておく。

シナリオ4

49テーブルに1トリガー/表で49のINSERTトリガーを定義し正しく動作することを確認する。(カスケード制現値が49のようなのでトリガーの49連鎖は正常に実行できるはず!)

SCOTT> alter trigger trg50 disable;

トリガーが変更されました。

SCOTT>
SCOTT> l
1 select count(src.text)
2 from
3 all_source src join user_triggers trg
4 on src.name = trg.trigger_name
5 where
6 src.name like 'TRG__'
7 and src.type = 'TRIGGER'
8 and trg.status = 'ENABLED'
9 order by
10 src.name,
11* src.line
SCOTT> /

COUNT(SRC.TEXT)
---------------
49

SCOTT>
SCOTT> rollback;

ロールバックが完了しました。

SCOTT> insert into t01 values(1);

1行が作成されました。

SCOTT>

ということで、Linux(32bit)環境ではトリガーカスケード最大値は49ということになる。

Windowsや32bit/64bitで違いはあるのだろうか??? 違いが無かったらマニュアルが間違っているということか?!・・・・・・。別途調査予定。

| | コメント (0) | トラックバック (0)

2008年7月20日 (日)

ORA-01722がエラーメッセージマニュアルに記載されていない怪

2014/5/12追記
Oracle11g R2以降のエラーメッセージマニュアルには、ORA-01722が記載されています。




さて、随分間が空いてしまいましたがしばらくはこんなベースでしょうおそらく。

先日、珍しいオラクルエラーに遭遇している方をフォローしたこともあり案外ハマる方も多いのかなぁ。と思いそんな方々の為の備忘録ということで書いておきましょう。


Oracle11gより前のリリースでも同じ結果になるのでOracleのバージョンはどうでもいいのですが、とりあえず最新ですよ。ということで。

SCOTT> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Linux: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

ある方がプロシージャの実行時に以下のようなエラーで悩んでいた。

SCOTT> exec sample1722(10);
Department Name : ACCOUNTING
BEGIN sample1722(10); END;

*
行1でエラーが発生しました。:
ORA-01722: 数値が無効です。
ORA-06512: "SCOTT.SAMPLE1722", 行6
ORA-06512: 行1

本人は自分のプログラムのどこが悪いのか、ORA-01722が何故起きているか理解できていない模様。。。
実は、ORA-01722ってエラーメッセージはシンプルなんですが、オラクルのマニュアルには記載されていないのですよ。(ず〜〜〜〜〜と昔から。。)

unix系の環境でOracleをお使いになっているのなら以下のようにして確認してもちゃんと返ってくる。しかし解決方法も理由も記載されていない。。。www

SCOTT> !oerr ora 1722
01722, 00000, "invalid number"
// *Cause:
// *Action:

以下、Oracle Database Error Messages 11g Release 1 (11.1) より引用
24

実はこのエラー、そのまんまのエラーなのです。
コードは簡単にしてありますが、以下の6行目のような間違いを犯していたのです。

SCOTT> l
1 create or replace procedure sample1722(in_deptno number)
2 is
3 begin
4 for dept_rec in (select * from dept where deptno = in_deptno) loop
5 dbms_output.put_line('Department Name : '||dept_rec.dname);
6 for emp_rec in (select * from emp where deptno = dept_rec.dname order by sal desc) loop
7 dbms_output.put_line('===>'||emp_rec.ename||':'||to_char(emp_rec.sal));
8 end loop;
9 end loop;
10* end;
SCOTT> list 6
6* for emp_rec in (select * from emp where deptno = dept_rec.dname order by sal desc) loop
SCOTT>
SCOTT>

もうお分かりですよね。emp表のdeptno列はNUMBER型、dept表のdname列はVARCHAR2型、ということでVARCHAR2=>NUMBERへの暗黙の型変換が発生し数字文字以外の文字を数値へ変換しようとしてエラーが発生しているわけです。

SCOTT> desc emp
名前 NULL? 型
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)

SCOTT> desc dept
名前 NULL? 型
----------------------------------------- -------- ----------------------------
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)

SCOTT>
SCOTT>


以下の例を見れば一目瞭然ですよね。

SCOTT> select * from emp where deptno = 'AA';
select * from emp where deptno = 'AA'
*
行1でエラーが発生しました。:
ORA-01722: 数値が無効です。


もっと分かり易くすると。。。

SCOTT> select * from emp where deptno = to_number('AA');
select * from emp where deptno = to_number('AA');
*
行1でエラーが発生しました。:
ORA-01722: 数値が無効です。


という単純なミスだったわけです。正しく修正して実行すれば以下の通り。

SCOTT> l
1 create or replace procedure sample1722(in_deptno number)
2 is
3 begin
4 for dept_rec in (select * from dept where deptno = in_deptno) loop
5 dbms_output.put_line('Department Name : '||dept_rec.dname);
6 for emp_rec in (select * from emp where deptno = dept_rec.deptno order by sal desc) loop
7 dbms_output.put_line('===>'||emp_rec.ename||':'||to_char(emp_rec.sal));
8 end loop;
9 end loop;
10* end;
SCOTT> /

プロシージャが作成されました。

SCOTT> exec sample1722(10);
Department Name : ACCOUNTING
===>KING:5000
===>CLARK:2450
===>MILLER:1300

PL/SQLプロシージャが正常に完了しました。

SCOTT>

暗黙の型変換にはご注意を。
黙の型変換はしないように! とコーディング規約で定めているプロジェクトがほとんどだと思うけど、目視オンリーのレビューだとこの手のはすり抜けることも多いだろうね。今回のように変換エラーになる場合ならテストで発見し易いと思うけど、はっきり現れない嫌らしい暗黙の型変換もあるからね。;)

| | コメント (1) | トラックバック (0)

2008年6月29日 (日)

Mac de Ruby on Rails - #14 - IntelMac編 #5

さて、準備は整ったのでサンプルを作ってみましょう。利用するのはSCOTTスキーマのemp表。

Macintosh:test discus$ rails -d oracle emp_list
create
create app/controllers
create app/helpers
create app/models
create app/views/layouts
create config/environments
create config/initializers
create db
create doc
create lib

・・・・・・中略・・・・・・

create public/favicon.ico
create public/robots.txt
create public/images/rails.png
create public/javascripts/prototype.js
create public/javascripts/effects.js
create public/javascripts/dragdrop.js
create public/javascripts/controls.js
create public/javascripts/application.js
create doc/README_FOR_APP
create log/server.log
create log/production.log
create log/development.log
create log/test.log
Macintosh:test discus$
Macintosh:test discus$

scaffoldを使ってサンプルを作ってみます。
database.ymlの編集なども以前の記事と同じなので省略しますね。)

Macintosh:test discus$ vi emp_list/config/database.yml
Macintosh:test discus$
Macintosh:test discus$
Macintosh:test discus$ cd emp_list
Macintosh:emp_list discus$ rails ruby script/generate scaffold Emp ename:string job:string mgr:integer hiredate:date sal:integer
create
create app/controllers
create app/helpers
create app/models
create app/views/layouts
create config/environments
create config/initializers
create db
create doc
create lib
create lib/tasks
create log

・・・・・・中略・・・・・・

create public/500.html
create public/index.html
create public/favicon.ico
create public/robots.txt
create public/images/rails.png
create public/javascripts/prototype.js
create public/javascripts/effects.js
create public/javascripts/dragdrop.js
create public/javascripts/controls.js
create public/javascripts/application.js
create doc/README_FOR_APP
create log/server.log
create log/production.log
create log/development.log
create log/test.log
Macintosh:emp_list discus$ ruby script/server
=> Booting Mongrel (use 'script/server webrick' to force WEBrick)
=> Rails 2.1.0 application starting on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
** Starting Mongrel listening at 0.0.0.0:3000
** Starting Rails with development environment...
** Rails loaded.
** Loading any Rails specific GemPlugins
** Signals ready. TERM => stop. USR2 => restart. INT => stop (no restart).
** Rails signals registered. HUP => reload (without restart). It might not work well.
** Mongrel 1.1.4 available at 0.0.0.0:3000
** Use CTRL-C to stop.

でアクセスしてみると。。。でました〜。これでIntelMac上でもRoRからOracleへアクセスできるようになりました〜〜。:-)

Ror

Scaffold




バックナンバー:
Mac de Ruby on Rails - #10 - IntelMac編 #1
Mac de Ruby on Rails - #11 - IntelMac編 #2
Mac de Ruby on Rails - #12 - IntelMac編 #3
Mac de Ruby on Rails - #13 - IntelMac編 #4


| | コメント (0) | トラックバック (0)

2008年6月22日 (日)

Mac de Ruby on Rails - #13 - IntelMac編 #4

前回のつづき旧バージョンが悪さをしているようなのでこの際、残っている古いバージョンをuninstallしてしまえ! ということに。
尚、Leopardでは事前にRoRが/System/Library/Frameworks/Ruby.framework/以下にインストールされている。


Macintosh:test discus$ sudo gem uninstall activerecord --install-dir=/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8

Select gem to uninstall:
1. activerecord-1.15.3
2. activerecord-1.15.6
3. activerecord-2.1.0
4. All versions
> 2

You have requested to uninstall the gem:
activerecord-1.15.6
actionwebservice-1.2.6 depends on [activerecord (= 1.15.6)]
rails-1.2.6 depends on [activerecord (= 1.15.6)]
If you remove this gems, one or more dependencies will not be met.
Continue with Uninstall? [Yn] Y
Successfully uninstalled activerecord-1.15.6
Macintosh:test discus$ ruby test.rb
/Library/Ruby/Site/1.8/rubygems.rb:139:in `activate': can't activate activerecord (= 1.15.3), already activated activerecord-2.1.0] (Gem::Exception)
from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:31:in `require'
from /Library/Ruby/Gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:509:in `require'
from /Library/Ruby/Gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:354:in `new_constants_in'
from /Library/Ruby/Gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:509:in `require'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.1.0/lib/active_record/connection_adapters/abstract/connection_specification.rb:230:in `establish_connection'
from test.rb:8
Macintosh:test discus$ sudo gem uninstall activerecord --install-dir=/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8

Select gem to uninstall:
1. activerecord-1.15.3
2. activerecord-2.1.0
3. All versions
> 1

You have requested to uninstall the gem:
activerecord-1.15.3
actionwebservice-1.2.3 depends on [activerecord (= 1.15.3)]
rails-1.2.3 depends on [activerecord (= 1.15.3)]
If you remove this gems, one or more dependencies will not be met.
Continue with Uninstall? [Yn] Y
Successfully uninstalled activerecord-1.15.3
Macintosh:test discus$ ruby test.rb
/Library/Ruby/Gems/1.8/gems/activerecord-2.1.0/lib/active_record/connection_adapters/abstract/connection_specification.rb:232:in `establish_connection': Please install the oracle adapter:
`gem install activerecord-oracle-adapter` (no such file to load -- active_record/connection_adapters/oracle_adapter) (RuntimeError)
from test.rb:8
Macintosh:test discus$
Macintosh:test discus$

お〜〜〜、忘れていました。 oracle_adapter.rbを。

ということで、oracle_adapter.rbをダウンロード後、/Library/Ruby/Gems/1.8/gems/activerecord-2.1.0/lib/active_record/connection_adapters以下へコピー。

Macintosh:test discus$ 
Macintosh:test discus$ curl -O http://svn.rubyonrails.org/rails/adapters/oracle/lib/active_record/connection_adapters/oracle_adapter.rb
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 27847 100 27847 0 0 28714 0 --:--:-- --:--:-- --:--:-- 66645
Macintosh:test discus$ ll
total 64
drwxr-xr-x 15 discus staff 510 6 14 07:31 emp_list
-rw-r--r-- 1 discus staff 27847 6 14 09:43 oracle_adapter.rb
-rw-r--r-- 1 discus staff 325 6 14 09:13 test.rb
Macintosh:test discus$ sudo cp oracle_adapter.rb /Library/Ruby/Gems/1.8/gems/activerecord-2.1.0/lib/active_record/connection_adapters
Password:
Macintosh:test discus$
Macintosh:test discus$


再度、テストプログラムを実行。

Macintosh:test discus$ ruby test.rb
7934, MILLER,CLERK

動いた!。
ということで次回へつづく。


バックナンバー:
Mac de Ruby on Rails - #10 - IntelMac編 #1
Mac de Ruby on Rails - #11 - IntelMac編 #2
Mac de Ruby on Rails - #12 - IntelMac編 #3

| | コメント (0) | トラックバック (0)

2008年6月21日 (土)

Mac de Ruby on Rails - #12 - IntelMac編 #3

さて、少々間が空いてしまったがこれから暫くは土日中心に記事をアップすることが多くなるかも。(おチビちゃんの世話などいろいろあるのでね。w 土日に1週間分のネタを時間指定公開しるようにしておいてもよいかもしれないが、そのネタを纏めてる時間がなかなか取れない。く〜〜〜っ。という感じ。)

と長い前置きはこれくらいにして、本題です。前回は、ruby-oci8をインストールしたところまでだった。(自分でも忘れてる。。)
今日は確認のため以前PPC版の時も使ったテストコードでオラクルへアクセスできるか確認しておくことにする。

以下、PPC版の時と同じなのでさらりとながします。。

Macintosh:˜ discus$ mkdir test
Macintosh:˜ discus$ cd test
Macintosh:test discus$ rails -d oracle emp_list
create
create app/controllers
create app/helpers
create app/models
create app/views/layouts
create config/environments
create config/initializers
create db
create doc
create lib
create lib/tasks
create log

・・・・中略・・・・

create public/javascripts/controls.js
create public/javascripts/application.js
create doc/README_FOR_APP
create log/server.log
create log/production.log
create log/development.log
create log/test.log
Macintosh:test discus$

database.ymlを編集。編集内容は見ての通り。


Macintosh:test discus$
Macintosh:test discus$ vi emp_list/config/database.yml
Macintosh:test discus$ cat emp_list/config/database.yml
# Oracle/OCI 8i, 9, 10g
#
# Requires Ruby/OCI8:
# http://rubyforge.org/projects/ruby-oci8/
#
# Specify your database using any valid connection syntax, such as a
# tnsnames.ora service name, or a SQL connect url string of the form:
#
# //host:[port][/service name]
#
# By default prefetch_rows (OCI_ATTR_PREFETCH_ROWS) is set to 100. And
# until true bind variables are supported, cursor_sharing is set by default
# to 'similar'. Both can be changed in the configation below; the defaults
# are equivalent to specifying:
#
# prefetch_rows: 100
# cursor_sharing: similar
#

development:
adapter: oracle
database: lampeye
username: scott
password: tiger

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
adapter: oracle
database: lampeye
username: test
password: test

production:
adapter: oracle
database: lampeye
username: sample
password: sampleadmin

テストコードも以前作ったコードを使い回し。

Macintosh:test discus$ vi test.rb
Macintosh:test discus$
Macintosh:test discus$
Macintosh:test discus$ cat test.rb
require 'rubygems'
require 'active_record'

class Emp < ActiveRecord::Base
set_table_name "EMP"
end

ActiveRecord::Base.establish_connection(
:adapter => "oracle",
:database => "lampeye",
:username => "scott",
:password => "tiger"
)

emp = Emp.find(:first,:conditions =>["ENAME = ?", "MILLER"])
puts "#{ emp.empno}, #{ emp.ename}, #{emp.job}, #{emp.hiredate}"
Macintosh:test discus$
Macintosh:test discus$ ruby test.rb
/Library/Ruby/Site/1.8/rubygems.rb:139:in `activate': can't activate activerecord (= 1.15.6), already activated
ctiverecord-2.1.0]
(Gem::Exception)
from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:31:in `require'
from /Library/Ruby/Gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:509:in `require'
from /Library/Ruby/Gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:354:in `new_constants_in'
from /Library/Ruby/Gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:509:in `require'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.1.0/lib/active_record/connection_adapters/abstract/connection_specification.rb:230:in
establish_connection'
from test.rb:8


エラーメッセージをみると、activerecord-1.15.6なんてのが悪さしているようだ。。。

Macintosh:test discus$
Macintosh:test discus$ gem li

*** LOCAL GEMS ***

actionmailer (2.1.0, 1.3.6, 1.3.3)
actionpack (2.1.0, 1.13.6, 1.13.3)
actionwebservice (1.2.6, 1.2.3)
activerecord (2.1.0, 1.15.6, 1.15.3) activeresource (2.1.0)
activesupport (2.1.0, 1.4.4, 1.4.2)
acts_as_ferret (0.4.1)

・・・・中略・・・・
<
ruby-yadis (0.3.4)
rubygems-update (1.1.1)
rubynode (0.1.3)
sources (0.0.1)
sqlite3-ruby (1.2.1)
termios (0.9.4)

Macintosh:test discus$
Macintosh:test discus$

ということで、どうやら古いactiverecordが悪さしているらしい。。というところまでは分かった。。。uninstallすればいいらしい。どうやるか調べとく。=>TODO

ということで次回へ続く。




バックナンバー:
Mac de Ruby on Rails - #10 - IntelMac編 #1
Mac de Ruby on Rails - #11 - IntelMac編 #2


| | コメント (0) | トラックバック (0)

2008年6月15日 (日)

Mac de Ruby on Rails - #11 - IntelMac編 #2

さて、つづきです。ruby-oci8をインストールする。(ruby-oci8は、1.0.0を事前にダウンロードしておいた。尚、本記事を書いている時点では、1.0.1が最新。)

まず、make。

Macintosh:˜ discus$ ll
total 216
drwx------+ 32 discus staff 1088 6 8 23:25 Desktop
drwx------+ 10 discus staff 340 1 3 01:32 Documents
drwx------+ 14 discus staff 476 6 8 23:26 Downloads
drwxr-xr-x 10 discus staff 340 12 19 16:03 Image Browser
drwxr-xr-x 10 discus staff 340 12 19 16:57 Image Kit Browser
drwx------+ 32 discus staff 1088 3 1 14:07 Library
drwx------+ 3 discus staff 102 11 26 2007 Movies
drwx------+ 4 discus staff 136 2 2 11:12 Music
drwx------+ 9 discus staff 306 6 14 05:21 Pictures
drwxr-xr-x+ 5 discus staff 170 11 26 2007 Public
drwxr-xr-x+ 5 discus staff 170 11 26 2007 Sites
drwxr-xr-x 16 discus staff 544 11 25 2007 ruby-oci8-1.0.0
-rw-r--r-- 1 discus staff 107494 3 2 02:27 ruby-oci8-1.0.0.tar.gz
Macintosh:˜ discus$ cd ruby-oci8-1.0.0
Macintosh:ruby-oci8-1.0.0 discus$ make
ruby setup.rb config
---> lib
---> lib/DBD
---> lib/DBD/OCI8
<--- lib/DBD/OCI8
<--- lib/DBD
<--- lib
---> ext
---> ext/oci8
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby /Users/discus/ruby-oci8-1.0.0/ext/oci8/extconf.rb
checking for load library path... (DYLD_LIBRARY_PATH)...
found: /Users/Shared/OracleInstantClient/libclntsh.dylib.10.1 looks like an instant client.
checking for cc... ok
checking for gcc... yes
checking for LP64... no
checking for ruby header... ok
checking for OCIInitialize() in oci.h... no
---------------------------------------------------
error messages:
Could not compile with Oracle instant client.
You may need to set a environment variable:
DYLD_LIBRARY_PATH=/Users/Shared/OracleInstantClient
export DYLD_LIBRARY_PATH

---------------------------------------------------
See:
* http://ruby-oci8.rubyforge.org/ja/HowToInstall.html
* http://ruby-oci8.rubyforge.org/ja/ReportInstallProblem.html

*** /Users/discus/ruby-oci8-1.0.0/ext/oci8/extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.

Provided configuration options:
--with-opt-dir
--without-opt-dir
--with-opt-include
--without-opt-include=${opt-dir}/include
--with-opt-lib
--without-opt-lib=${opt-dir}/lib
--with-make-prog
--without-make-prog
--srcdir=/Users/discus/ruby-oci8-1.0.0/ext/oci8
--curdir
--ruby=/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
--with-instant-client
--without-instant-client
/Users/discus/ruby-oci8-1.0.0/ext/oci8/oraconf.rb:941:in `initialize': RuntimeError (RuntimeError)
from /Users/discus/ruby-oci8-1.0.0/ext/oci8/oraconf.rb:236:in `new'
from /Users/discus/ruby-oci8-1.0.0/ext/oci8/oraconf.rb:236:in `get'
from /Users/discus/ruby-oci8-1.0.0/ext/oci8/extconf.rb:6
'system /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby /Users/discus/ruby-oci8-1.0.0/ext/oci8/extconf.rb ' failed
Try 'ruby setup.rb --help' for detailed usage.
make: *** [config.save] Error 1
Macintosh:ruby-oci8-1.0.0 discus$

checking for OCIInitialize() in oci.h... noというエラーが出てmakeできない。いろいろ調べてみたら、ruby-oci8 1.0.0はInteli386アーキテクチャのみ有効なようなので、以下のようにコンパイルオプションに"-arch i386"を追加すればインストールできるとのこと。
以下のサイトを参考にさせてもらった。
http://blog.rayapps.com/2008/04/24/how-to-setup-ruby-and-new-oracle-instant-client-on-leopard/

ということで再make。

Macintosh:ruby-oci8-1.0.0 discus$ export ARCHFLAGS="-arch i386"
Macintosh:ruby-oci8-1.0.0 discus$ make
ruby setup.rb config
---> lib
---> lib/DBD
---> lib/DBD/OCI8
<--- lib/DBD/OCI8
<--- lib/DBD
<--- lib
---> ext
---> ext/oci8
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby /Users/discus/ruby-oci8-1.0.0/ext/oci8/extconf.rb
checking for load library path... (DYLD_LIBRARY_PATH)...
found: /Users/Shared/OracleInstantClient/libclntsh.dylib.10.1 looks like an instant client.
checking for cc... ok
checking for gcc... yes
checking for LP64... no
checking for ruby header... ok
checking for OCIInitialize() in oci.h... yes
checking for OCIEnvCreate()... yes
checking for OCITerminate()... yes
checking for OCILobOpen()... yes
checking for OCILobClose()... yes
checking for OCILobCreateTemporary()... yes
checking for OCILobGetChunkSize()... yes
checking for OCILobLocatorAssign()... yes
creating ../../lib/oci8.rb from /Users/discus/ruby-oci8-1.0.0/ext/oci8/../../lib/oci8.rb.in
creating extconf.h
creating Makefile
<--- ext/oci8
<--- ext
ruby setup.rb setup
---> lib
---> lib/DBD
---> lib/DBD/OCI8
<--- lib/DBD/OCI8
<--- lib/DBD
<--- lib
---> ext
---> ext/oci8
make
gcc -I. -I. -I/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/universal-darwin9.0 -I/Users/discus/ruby-oci8-1.0.0/ext/oci8 -DRUBY_EXTCONF_H=\"extconf.h\" -fno
-common -arch i386 -Os -pipe -fno-common -I/Users/Shared/OracleInstantClient/sdk/include -Wall -c oci8.c

・・・・中略・・・・

cc -arch i386 -pipe -bundle -undefined dynamic_lookup -o oci8lib.bundle oci8.o handle.o const.o env.o error.o svcctx.o server.o session.o
stmt.o define.o bind.o describe.o descriptor.o param.o lob.o oradate.o oranumber.o ocinumber.o attr.o -L"." -L"/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib" -L.
-arch i386 -lruby -L/Users/Shared/OracleInstantClient -lclntsh -lpthread -ldl -lm
<--- ext/oci8
<--- ext
Macintosh:ruby-oci8-1.0.0 discus$
Macintosh:ruby-oci8-1.0.0 discus$ sudo make install
Password:
ruby setup.rb install
---> lib
mkdir -p /Library/Ruby/Site/1.8/
install oci8.rb /Library/Ruby/Site/1.8/
---> lib/DBD
mkdir -p /Library/Ruby/Site/1.8/DBD
---> lib/DBD/OCI8
mkdir -p /Library/Ruby/Site/1.8/DBD/OCI8
install OCI8.rb /Library/Ruby/Site/1.8/DBD/OCI8
<--- lib/DBD/OCI8
<--- lib/DBD
<--- lib
---> ext
---> ext/oci8
mkdir -p /Library/Ruby/Site/1.8/universal-darwin9.0/.
install oci8lib.bundle /Library/Ruby/Site/1.8/universal-darwin9.0/.
<--- ext/oci8
<--- ext
Macintosh:ruby-oci8-1.0.0 discus$


少々注意する点はあるがそれ以外は順調、順調。


バックナンバー:Mac de Ruby on Rails - #10 - IntelMac編 #1

| | コメント (0) | トラックバック (0)

2008年6月14日 (土)

Mac de Ruby on Rails - #10 - IntelMac編 #1

さて、やっと時間ができたので前回Leopard(IntelMac)のRosettaで動作させていたOracle Instant Client 10g R1 10.1.0.3.0 for MacOSX(PPC)からネイディブで動作するOracle Instant Client 10g R2 10.2.0.4.0 for MacOSX(Intel x86)へ入れ替えたのもこれをやるための準備。


Mac OS X 10.5.1 Leopard (Intel x86)にはRuby/Ruby on Railsがインストールされている。やっとx86ネイティブなOracle Instant Client for MacOSX(intel x86)がリリースされたのだからその環境を整えておかないと。。。というのがその理由。

では早速。今日は、Ruby on RailsとRubyGemsをアップデートするまで。

まずは、MacOSXの環境

Macintosh:˜ discus$ uname -a
Darwin Macintosh.local 9.3.0 Darwin Kernel Version 9.3.0: Fri May 23 00:49:16 PDT 2008; root:xnu-1228.5.18~1/RELEASE_I386 i386
Macintosh:˜ discus$
Macintosh:˜ discus$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.5.3
BuildVersion: 9D34
Macintosh:˜ discus$ /usr/sbin/system_profiler SPApplicationsDataType | grep Xcode

Xcode:
Get Info String: Xcode version 3.1
Location: /Developer/Applications/Xcode.app

次はRuby関連のバージョン確認(プレインストールされているRailsは2.xではなく、1.2.6なので今回は、2.1へアップデート RubyGemsもついでにアップデートしておく。)

Last login: Sat Jun 14 05:18:31 on console
Macintosh:˜ discus$ ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]
Macintosh:˜ discus$ rails -v
Rails 1.2.6
Macintosh:˜ discus$ gem -v
1.0.1
Macintosh:˜ discus$
Macintosh:˜ discus$


では、railsのアップデートから。

Macintosh:˜ discus$
Macintosh:˜ discus$ sudo gem install rails --include-dependencies
Password:
INFO: `gem install -y` is now default and will be removed
INFO: use --ignore-dependencies to install only the gems you list
Bulk updating Gem source index for: http://gems.rubyforge.org
Successfully installed rake-0.8.1
Successfully installed activesupport-2.1.0
Successfully installed activerecord-2.1.0
Successfully installed actionpack-2.1.0

・・・・中略・・・・

Installing RDoc documentation for rake-0.8.1...
Installing RDoc documentation for activesupport-2.1.0...
Installing RDoc documentation for activerecord-2.1.0...
Installing RDoc documentation for actionpack-2.1.0...
Installing RDoc documentation for actionmailer-2.1.0...
Installing RDoc documentation for activeresource-2.1.0...
Macintosh:˜ discus$
Macintosh:˜ discus$

うまくいったようだ。。:)


お次は、RubyGemsのアップデート

Macintosh:˜ discus$
Macintosh:˜ discus$ sudo gem update --system
Updating RubyGems...
Attempting remote update of rubygems-update
Successfully installed rubygems-update-1.1.1
1 gem installed
Updating version of RubyGems to 1.1.1
Installing RubyGems 1.1.1
mkdir -p /Library/Ruby/Site/1.8/rbconfig
install -c -m 0644 rbconfig/datadir.rb /Library/Ruby/Site/1.8/rbconfig/datadir.rb
mkdir -p /Library/Ruby/Site/1.8/rubygems
install -c -m 0644 rubygems/builder.rb /Library/Ruby/Site/1.8/rubygems/builder.rb
install -c -m 0644 rubygems/command.rb /Library/Ruby/Site/1.8/rubygems/command.rb

・・・・中略・・・・

= Announce: RubyGems Release 1.1.1

Release 1.1.1 fixes some bugs.

Bugs Fixed:

* Gem.prefix now returns non-nil only when RubyGems was installed outside
sitelibdir or libdir.
* The `gem server` gem list now correctly links to gem details.
* `gem update --system` now passes --no-format-executable to setup.rb.
* Gem::SourceIndex#refresh! now works with multiple gem repositories.
* Downloaded gems now go into --install-dir's cache directory.
* Various fixes to downloading gem metadata.
* `gem install --force` now ignores network errors too.
* `gem pristine` now rebuilds extensions.
* `gem update --system` now works on virgin Apple ruby.
* Gem::RemoteFetcher handles Errno::ECONNABORTED.
* Printing of release notes fixed.

For a full list of changes to RubyGems including credits, see the ChangeLog
file.

・・・・中略・・・・

If you find a bug where RubyGems crashes, please provide debug output. You can
do that with `gem --debug the_command`.

== Thanks

Keep those gems coming!

-- Jim & Chad & Eric (for the RubyGems team)


------------------------------------------------------------------------------

RubyGems installed the following executables:
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/gem

If `gem` was installed by a previous RubyGems installation, you may need
to remove it by hand.

RubyGems system software updated
Macintosh:˜ discus$
Macintosh:˜ discus$

こちらも問題なくアップデートできたようだ。


最後にバージョン確認。

Macintosh:˜ discus$
Macintosh:˜ discus$ gem -v
1.1.1
Macintosh:˜ discus$ ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]
Macintosh:˜ discus$ rails -v
Rails 2.1.0
Macintosh:˜ discus$

順調、順調!

今日はここまで、次回へつづく。

| | コメント (0) | トラックバック (0)

2008年6月 8日 (日)

Oracle Instant Client 10g R2 10.2.0.4.0 for IntelMacへ入れ替える

随分前にRosettaを介してOracle Instant Client 10g R1 for PPCがIntelMac上で動作するという記事を書いたが、少々前のこと、やっとIntalMac版Oracle Instant Client 10g R2 10.2.0.4.0 for IntelMacがリリースされたので次のステップへの準備として以前インストールしたPPC版Oracle Instant ClientをIntelMac版に入れ替えておく!

インストール手順などは以前の記事を参考してくださいね。同じですから。

尚、今回は以前のインストールしたPPC版Oracle Instant ClientをIntelMac版と入れ替えるだけなので、PPC版を一旦削除してからIntelMac版のOracle Instant Clientをダウンロード、解凍しただけ。環境変数も以前のままです。

Macintosh:OracleInstantClient discus$ ll
total 211792
-rw-r--r--@ 1 discus wheel 287 3 27 04:38 BASIC_LITE_README
-rw-r--r--@ 1 discus wheel 277 3 27 04:38 BASIC_README
-rw-r--r--@ 1 discus wheel 275 3 27 04:38 JDBC_README
-rw-r--r--@ 1 discus wheel 281 3 27 04:38 SQLPLUS_README
-r--r--r--@ 1 discus wheel 1609607 2 18 03:54 classes12.jar
-rwxr-xr-x@ 1 discus wheel 30556 3 27 04:37 genezi
-r-xr-xr-x@ 1 discus wheel 1525 8 30 2004 glogin.sql
lrwxr-xr-x 1 discus wheel 20 6 8 23:07 libclntsh.dylib -> libclntsh.dylib.10.1
-rwxr-xr-x@ 1 discus wheel 21252860 3 7 09:12 libclntsh.dylib.10.1
-rwxr-xr-x@ 1 discus wheel 31016 2 22 09:02 libheteroxa10.dylib
-rwxr-xr-x@ 1 discus wheel 31016 2 22 09:02 libheteroxa10.jnilib
-rwxr-xr-x@ 1 discus wheel 1638264 3 7 03:09 libnnz10.dylib
lrwxr-xr-x 1 discus wheel 18 6 8 23:07 libocci.dylib -> libocci.dylib.10.1
-rwxr-xr-x@ 1 discus wheel 1111964 3 11 04:49 libocci.dylib.10.1
-rwxr-xr-x@ 1 discus wheel 72626696 3 27 04:38 libociei.dylib
-rwxr-xr-x@ 1 discus wheel 4309524 3 27 04:38 libociicus.dylib
-rwxr-xr-x@ 1 discus wheel 103800 2 22 09:02 libocijdbc10.dylib
-rwxr-xr-x@ 1 discus wheel 103800 2 22 09:02 libocijdbc10.jnilib
-rwxr-xr-x@ 1 discus wheel 865412 2 21 06:53 libsqlplus.dylib
-rwxr-xr-x@ 1 discus wheel 1442316 2 21 06:54 libsqlplusic.dylib
-r--r--r--@ 1 discus wheel 1555682 2 18 03:55 ojdbc14.jar
-r--r--r--@ 1 discus wheel 1646178 1 23 01:28 orai18n.jar
drwxr-xr-x@ 7 discus staff 238 3 27 04:38 sdk
-rwxr-xr-x@ 1 discus wheel 12612 2 21 06:53 sqlplus
-rw-r--r-- 1 discus wheel 225 2 2 10:31 tnsnames.ora
Macintosh:OracleInstantClient discus$
Macintosh:˜ discus$ cat .bashrc
alias ll='ls -lv'

export ORACLE_HOME=/Users/Shared/OracleInstantClient
export NLS_LANG=Japanese_Japan.AL32UTF8
export DYLD_LIBRARY_PATH=$ORACLE_HOME
export PATH=$ORACLE_HOME:$PATH
export TNS_ADMIN=$ORACLE_HOME
Macintosh:˜ discus$
では、SQL*Plusを起動してOracle11g R1 11.1.0.6.0へ接続してみる。

14

上手く行きましたね。ということで今日はここまで。

| | コメント (0) | トラックバック (0)

2008年5月 7日 (水)

PL/SQL で Python Challenge Level 18 う〜〜〜ん。

やることは分かったのだがPL/SQLでは重要な部分(pythonなら一発だけど)を手作りしないとならない。。。とりあえず適当に作ってはみたもののまだ思うような結果にはなっていない。。だが、そこさえクリアできればlevel18はPL/SQLだけで解けるはず。。。。。ということで暇を見て実装中。といってもその暇がなかなか取れなくなりそうな予感も。。。まあ、今回のネタはおもしろそうなので、少しづつでも進めて行きますよ。。。w

| | コメント (0) | トラックバック (0)

2008年4月26日 (土)

Oracle Instant Client 10.2.0.4.0 for MacOSX (Intel x86)

お〜〜〜、ついにというか、やっとでたか〜〜、Oracle Instant Client 10.2.0.4.0 for MacOSX(Intal x86)

これでやっとIntel MacでもRuby on RailsでOracleへアクセスできる〜。

15

| | コメント (0) | トラックバック (0)

PL/SQL で Python Challenge Level 18 わかちゃったかも・・

Level18は以外と簡単かも〜〜、Pythonならば。と。
当然だよね。Python ChallengeなんだからPythonを使って解くことを前提に作られてるのは。。。。

しかし、今回はもしかするとPL/SQLだけで全部解けちゃうかもしれない・・・久々だ〜。一部はかなり苦労してガリガリ作り込まなければならないと思われるのだが・・・その方法で上手く解けるという自信は70%。チャレンジしてみますよ〜〜。連休中にロジックを考えとく。。。

次回へつづく。;)

| | コメント (0) | トラックバック (0)

2008年4月22日 (火)

PL/SQL で Python Challenge Level 17 - 完

さて、少々間があいてしまったが、Python Challenge Level17の最終回。

前回、つまらないところでモタモタしてしまったが、Oracle Application Express 3.0.xを使わず、単純に mod_plsqlを使えばいいじゃんと言うことで。。。。

Level17は、以前にも書いたがWeb Applicationを書いたことのある人なら簡単に解けると思います。
今回は一部を除き、約90%がPL/SQL、残りをJava stored procedureで処理した。;)

ということで答えを導きだしたスクリーンショット。(答えはぼかしてますよ!)

Python_level17

次回、Python Challenge Level 18はこれまた気が向いたときにても。。。Enjoy Python Challenge!

| | コメント (0) | トラックバック (0)

2008年4月13日 (日)

PL/SQL で Python Challenge Level 17 #2 - 解けた!

さて、前回、解き方は見えたような気がすると書いたがいろいろな罠?に見事に引っかかったが解けました。はい。
今、Level18の問題が見えたのだが、また画像問題なのかな?

Level17は、Web Applicationを作った経験のある方ならLevel17の質問の画像自体がヒント。
なんですが、2重、3重の仕掛けがあるのでイライラするよ。ですが、基本的にはいままでの問題を解いてきたテクニックやコードを再利用すれば十分なので特に新しいことが必要でもない。。。

ということで、次回のPL/SQL で Python ChallengeはLevel17のヒントにならないヒント。でLevel17を締めくくろう。


以下のスクリーンショットは、最後の仕掛けを通り抜ける為のヒントを取り出す事に成功した場面。Level18のURLを導きだした時のスクリーンショットではありません。:)
Level17_no2

| | コメント (0) | トラックバック (0)

2008年3月10日 (月)

Mac de Ruby on Rails - #8 - Oracleと遊ぶ #7

以前の記事で以下のように書いていたことを覚えていますか?

注)
赤太字で示したシンボリックリンクは今回事前に作成したもので、それらのシンボリックリンクは作成しなくても通常利用には問題ない。以前の記事参照のこと。
尚、今回は事前に参照していた資料にシンボリックリンクの作成に関する記述があったため前述のシンボリックリンクを作成した。
(ほんとうに必要なのか? という点については未検証であることを書き加えておく。余計なものだとしても悪さはしないでしょう。きっと。)


バックナンバー:
Mac de Ruby on Rails - #1
Mac de Ruby on Rails - #2 - Oracleと遊ぶ #1
Mac de Ruby on Rails - #3 - Oracleと遊ぶ #2
Mac de Ruby on Rails - #4 - Oracleと遊ぶ #3
Mac de Ruby on Rails - #5 - Oracleと遊ぶ #4
Mac de Ruby on Rails - #6 - Oracleと遊ぶ #5
Mac de Ruby on Rails - #7 - Oracleと遊ぶ #6

先日、興味本位で、もし、前述したシンボリックリンクを作成しなかったらどうなるかを試してみた。

Macintosh:ruby-oci8-1.0.0 discus$ make
ruby setup.rb config
---> lib
---> lib/DBD
---> lib/DBD/OCI8
<--- lib/DBD/OCI8
<--- lib/DBD
<--- lib
---> ext
---> ext/oci8
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby /Users/discus/ruby-oci8-1.0.0/ext/oci8/extconf.rb
checking for load library path... (DYLD_LIBRARY_PATH)...
found: /Users/Shared/OracleInstantClient/libclntsh.dylib.10.1 looks like an instant client.
checking for cc... ok
checking for gcc... yes
checking for LP64... no
checking for ruby header... ok
---------------------------------------------------
error messages:
Could not compile with Oracle instant client.
/Users/Shared/OracleInstantClient/libclntsh.dylib could not be found.
You may need to make a symbolic link.
cd /Users/Shared/OracleInstantClient
ln -s libclntsh.dylib.10.1 libclntsh.dylib

---------------------------------------------------
See:
* http://ruby-oci8.rubyforge.org/ja/HowToInstall.html
* http://ruby-oci8.rubyforge.org/ja/ReportInstallProblem.html

*** /Users/discus/ruby-oci8-1.0.0/ext/oci8/extconf.rb failed ***

ご覧の通りエラーになりますし、シンボリックリンクが無いのが原因かもしれないと示唆される。分かり易くていいな〜。
当然、指摘された通りにシンボリックリンクを作成してあげれば問題は解消される。

| | コメント (0) | トラックバック (0)

2008年3月 7日 (金)

Oracle de XMLDB #26 - XMLTYPEの更新

OTN-Jで、PL/SQLでXMLTYPEのあるの要素の値を変更したり、ある要素の値を参照したいというスレッドがあったのでレスしておいた。

そういえば、XQueryやXPathを使ったOracle XMLDBネタもやっているが更新系のはやってないな(というかまだ、XMLの更新、追加、削除に関する標準が定まっていないわけだから仕方ない。)

ということで、前述したOTN-Jのネタをもう少しフラッシュアップして?!(for updateなどが抜けていたので。。)残しておく事にした。

まず、hogehoge表に以下のようなXMLを登録する。

SCOTT> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

SCOTT>
SCOTT> desc hogehoge
名前 NULL? 型
----------------------------------------- -------- ----------------------------
SEQNO NOT NULL NUMBER
XMLINFO XMLTYPE

SCOTT>
SCOTT> insert into hogehoge values(1,xmltype('<?xml version="1.0"?><addressbook>
<person id="1"><name>岡田</name><age>30</age>
<address zipcode="123456">東京都ホゲ市ホゲ町1−1</address></person><person id="2">
<name>安倍</name><age>50</age>
<address zipcode="1050011">東京都ホゲ区ホゲ田町1−1−1</address>
</person></addressbook>'));

1行が作成されました。

SCOTT> commit;

コミットが完了しました。

SCOTT>
SCOTT>
SCOTT> set timi on
SCOTT> set long 4000
SCOTT> col xmlinfo for a80
SCOTT> set linesize 132
SCOTT> set pagesize 1000
SCOTT> select * from hogehoge where seqno=1;

SEQNO XMLINFO
---------- ------------------------------------------------------------
1 <?xml version="1.0"?><addressbook><person id="1"><name>岡田<
/name><age>30</age><address zipcode="123456">東京都ホゲ市ホ
ゲ町1−1</address></person><person id="2"><name>安倍</name>
<age>50</age><address zipcode="1050011">東京都ホゲ区ホゲ田
町1−1−1</address></person></addressbook>


経過: 00:00:00.01
SCOTT>

上記のようなXML文書を対象に特定のid属性値を持つperson要素に含まれるname要素の値を変更するストアドファンクション。
(もうすこし平たく言うと、指定した名前を変更するストアドファンクション。略し過ぎか・・・)

XML文書の変更方法は他にもあるが、PL/SQLパッケージで行うにはDOM APIであるDBMS_XMLDOMパッケージを利用して行う。
尚、XMLTYPEをDBMS_XMLDOMパッケージで更新する際のポイントは、XMLTYPEインスタンスからDOMインスタンスを生成し、DOMインスタンに対して必要な更新操作行った上で、XMLTYPEインスタンスを表へ書き戻すという所。(該当部分は赤太字にしてあります。)

SCOTT> l
1 create or replace
2 function changePersonName
3 (
4 iKey in number,
5 iPersonId in varchar2,
6 iNewName in varchar2
7 ) return xmltype
8 is
9 xml xmlType;
10 personNodeList dbms_xmldom.DomNodeList;
11 personNode dbms_xmldom.DomNode;
12 nameNodeList dbms_xmldom.DomNodeList;
13 personAttrNodeMap dbms_xmldom.DomNamedNodeMap;
14 idAttrNode dbms_xmldom.DomNode;
15 wKey number;
16 wPersonId varchar2(38);
17 wNewName varchar2(60);
18 begin
19 wKey := iKey;
20 wPersonId := iPersonId;
21 wNewName := iNewName;
22
23 select xmlinfo into xml from hogehoge where seqno = wKey for update;
24
25 personNodeList := dbms_xmldom.getElementsByTagName(
26 dbms_xmldom.newDomDocument(xml)
27 ,'person'
28 );
29
30 if not dbms_xmldom.isNull(personNodeList) then
31 for i in 0..dbms_xmldom.getLength(personNodeList) loop
32 personNode := dbms_xmldom.item(personNodeList, i);
33 personAttrNodeMap := dbms_xmldom.getAttributes(personNode);
34 idAttrNode := dbms_xmldom.getNamedItem(personAttrNodeMap, 'id');
35 if dbms_xmldom.getNodeValue(idAttrNode) = wPersonId then
36 nameNodeList := dbms_xmldom.getChildrenByTagName(
37 dbms_xmldom.makeElement(personNode)
38 ,'name'
39 );
40 dbms_xmldom.setNodeValue(
41 dbms_xmldom.getFirstChild(dbms_xmldom.item(nameNodeList, 0))
42 ,wNewName
43 );
44 update hogehoge set xmlinfo = xml where seqno = wKey;
45 exit;
46 end if;
47 end loop;
48 end if;
49 return xml;
50* end;
SCOTT> /

ファンクションが作成されました。

経過: 00:00:00.04
SCOTT>
SCOTT>
SCOTT>
SCOTT> l
1 declare
2 xml xmlType;
3 begin
4 xml := changePersonName(1, '1', '福田ほげ蔵');
6 commit;
7* end;
SCOTT> /

PL/SQLプロシージャが正常に完了しました。

経過: 00:00:00.03
SCOTT>
SCOTT>
SCOTT> select * from hogehoge where seqno=1;
SEQNO XMLINFO
---------- --------------------------------------------------------------------------------
1 <?xml version="1.0"?>
<addressbook>
<person id="1">
<name>福田ほげ蔵</name>
<age>30</age>
<address zipcode="123456">東京都ホゲ市ホゲ町1−1</address>
</person>
<person id="2">
<name>安倍</name>
<age>50</age>
<address zipcode="1050011">東京都ホゲ区ホゲ田町1−1−1</address>
</person>
</addressbook>


経過: 00:00:00.00
SCOTT>

もうお気づきだと思うが、Oracle11gでも発生しているこちらからは操作できないところでwhitespaceが追加されたり、されなかったりする。まあこれ自体は大抵の場合問題にはならないのだが。。

あともうひとつの話題は特定の要素の値を取り出したいということ。これだけならDBMS_XMLDOMパッケージを使わなくても、SQL/XMLを使えば簡単ですよね。
XMLQuery()関数を使って、id属性値が "1"であるperson要素以下にあるage要素の値を参照する例です。

SCOTT> set linesize 80
SCOTT> l
1 select
2 xmlquery(
3 'let $n := $xmldoc//person[@id="1"]/age/text()
4 return $n'
5 passing by value xmlinfo as "xmldoc"
6 returning content
7 ) as "age"
8* from hogehoge where seqno=1
SCOTT> /

age
--------------------------------------------------------------------------------
30

経過: 00:00:00.04
SCOTT>

ちなみに、Oracleのマニュアルは以下の辺りを参照するとよいと思いますが、DOM、XQueryやXPathに関してはXML関連のサイトもググって調べたほうがよいと思います。XMLの操作の基本を理解していれば、あとはどんなツールを使ってそれを行うかということだけですから。

マニュアル
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス 10g R2 - DBMS_XMLDOM
Oracle Database SQLリファレンス 10g R2 - XMLQUERY

Enjoy!

| | コメント (0) | トラックバック (0)

2008年2月28日 (木)

Mac de Ruby on Rails - #7 - Oracleと遊ぶ #6

さて、前回まででRuby on Rails 2.0.2からOracle11g R1 11.1.0.6.0をアクセスするアプリケーションはできたのだが、まだ、幾つか手お加えたい箇所もある。例えばViewのタイトルやドロップダウンメニューが英語だとか、日付の表示が長過ぎるとか。

4


バックナンバー:
Mac de Ruby on Rails - #1
Mac de Ruby on Rails - #2 - Oracleと遊ぶ #1
Mac de Ruby on Rails - #3 - Oracleと遊ぶ #2
Mac de Ruby on Rails - #4 - Oracleと遊ぶ #3
Mac de Ruby on Rails - #5 - Oracleと遊ぶ #4
Mac de Ruby on Rails - #6 - Oracleと遊ぶ #5

そこで、indexページの日付フォーマットを変更してみることにする。(Viewというか、scaffoldでの日本語対応などまだまだ知らないことも多い。それらは次の機会のお楽しみということで・・・)

index.html.erbを以下のように変更して・・・・

pb17:/Volumes/Repository/employee_list discus$
pb17:/Volumes/Repository/employee_list discus$pb17:/Volumes/Repository/employee_list discus$ cd app/views/emps
pb17:/Volumes/Repository/employee_list/app/views/emps discus$ cp index.html.erb index.html.erb.org
pb17:/Volumes/Repository/employee_list/app/views/emps discus$ vi index.html.erb
pb17:/Volumes/Repository/employee_list/app/views/emps discus$ diff index.html.erb.org index.html.erg
17c17,23
< <td><%=h emp.hiredate %></td>
---
> <td>
> <% if emp.hiredate %>
> <%=h emp.hiredate.to_formatted_s(:db) %>
> <% else %>
> <%=h emp.hiredate %>
> <% end %>
> </td>
pb17:/Volumes/Repository/employee_list/app/views/emps discus$
pb17:/Volumes/Repository/employee_list/app/views/emps discus$ cd $OLDPWD
pb17:/Volumes/Repository/employee_list discus$ ruby script/server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2008-02-24 16:19:46] INFO WEBrick 1.3.1
[2008-02-24 16:19:46] INFO ruby 1.8.6 (2007-09-23) [powerpc-darwin8.11.0]
[2008-02-24 16:19:46] INFO WEBrick::HTTPServer#start: pid=702 port=3000
127.0.0.1 - - [24/Feb/2008:16:20:05 JST] "GET /emps HTTP/1.1" 500 15280
- -> /emps
127.0.0.1 - - [24/Feb/2008:16:20:26 JST] "GET /favicon.ico HTTP/1.1" 200 0
http://localhost:3000/emps -> /favicon.ico
^C[2008-02-24 16:20:59] INFO going to shutdown ...
[2008-02-24 16:20:59] INFO WEBrick::HTTPServer#start done.
pb17:/Volumes/Repository/employee_list discus$ cd app/views/emps

6

なんとか、出来ましたね。RubyもRuby on Railsも始めてですが、なんとかここまでできました〜 :)

”Ruby on Rails2.0.2とOracle11gでそこそこ遊べる環境を作る” ひとまず、完!

| | コメント (0) | トラックバック (0)

2008年2月27日 (水)

Mac de Ruby on Rails - #6 - Oracleと遊ぶ #5

Ruby on RailsでOracleとそこそこ遊べる環境構築もそろそろ終盤。
今回は、Ruby on RailsでOracle11g R1のデータベースをアクセスする簡単なアプリケーションを作ってみる。
尚、アプリケーションで利用する表は事前に作成しておいた。(Oracleにアクセスできることが確認できれば十分なので)


バックナンバー:
Mac de Ruby on Rails - #1
Mac de Ruby on Rails - #2 - Oracleと遊ぶ #1
Mac de Ruby on Rails - #3 - Oracleと遊ぶ #2
Mac de Ruby on Rails - #4 - Oracleと遊ぶ #3
Mac de Ruby on Rails - #5 - Oracleと遊ぶ #4

まず事前に、emp表を元にemps表を作り、数件データを追加しておきます。

pb17:˜ discus$
pb17:˜ discus$
pb17:˜ discus$ sqlplus /nolog

SQL*Plus: Release 10.1.0.3.0 - Production on 日 2月 24 15:55:07 2008

Copyright (c) 1982, 2004, Oracle. All rights reserved.

SQL> conn scott/tiger@lampeye
接続されました。
SQL> create table emps as select * from emp;

表が作成されました。

SQL> alter table emps rename column empno to id;

表が変更されました。

SQL> alter table emps add constraint emp_pk primary key (id);

表が変更されました。

SQL> create sequence emps_seq;

順序が作成されました。

SQL> insert into emps(id,ename) values(8888,'ヌルポ');

1行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> set linesize 132
SQL> set pagesize 1000
SQL> select * from emps order by id;

ID ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 80-12-17 800 20
7499 ALLEN SALESMAN 7698 81-02-20 1600 300 30
7521 WARD SALESMAN 7698 81-02-22 1250 500 30
7566 JONES MANAGER 7839 81-04-02 2975 20
7654 MARTIN SALESMAN 7698 81-09-28 1250 1400 30
7698 BLAKE MANAGER 7839 81-05-01 2850 30
7782 CLARK MANAGER 7839 81-06-09 2450 10
7839 KING PRESIDENT 81-11-17 5000 10
7844 TURNER SALESMAN 7698 81-09-08 1500 0 30
7900 JAMES CLERK 7698 81-12-03 950 30
7902 FORD ANALYST 7566 81-12-03 3000 20
7934 MILLER CLERK 7782 82-01-23 1300 10
8888 ヌルポ
9999 ほげ ENGINEER 7566 08-01-01 2500 20

14行が選択されました。

SQL> exit
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing optionsとの接続が切断されました。
pb17:˜ discus$
pb17:˜ discus$

次にOracleデータベースを利用するプロジェクトを作成します。
-d オプションを付けるとOracle向け構成ファイル:databaase.ymlを生成してくれます。

pb17:˜ discus$ cd /Volumes/Repository
pb17:˜ discus$
pb17:/Volumes/Repository discus$ rails -h
Usage: /opt/local/bin/rails /path/to/your/app [options]

Options:
-r, --ruby=path Path to the Ruby binary of your choice (otherwise scripts use env, dispatchers current path).
Default: /opt/local/bin/ruby
-d, --database=name Preconfigure for selected database (options: mysql/oracle/postgresql/sqlite2/sqlite3).
Default: mysql
-f, --freeze Freeze Rails in vendor/rails from the gems generating the skeleton
Default: false

・・・・中略・・・・

Example:
rails ˜/Code/Ruby/weblog

This generates a skeletal Rails installation in ˜/Code/Ruby/weblog.
See the README in the newly created application to get going.

今回は、employee_listというプロジェクトを作ります。(コードとディレクトリーが自動的い生成されていく・・・)
database.ymlを環境の合わせ変更!

pb17:/Volumes/Repository discus$ rails -d oracle employee_list
create
create app/controllers
create app/helpers
create app/models

・・・・中略・・・・

create log/server.log
create log/production.log
create log/development.log
create log/test.log
pb17:/Volumes/Repository discus$
pb17:/Volumes/Repository discus$
pb17:/Volumes/Repository discus$ cd employee_list/config
pb17:/Volumes/Repository discus$
pb17:/Volumes/Repository discus$
pb17:/Volumes/Repository/employee_list/config discus$ vi database.yml
pb17:/Volumes/Repository/employee_list/config discus$ cat database.yml
# Oracle/OCI 8i, 9, 10g
#
# Requires Ruby/OCI8:
# http://rubyforge.org/projects/ruby-oci8/
#
# Specify your database using any valid connection syntax, such as a
# tnsnames.ora service name, or a sql connect url string of the form:
#
# //host:[port][/service name]
#
# By default prefetch_rows (OCI_ATTR_PREFETCH_ROWS) is set to 100. And
# until true bind variables are supported, cursor_sharing is set by default
# to 'similar'. Both can be changed in the configation below; the defaults
# are equivalent to specifying:
#
# prefetch_rows: 100
# cursor_sharing: similar
#

development:
adapter: oracle
database: lampeye
username: scott
password: tiger

# Warning: The database defined as 'test' will be erased and
# re-generated from your development database when you run 'rake'.
# Do not set this db to the same as development or production.
test:
adapter: oracle
database: lampeye
username: test
password: tiger

production:
adapter: oracle
database: lampeye
username: prod
password: tiger
pb17:/Volumes/Repository/employee_list/config discus$
pb17:/Volumes/Repository/employee_list/config discus$
pb17:/Volumes/Repository/employee_list/config discus$

ここまでできたら、emps表を操作、表示するためのscaffold(足場)を生成する。(あれまあ、簡単にできるんだなぁ)

pb17:/Volumes/Repository/employee_list/config discus$ cd ..
pb17:/Volumes/Repository/employee_list discus$ ruby script/generate scaffold Emp
exists app/models/
exists app/controllers/
exists app/helpers/

・・・・中略・・・・

create app/controllers/emps_controller.rb
create test/functional/emps_controller_test.rb
create app/helpers/emps_helper.rb
route map.resources :emps
pb17:/Volumes/Repository/employee_list discus$
pb17:/Volumes/Repository/employee_list discus$

ではテスト用サーバを起動して確認!

pb17:/Volumes/Repository/employee_list discus$
pb17:/Volumes/Repository/employee_list discus$ ruby script/server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2008-02-24 16:10:11] INFO WEBrick 1.3.1
[2008-02-24 16:10:11] INFO ruby 1.8.6 (2007-09-23) [powerpc-darwin8.11.0]
[2008-02-24 16:10:11] INFO WEBrick::HTTPServer#start: pid=683 port=3000
127.0.0.1 - - [24/Feb/2008:16:10:31 JST] "GET / HTTP/1.1" 200 7557
- -> /
127.0.0.1 - - [24/Feb/2008:16:10:32 JST] "GET /favicon.ico HTTP/1.1" 200 0
http://localhost:3000/ -> /favicon.ico

・・・・中略・・・・

127.0.0.1 - - [24/Feb/2008:16:11:35 JST] "GET /stylesheets/scaffold.css?1203836970 HTTP/1.1" 200 1152
http://localhost:3000/emps -> /stylesheets/scaffold.css?1203836970
^C[2008-02-24 16:12:35] INFO going to shutdown ...
[2008-02-24 16:12:35] INFO WEBrick::HTTPServer#start done.

あれ〜〜、表の中身が表示されていない? なんで〜〜〜〜!

3

調べてみると、Ruby on Rails 2.xでは、scaffoldの使い方に違いがあるからということが理由とのこと。
ということでrailsのscaffold利用方法をを参照
/opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/rails_generator/generators/components/scaffold/USAGE


では早速、作り直してみる。

pb17:/Volumes/Repository/employee_list discus$ 
pb17:/Volumes/Repository/employee_list discus$ ruby script/generate scaffold Emp ename:string job:string mgr:integer hiredate:date sal:integer
exists app/models/
exists app/controllers/

・・・・中略・・・・

exists test/functional/
exists test/unit/
overwrite app/views/emps/index.html.erb? (enter "h" for help) [Ynaqdh] Y
force app/views/emps/index.html.erb
overwrite app/views/emps/show.html.erb? (enter "h" for help) [Ynaqdh] Y
force app/views/emps/show.html.erb
overwrite app/views/emps/new.html.erb? (enter "h" for help) [Ynaqdh] Y
force app/views/emps/new.html.erb
overwrite app/views/emps/edit.html.erb? (enter "h" for help) [Ynaqdh] Y
force app/views/emps/edit.html.erb
identical app/views/layouts/emps.html.erb

・・・・中略・・・・

skip test/fixtures/emps.yml
exists db/migrate
Another migration is already named create_emps: db/migrate/001_create_emps.rb
pb17:/Volumes/Repository/employee_list discus$ ruby script/server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2008-02-24 16:15:40] INFO WEBrick 1.3.1
[2008-02-24 16:15:40] INFO ruby 1.8.6 (2007-09-23) [powerpc-darwin8.11.0]
[2008-02-24 16:15:40] INFO WEBrick::HTTPServer#start: pid=696 port=3000
127.0.0.1 - - [24/Feb/2008:16:15:56 JST] "GET /emps HTTP/1.1" 200 12543
- -> /emps
127.0.0.1 - - [24/Feb/2008:16:16:17 JST] "GET /stylesheets/scaffold.css?1203836970 HTTP/1.1" 200 1152
http://localhost:3000/emps -> /stylesheets/scaffold.css?1203836970
127.0.0.1 - - [24/Feb/2008:16:16:17 JST] "GET /favicon.ico HTTP/1.1" 200 0
http://localhost:3000/emps -> /favicon.ico
^C[2008-02-24 16:17:22] INFO going to shutdown ...
[2008-02-24 16:17:22] INFO WEBrick::HTTPServer#start done.
pb17:/Volumes/Repository/employee_list discus$
pb17:/Volumes/Repository/employee_list discus$

お〜〜〜〜、できた〜! 

4

次回いよいよ、Ruby on RailsとOracleでそこそこ遊べる環境作りの最終回。日付の表示が気に入らないので少々コードを変更してみる。

| | コメント (0) | トラックバック (0)

2008年2月26日 (火)

Mac de Ruby on Rails - #5 - Oracleと遊ぶ #4

まず、前回の復習。
前回は、rubyからruby-oci8さらにOracle Instant Client 10gを介してOracle11g R1 EE 11.1.0.6.0のデータベースへアクセスできることを確認した。

今回は、rubyからActiveRecordを利用してOracle11g R1のデータベースへアクセスできるか確認する。


バックナンバー:
Mac de Ruby on Rails - #1
Mac de Ruby on Rails - #2 - Oracleと遊ぶ #1
Mac de Ruby on Rails - #3 - Oracleと遊ぶ #2
Mac de Ruby on Rails - #4 - Oracleと遊ぶ #3

コードは以下の通り。

pb17:˜ discus$
pb17:˜ discus$ cat test.rb
require 'rubygems'
require 'active_record'

class Emp < ActiveRecord::Base
set_table_name "EMP"
end

ActiveRecord::Base.establish_connection(
:adapter => "oracle",
:database => "lampeye",
:username => "scott",
:password => "tiger"
)

emp = Emp.find(:first,:conditions =>["ENAME = ?", "ほげ"])
puts "#{ emp.empno}, #{ emp.ename}, #{emp.job}, #{emp.hiredate}"

実行してみる!

pb17:˜ discus$
pb17:˜ discus$
pb17:˜ discus$ ruby test.rb
/opt/local/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/abstract/connection_specification.rb:231
:in `establish_connection': Please install the oracle adapter: `gem install activerecord-oracle-adapter`
(no such file to load -- active_record/connection_adapters/oracle_adapter) (RuntimeError) from test.rb:8

あ〜〜なるほど、ActiveRecordからruby-oci8を利用するためには、oracle_adapter.rbが必要なんですね! 
ということでoracle_adapter.rbをダウンロードし、/opt/local/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters以下にコピーする。

pb17:˜ discus$
pb17:˜ discus$
pb17:˜ discus$ cd :/Volumes/Repository/temp
pb17:/Volumes/Repository/temp discus$ curl -O http://svn.rubyonrails.org/rails/adapters/oracle/lib/active_record/connection_adapters/oracle_adapter.rb
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 27596 100 27596 0 0 25998 0 0:00:01 0:00:01 --:--:-- 43123
pb17:/Volumes/Repository/temp discus$
pb17:/Volumes/Repository/temp discus$
pb17:/Volumes/Repository/temp discus$ sudo cp oracle_adapter.rb /opt/local/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters
Password:
pb17:/Volumes/Repository/temp discus$

再度実行してみる!

pb17:/Volumes/Repository/temp discus$ cd
pb17:˜ discus$
pb17:˜ discus$
pb17:˜ discus$ ruby test.rb
9999, ほげ, ENGINEER, Tue Jan 01 00:00:00 +0900 2008
pb17:˜ discus$

お〜〜〜、上手くいった!〜〜。

今日はここまで、次回へつづく。

| | コメント (0) | トラックバック (0)

2008年2月25日 (月)

Mac de Ruby on Rails - #4 - Oracleと遊ぶ #3

Mac de Ruby on Rails、オラクルと遊ぶ その3回目は、ruby-oci8の動作確認の意味も含め、rubyからociを使ってOracle11g R1のscott.emp表をアクセスしてみる。


バックナンバー:
Mac de Ruby on Rails - #1
Mac de Ruby on Rails - #2 - Oracleと遊ぶ #1
Mac de Ruby on Rails - #3 - Oracleと遊ぶ #2

以下の操作は全て、Oracle Instant Client 10g R1 10.1.0.3.0 for MacOSX(PPC)をインストールしたPowerBook G4から行っている。

SQL*Plusを利用してSCOTTユーザのemp表の内容を確認しておく。

pb17:˜ discus$ sqlplus /nolog

SQL*Plus: Release 10.1.0.3.0 - Production on 日 2月 24 15:47:19 2008

Copyright (c) 1982, 2004, Oracle. All rights reserved.

> conn scott/tiger@lampeye
接続されました。
SCOTT> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Linux: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

SCOTT> set linesize 132
SCOTT> set pagesize 1000
SCOTT> select * from emp order by empno;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 80-12-17 800 20
7499 ALLEN SALESMAN 7698 81-02-20 1600 300 30
7521 WARD SALESMAN 7698 81-02-22 1250 500 30
7566 JONES MANAGER 7839 81-04-02 2975 20
7654 MARTIN SALESMAN 7698 81-09-28 1250 1400 30
7698 BLAKE MANAGER 7839 81-05-01 2850 30
7782 CLARK MANAGER 7839 81-06-09 2450 10
7839 KING PRESIDENT 81-11-17 5000 10
7844 TURNER SALESMAN 7698 81-09-08 1500 0 30
7900 JAMES CLERK 7698 81-12-03 950 30
7902 FORD ANALYST 7566 81-12-03 3000 20
7934 MILLER CLERK 7782 82-01-23 1300 10
9999 ほげ ENGINEER 7566 08-01-01 2500 20

13行が選択されました。

SCOTT> exit
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production

pb17:˜ discus$

rubyからruby-oci8、さらにOracle Clientを介して、Oracle11g R1のscott.emp表をempno順に問い合わせて動作確認した結果。

pb17:˜ discus$
pb17:˜ discus$ ruby -r oci8 -e "OCI8.new('scott','tiger','lampeye').exec('select * from emp order by empno') do |r| puts r.join(','); end"
7369,SMITH,CLERK,7902,1980/12/17 00:00:00,800.0,,20
7499,ALLEN,SALESMAN,7698,1981/02/20 00:00:00,1600.0,300.0,30
7521,WARD,SALESMAN,7698,1981/02/22 00:00:00,1250.0,500.0,30
7566,JONES,MANAGER,7839,1981/04/02 00:00:00,2975.0,,20
7654,MARTIN,SALESMAN,7698,1981/09/28 00:00:00,1250.0,1400.0,30
7698,BLAKE,MANAGER,7839,1981/05/01 00:00:00,2850.0,,30
7782,CLARK,MANAGER,7839,1981/06/09 00:00:00,2450.0,,10
7839,KING,PRESIDENT,,1981/11/17 00:00:00,5000.0,,10
7844,TURNER,SALESMAN,7698,1981/09/08 00:00:00,1500.0,0.0,30
7900,JAMES,CLERK,7698,1981/12/03 00:00:00,950.0,,30
7902,FORD,ANALYST,7566,1981/12/03 00:00:00,3000.0,,20
7934,MILLER,CLERK,7782,1982/01/23 00:00:00,1300.0,,10
9999,ほげ,ENGINEER,7566,2008/01/01 00:00:00,2500.0,,20
pb17:˜ discus$
pb17:˜ discus$

順調、順調! 

次回へつづく。

| | コメント (0) | トラックバック (0)

2008年2月24日 (日)

Mac de Ruby on Rails - #3 - Oracleと遊ぶ #2

さて、前回予告した通り、MacOSXのRuby on Rails 2.0.2からOracle11g R1 EE 11.1.0.6.0 for Linux x86Oracle Instant Client 10g R1 for MacOSX(PPC)を利用し、そこそこ遊べる環境を作ってみる。


バックナンバー:
Mac de Ruby on Rails - #1
Mac de Ruby on Rails - #2 - Oracleと遊ぶ #1

2008/2/26追記-文字エンコーディングに関する情報を書き忘れていたので追記
Oracle DB character set : Japanese_Japan.AL32UTF8
Oracle Client NLS_LANG : Japanese_Japan.AL32UTF8
ということで全てUTF-8で統一してあります。


まずは、Ruby on Railsの開発環境にするPowerBook G4の情報から

H/W: Apple PowerBook G4 1Ghz / RAM:1GB
OS : MacOSX 10.4.11 Tiger (XCode 2.4.1インストール済み)
Oracle Instant Client : Oracle Instant Client 10g R1 for MacOSX(PPC)
Ruby : 1.8.6 (2007-09-23 patchlevel 110) [powerpc-darwin8.11.0]
RubyGems : 1.0.1
Ruby on Rails : 2.0.2
ruby-oci8 : 1.0.0
MacOSX 10.4.11 TigerへのRuby on Rails 2.0.2のインストールはこちら。

そして、Ruby on Railsから接続するOracleデータベースサーバは(サーバっていうと大げさ過ぎるノートPCですが・・・・)

H/W: Dynabook SS SX/210LNLW (RAM:768MB)
OS : CentOS 5
DB : Oracle11g R1 EE 11.1.0.6.0 for Linux x86

という構成です。配置はこんな感じ

Ruby on Rails 2.0.2からOracle11g R1 EE 11.1.0.6.0 for Linux x86へ接続するためのOracle Instant Client 10g R1 for MacOSX(PPC)関連の環境変数の設定は以下のようになっている。
(MySQLやGlassFish関連の環境変数も見えるが今回の内容には一切関係ないので気にしないでくださいませ。)

尚、Oracle Instant Client 10g R1 for MacOSX(PPC)をMacOSX 10.4.11 Tigerへインストールする例は以前の記事を参考にしてみてください。

pb17:˜ discus$ cat .bash_profile
export PATH=/usr/local/mysql/bin:$PATH

alias mysql='mysql --set autocommit=0'

# for GlassFish
export GLASSFISH_HOME=˜/glassfish/glassfish
export PATH=/opt/local/bin:$PATH:$GLASSFISH_HOME/bin

. .bashrc
pb17:˜ discus$ cat .bashrc
alias ll='ls -lv'

ORACLE_INSTANT_CLIENT_HOME=/Users/Shared/instantclient10_1
export ORACLE_HOME=$ORACLE_INSTANT_CLIENT_HOME
export NLS_LANG=Japanese_Japan.AL32UTF8
export DYLD_LIBRARY_PATH=$ORACLE_HOME
export PATH=$ORACLE_HOME:$PATH
export TNS_ADMIN=$ORACLE_HOME


pb17:˜ discus$
pb17:˜ discus$ ls -l $ORACLE_HOME
total 182200
-r--r--r-- 1 discus orauser 21299 Apr 29 2004 README_IC.htm
-r--r--r-- 1 discus orauser 1461081 Jul 5 2004 classes12.jar
-r--r--r-- 1 discus orauser 1353 Oct 9 2003 glogin.sql
lrwxr-xr-x 1 discus orauser 20 Feb 16 12:43 libclntsh.dylib -> libclntsh.dylib.10.1
-rwxr-xr-x 1 discus orauser 14891264 Dec 13 2004 libclntsh.dylib.10.1
-rwxr-xr-x 1 discus orauser 27432 Oct 24 2004 libheteroxa10.dylib
-rw-r--r-- 1 discus orauser 1516340 Nov 16 2004 libnnz10.dylib
lrwxr-xr-x 1 discus orauser 18 Feb 16 12:44 libocci.dylib -> libocci.dylib.10.1
-rw-r--r-- 1 discus orauser 1841448 Oct 24 2004 libocci.dylib.10.1
-rwxr-xr-x 1 discus orauser 66160096 Dec 14 2004 libociei.dylib
-rwxr-xr-x 1 discus orauser 93028 Nov 9 2004 libocijdbc10.dylib
-rwxr-xr-x 1 discus orauser 744612 Oct 24 2004 libsqlplus.dylib
-r--r--r-- 1 discus orauser 54032 Jul 5 2004 ocrs12.jar
-r--r--r-- 1 discus orauser 1397543 Jul 5 2004 ojdbc14.jar
-r--r--r-- 1 discus orauser 5018319 Jul 7 2004 orai18n.jar
drwxr-xr-x 4 discus orauser 136 Dec 14 2004 sdk
-rwxr-xr-x 1 discus orauser 15660 Dec 13 2004 sqlplus
-rw-r--r-- 1 discus orauser 2072 Feb 16 13:19 tnsnames.ora
pb17:˜ discus$

注)
赤太字で示したシンボリックリンクは今回事前に作成したもので、それらのシンボリックリンクは作成しなくても通常利用には問題ない。以前の記事参照のこと
尚、今回は事前に参照していた資料にシンボリックリンクの作成に関する記述があったため前述のシンボリックリンクを作成した。
(ほんとうに必要なのか? という点については未検証であることを書き加えておく。余計なものだとしても悪さはしないでしょう。きっと。)


では、早速、Ruby on Rails 2.0.2からOracleへアクセスするための準備作業に取りかかることにする。
まず、RubyForgeからruby-oci8-1.0.0.tar.gzをダウンロード、解凍する。

pb17:/Volumes/Repository/temp discus$ curl -L -O http://rubyforge.org/frs/download.php/28396/ruby-oci8-1.0.0.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 104k 100 104k 0 0 41090 0 0:00:02 0:00:02 --:--:-- 77167
pb17:/Volumes/Repository/temp discus$ ll
-rw-r--r-- 1 discus admin 593589 Dec 17 14:57 MacPorts-1.6.0-10.4-Tiger.dmg
-rw-r--r-- 1 discus admin 239926399 Aug 14 2007 aug07_adc_refib_update.dmg
-rw-r--r-- 1 discus admin 326 Apr 28 2006 comics.sql
-rw-r--r-- 1 discus admin 107494 Nov 25 20:31 ruby-oci8-1.0.0.tar.gz
-rw-r--r-- 1 discus admin 204841 May 24 2007 rubygems-0.9.4.tgz
pb17:/Volumes/Repository/temp discus$ gzip -dc ruby-oci8-1.0.0.tar.gz | tar xvf -
ruby-oci8-1.0.0/
ruby-oci8-1.0.0/NEWS
ruby-oci8-1.0.0/ChangeLog
ruby-oci8-1.0.0/Makefile

・・・中略・・・

ruby-oci8-1.0.0/test/test_oci8.rb
ruby-oci8-1.0.0/test/test_oradate.rb
ruby-oci8-1.0.0/test/test_oranumber.rb
ruby-oci8-1.0.0/test/test_metadata.rb

解凍したらmakeする。Oracle Instant Clientをちゃんと認識しているのがわかる。

pb17:/Volumes/Repository/temp discus$ cd ruby-oci8-1.0.0
pb17:/Volumes/Repository/temp/ruby-oci8-1.0.0 discus$ make
ruby setup.rb config
---> lib
---> lib/DBD
---> lib/DBD/OCI8
<--- lib/DBD/OCI8
<--- lib/DBD
<--- lib
---> ext
---> ext/oci8
/opt/local/bin/ruby /Volumes/Repository/temp/ruby-oci8-1.0.0/ext/oci8/extconf.rb
checking for load library path... (DYLD_LIBRARY_PATH)...
found: /Users/Shared/instantclient10_1/libclntsh.dylib.10.1 looks like an instant client.
checking for cc... ok
checking for gcc... yes
checking for LP64... no
checking for ruby header... ok
checking for OCIInitialize() in oci.h... yes
checking for OCIEnvCreate()... yes
checking for OCITerminate()... yes
checking for OCILobOpen()... yes
checking for OCILobClose()... yes
checking for OCILobCreateTemporary()... yes
checking for OCILobGetChunkSize()... yes
checking for OCILobLocatorAssign()... yes
creating ../../lib/oci8.rb from /Volumes/Repository/temp/ruby-oci8-1.0.0/ext/oci8/../../lib/oci8.rb.in
creating extconf.h
creating Makefile
<--- ext/oci8

・・・中略・・・

/usr/bin/gcc-4.0 -I. -I. -I/opt/local/lib/ruby/1.8/powerpc-darwin8.11.0 -I/Volumes/Repository/temp/ruby-oci8-1.0.0/ext/oci8 -DRUBY_EXTCONF_H=\"extconf.h\" -I/opt/local/include -fno-common -O2
-fno-common -pipe -fno-common -I/Users/Shared/instantclient10_1/sdk/include -Wall -c attr.c
cc -dynamic -bundle -undefined suppress -flat_namespace -o oci8lib.bundle oci8.o handle.o const.o env.o error.o svcctx.o server.o session.o stmt.o define.o bind.o describe.o descriptor.o
param.o lob.o oradate.o oranumber.o ocinumber.o attr.o -L"." -L"/opt/local/lib" -L. -L/opt/local/lib -lruby -L/Users/Shared/instantclient10_1 -lclntsh -lpthread -ldl -lobjc
<--- ext/oci8
<--- ext
pb17:/Volumes/Repository/temp/ruby-oci8-1.0.0 discus$

makeが無事終了したらinstallする。(sudoで!)

pb17:/Volumes/Repository/temp/ruby-oci8-1.0.0 discus$ sudo make install
Password:
ruby setup.rb install
---> lib
mkdir -p /opt/local/lib/ruby/site_ruby/1.8/
install oci8.rb /opt/local/lib/ruby/site_ruby/1.8/
---> lib/DBD
mkdir -p /opt/local/lib/ruby/site_ruby/1.8/DBD
---> lib/DBD/OCI8
mkdir -p /opt/local/lib/ruby/site_ruby/1.8/DBD/OCI8
install OCI8.rb /opt/local/lib/ruby/site_ruby/1.8/DBD/OCI8
<--- lib/DBD/OCI8
<--- lib/DBD
<--- lib
---> ext
---> ext/oci8
mkdir -p /opt/local/lib/ruby/site_ruby/1.8/powerpc-darwin8.11.0/.
install oci8lib.bundle /opt/local/lib/ruby/site_ruby/1.8/powerpc-darwin8.11.0/.
<--- ext/oci8
<--- ext
pb17:/Volumes/Repository/temp/ruby-oci8-1.0.0 discus$

ということでruby-oci8のインストールまで無事に終了した。(Ruby初心者の私でもなんとかできました。。。。 :)

つづく・・・・




参考にしたサイトを以下に載せておきます。
OTN:Ruby on Rails on Oracle: A Simple Tutorial
OTN:Ruby on Rails with Oracle FAQ
(但し、RoRもruby-oci8関連の設定方法も参考にはなりますが古いバージョンを利用した解説なので注意が必要ですね。)

Connecting Ruby on Rails to Oracle on an Intel Mac in Leopard (Mac OSX 10.5)
上記サイトの情報は(2008/2/24時点では比較的あたらしい、しかもIntel Macのネタですね。。

ruby-oci8 - Oracle Instant Client
ruby-oci8インストール手順

Rails supports Oracle 8i, 9i, and 10g.
How to Connect To Oracle
ruby 2.xでoracleを利用する設定関連など

以下、Rails 2 と Oracleを接続するためのdatabase.ymlの設定例の引用

Database_ymd_rails_2_and_oracle

oracle_adapter.rb
oracle_adapter.rbのダウンロード先

| | コメント (0) | トラックバック (0)

2008年2月22日 (金)

Mac de Ruby on Rails - #2 - Oracleと遊ぶ #1

Mac de Ruby on Rails - #1でも書いたように、Mac で Oracle と Ruby on Rails で戯れることにした。

Oracle Instant Clientネタを幾つか書いたのだが、それらはMac で Oracle と Ruby on Rails で戯れるための準備だったのですよ。(いろいろ検索しても、MacOSXでOracleを使ったRoRのネタがあまり見つからなかったこともあり、そうなれば自分でやるのが一番というわけ)


2008/2/24追記
配置はこんな感じ。(Visual Paradigm for UML community Editonを利用)

Ror_oracle_uml_deployment_diag

ということで、ただ今準備中! 次回へつづく。



バックナンバー:
Mac de Ruby on Rails - #1

| | コメント (0) | トラックバック (0)

2008年2月20日 (水)

Oracle de XMLDB #23 - Relational dataをXMLへ #6

さて、Oracleデータベース側だけでリレーショナルデータをXMLTypeインスタンスへ変換する方法は一通り試したので、今度はリレーショナルデータを取り出しクライアント側でXMLへ変換してみた。
接続するOracleデータベースはいままで通り、Oracle11g R1 EE 11.1.0.6.0 for Linux(x86)なのだが、クライアントとして利用するMacOSX 10.4.11の構成は多少異なるので以下に示しておく。

Jdeveloper1013png

IDE : Oracle JDeveloper10g Studio Edition 10.1.3.0.4 for MacOSX
Oracle XML Developer's Kit(XDK) for Java - 10.2.0.2.0 Linux Production
JDBCドライバ : Oracle Instant Client for MacOSX(PPC) 10.1.0.3.0付属の ojdbc14.jar
Oracle XML Parser : JDeveloper 10g Studio Edition for MacOSX version 10.1.3.0.4に付属するOracle XML Parser v2 (xmlparserv2.jar)
Oracle XML SQL Utility : JDeveloper 10g Studio Edition for MacOSX version 10.1.3.0.4に付属するOracle XML SQL Utiliry (xsu12.jar)

Xmldb23_project Xmldb23_project_property


バックナンバー:
Oracle de XMLDB #18 - Relational dataをXMLへ #1
Oracle de XMLDB #19 - Relational dataをXMLへ #2
Oracle de XMLDB #20 - Relational dataをXMLへ #3
Oracle de XMLDB #21 - Relational dataをXMLへ #4
Oracle de XMLDB #22 - Relational dataをXMLへ #5

以下の例では、emp表をempno順にソートして読み込み、Oracle XML SQL Utilityを利用して読み込んだResultsetからXMLへ変換。

package jp.macdeoracle.sample;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import oracle.jdbc.pool.OracleDataSource;

import oracle.xml.sql.query.OracleXMLQuery;

public class Table2Xml1
{
public Table2Xml1()
throws SQLException
{
OracleDataSource ods;
ods = new OracleDataSource();
ods.setURL(
"jdbc:oracle:thin:scott/tiger@192.168.1.20:1521:lampeye"
);

Connection conn = ods.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from emp order by empno");
OracleXMLQuery xmlqry = new OracleXMLQuery(conn, rs);

String xmlString = xmlqry.getXMLString();
DatabaseMetaData meta = conn.getMetaData();
System.out.println(meta.getDatabaseProductVersion());
System.out.println(meta.getDriverName()+":"+meta.getDriverVersion());
System.out.println("=====================\n"+xmlString);
rs.close();
stmt.close();
conn.close();
}

public static void main(String[] args) throws SQLException
{
Table2Xml1 Table2Xml1 = new Table2Xml1();
}
}


出力結果は以下の通り。ROW要素にnum属性がある以外、データベース側だけで変換した場合と内容的には変らない。
データベースサーバ側で変換まで行うか、クライアント側で変換するか、どちらが良いかといういうより、どのように負荷分散するかという戦略に合わせて考えればいいんじゃないかと思う。

Oracle Database 11g Release 11.1.0.0.0 - Production
Oracle JDBC driver:10.1.0.3.0
=====================
<?xml version = '1.0'?>
<ROWSET>
<ROW num="1">
<EMPNO>7369</EMPNO>
<ENAME>SMITH</ENAME>
<JOB>CLERK</JOB>
<MGR>7902</MGR>
<HIREDATE>12/17/1980 0:0:0</HIREDATE>
<SAL>800</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW num="2">
<EMPNO>7499</EMPNO>
<ENAME>ALLEN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>2/20/1981 0:0:0</HIREDATE>
<SAL>1600</SAL>
<COMM>300</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW num="3">
<EMPNO>7521</EMPNO>
<ENAME>WARD</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>2/22/1981 0:0:0</HIREDATE>
<SAL>1250</SAL>
<COMM>500</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW num="4">
<EMPNO>7566</EMPNO>
<ENAME>JONES</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>4/2/1981 0:0:0</HIREDATE>
<SAL>2975</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW num="5">
<EMPNO>7654</EMPNO>
<ENAME>MARTIN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>9/28/1981 0:0:0</HIREDATE>
<SAL>1250</SAL>
<COMM>1400</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW num="6">
<EMPNO>7698</EMPNO>
<ENAME>BLAKE</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>5/1/1981 0:0:0</HIREDATE>
<SAL>2850</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW num="7">
<EMPNO>7782</EMPNO>
<ENAME>CLARK</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>6/9/1981 0:0:0</HIREDATE>
<SAL>2450</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW num="8">
<EMPNO>7839</EMPNO>
<ENAME>KING</ENAME>
<JOB>PRESIDENT</JOB>
<HIREDATE>11/17/1981 0:0:0</HIREDATE>
<SAL>5000</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW num="9">
<EMPNO>7844</EMPNO>
<ENAME>TURNER</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>9/8/1981 0:0:0</HIREDATE>
<SAL>1500</SAL>
<COMM>0</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW num="10">
<EMPNO>7900</EMPNO>
<ENAME>JAMES</ENAME>
<JOB>CLERK</JOB>
<MGR>7698</MGR>
<HIREDATE>12/3/1981 0:0:0</HIREDATE>
<SAL>950</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW num="11">
<EMPNO>7902</EMPNO>
<ENAME>FORD</ENAME>
<JOB>ANALYST</JOB>
<MGR>7566</MGR>
<HIREDATE>12/3/1981 0:0:0</HIREDATE>
<SAL>3000</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW num="12">
<EMPNO>7934</EMPNO>
<ENAME>MILLER</ENAME>
<JOB>CLERK</JOB>
<MGR>7782</MGR>
<HIREDATE>1/23/1982 0:0:0</HIREDATE>
<SAL>1300</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW num="13">
<EMPNO>9999</EMPNO>
<ENAME>ほげ</ENAME>
<JOB>ENGINEER</JOB>
<MGR>7566</MGR>
<HIREDATE>1/1/2008 0:0:0</HIREDATE>
<SAL>2500</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
</ROWSET>

プロセスが終了コード0で終了しました。

次回は、データベース側でXMLへの変換まで行いクライアント側ではその結果を受け取るだけの例を一つ。

| | コメント (0) | トラックバック (0)

2008年2月10日 (日)

Oracle de XMLDB #18 - Relational dataをXMLへ #1

Oracle XML DBリポジトリ関連の話はしばらく脇に置いておき、これから数回に分けてリレーショナル表からXMLを生成する方法について、備忘録の意味も含めて書いておくことにする。

● 環境データ

Server : Dynabook SS SX/210LNLW (RAM:768MB) 
CentOS5
Oracle11g EE R1 11.1.0.6.0 for Linux x86

Client : Apple PowerMac G5 Dual 2.7Ghz (RAM:1GB)
MacOSX Tiger 10.4.11 Server
Oracle10g Instant Client 10g R1 for MacOSX(PPC)

表を問い合わせXMLTypeインスタンスを返す方法は複数ある。まず最初に紹介するのは、XMLTABLE()関数のXqueryでora:view()関数を使う方法。

XMLTABLE()関数は、SQL/XMLで提供される標準関数で、本来はXMLデータをリレーショナルフォーマットへマッピングする為に利用する関数なのだが、今回は本来の目的とは異なる使い方をしてみた。
XMLTABLE()関数でリレーショナル表からXMLTypeインスタンスを取得するには、OracleがXXQuery向に提供している ora:view()関数を利用する。(Oracleが独自に拡張したXQuery向け関数の名前空間は、ora:)
ora:view()関数は、XQueryの標準関数であるfn:doc()関数を利用する感覚で利用できる。


以下の例では、XMLTABLE()関数でCOLUMNS句を指定していしないのがポイント。尚、COLUMN_VALUE疑似列を利用しています。

Last login: Sat Feb  9 06:46:43 on console
Welcome to Darwin!
G5Server:˜ discus$ sqlplus /nolog

SQL*Plus: Release 10.1.0.3.0 - Production on 土 2月 9 15:30:44 2008

Copyright (c) 1982, 2004, Oracle. All rights reserved.

SCOTT> conn scott/tiger@lampeye
接続されました。
SCOTT> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Linux: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

SCOTT> set pagesize 1000
SCOTT> set long 4000
SCOTT> set sqlterm off
SCOTT> set linesize 80
SCOTT> l
1 select xmldoc.COLUMN_VALUE
2 from
3 xmltable(
4 '<ROWSET>{
5 for $d in ora:view("EMP")
6 return $d
7 }</ROWSET>'
8* ) xmldoc
SCOTT> /

COLUMN_VALUE
--------------------------------------------------------------------------------
<ROWSET><ROW><EMPNO>9999</EMPNO><ENAME>ほげ</ENAME><JOB>ENGINEER</JOB><MGR>7566<
/MGR><HIREDATE>2008-01-01</HIREDATE><SAL>2500</SAL><DEPTNO>20</DEPTNO></ROW><ROW
><EMPNO>7369</EMPNO><ENAME>SMITH</ENAME><JOB>CLERK</JOB><MGR>7902</MGR><HIREDATE
>1980-12-17</HIREDATE><SAL>800</SAL><DEPTNO>20</DEPTNO></ROW><ROW><EMPNO>7499</E
MPNO><ENAME>ALLEN</ENAME><JOB>SALESMAN</JOB><MGR>7698</MGR><HIREDATE>1981-02-20<
/HIREDATE><SAL>1600</SAL><COMM>300</COMM><DEPTNO>30</DEPTNO></ROW><ROW><EMPNO>75
21</EMPNO><ENAME>WARD</ENAME><JOB>SALESMAN</JOB><MGR>7698</MGR><HIREDATE>1981-02
-22</HIREDATE><SAL>1250</SAL><COMM>500</COMM><DEPTNO>30</DEPTNO></ROW><ROW><EMPN
O>7566</EMPNO><ENAME>JONES</ENAME><JOB>MANAGER</JOB><MGR>7839</MGR><HIREDATE>198
1-04-02</HIREDATE><SAL>2975</SAL><DEPTNO>20</DEPTNO></ROW><ROW><EMPNO>7654</EMPN
O><ENAME>MARTIN</ENAME><JOB>SALESMAN</JOB><MGR>7698</MGR><HIREDATE>1981-09-28</H
IREDATE><SAL>1250</SAL><COMM>1400</COMM><DEPTNO>30</DEPTNO></ROW><ROW><EMPNO>769
8</EMPNO><ENAME>BLAKE</ENAME><JOB>MANAGER</JOB><MGR>7839</MGR><HIREDATE>1981-05-
01</HIREDATE><SAL>2850</SAL><DEPTNO>30</DEPTNO></ROW><ROW><EMPNO>7782</EMPNO><EN
AME>CLARK</ENAME><JOB>MANAGER</JOB><MGR>7839</MGR><HIREDATE>1981-06-09</HIREDATE
><SAL>2450</SAL><DEPTNO>10</DEPTNO></ROW><ROW><EMPNO>7839</EMPNO><ENAME>KING</EN
AME><JOB>PRESIDENT</JOB><HIREDATE>1981-11-17</HIREDATE><SAL>5000</SAL><DEPTNO>10
</DEPTNO></ROW><ROW><EMPNO>7844</EMPNO><ENAME>TURNER</ENAME><JOB>SALESMAN</JOB><
MGR>7698</MGR><HIREDATE>1981-09-08</HIREDATE><SAL>1500</SAL><COMM>0</COMM><DEPTN
O>30</DEPTNO></ROW><ROW><EMPNO>7900</EMPNO><ENAME>JAMES</ENAME><JOB>CLERK</JOB><
MGR>7698</MGR><HIREDATE>1981-12-03</HIREDATE><SAL>950</SAL><DEPTNO>30</DEPTNO></
ROW><ROW><EMPNO>7902</EMPNO><ENAME>FORD</ENAME><JOB>ANALYST</JOB><MGR>7566</MGR>
<HIREDATE>1981-12-03</HIREDATE><SAL>3000</SAL><DEPTNO>20</DEPTNO></ROW><ROW><EMP
NO>7934</EMPNO><ENAME>MILLER</ENAME><JOB>CLERK</JOB><MGR>7782</MGR><HIREDATE>198
2-01-23</HIREDATE><SAL>1300</SAL><DEPTNO>10</DEPTNO></ROW></ROWSET>


経過: 00:00:00.11
SCOTT>


これだとXML宣言が無い。ではどうやってXML宣言を付加するかと言えば、XMLRoot()関数を使う。
XMLRoot()関数は2005年まではSQL/XMLの標準関数だったが現在は標準関数ではない。但し、Oracleでは利用できるのでXMLRoot()関数を利用してXML宣言を付加することができる。

では早速試してみよう!。

SCOTT> select
2 xmlroot(xmldoc.column_value,version '1.0')
3 from
4 xmltable(
5 '<ROWSET>{
6 for $d in ora:view("EMP")
7 return $d
8 }</ROWSET>'
9 ) xmldoc
10 /

XMLROOT(XMLDOC.COLUMN_VALUE,VERSION'1.0')
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<ROWSET>
<ROW>
<EMPNO>9999</EMPNO>
<ENAME>ほげ</ENAME>
<JOB>ENGINEER</JOB>
<MGR>7566</MGR>
<HIREDATE>2008-01-01</HIREDATE>
<SAL>2500</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7369</EMPNO>
<ENAME>SMITH</ENAME>
<JOB>CLERK</JOB>
<MGR>7902</MGR>
<HIREDATE>1980-12-17</HIREDATE>
<SAL>800</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7499</EMPNO>
<ENAME>ALLEN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-02-20</HIREDATE>
<SAL>1600</SAL>
<COMM>300</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7521</EMPNO>
<ENAME>WARD</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-02-22</HIREDATE>
<SAL>1250</SAL>
<COMM>500</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7566</EMPNO>
<ENAME>JONES</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>1981-04-02</HIREDATE>
<SAL>2975</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7654</EMPNO>
<ENAME>MARTIN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-09-28</HIREDATE>
<SAL>1250</SAL>
<COMM>1400</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7698</EMPNO>
<ENAME>BLAKE</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>1981-05-01</HIREDATE>
<SAL>2850</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7782</EMPNO>
<ENAME>CLARK</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>1981-06-09</HIREDATE>
<SAL>2450</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>7839</EMPNO>
<ENAME>KING</ENAME>
<JOB>PRESIDENT</JOB>
<HIREDATE>1981-11-17</HIREDATE>
<SAL>5000</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>7844</EMPNO>
<ENAME>TURNER</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-09-08</HIREDATE>
<SAL>1500</SAL>
<COMM>0</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7900</EMPNO>
<ENAME>JAMES</ENAME>
<JOB>CLERK</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-12-03</HIREDATE>
<SAL>950</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7902</EMPNO>
<ENAME>FORD</ENAME>
<JOB>ANALYST</JOB>
<MGR>7566</MGR>
<HIREDATE>1981-12-03</HIREDATE>
<SAL>3000</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7934</EMPNO>
<ENAME>MILLER</ENAME>
<JOB>CLERK</JOB>
<MGR>7782</MGR>
<HIREDATE>1982-01-23</HIREDATE>
<SAL>1300</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
</ROWSET>

経過: 00:00:00.33
SCOTT>

あれ、XMLRoot()関数に渡しているXMLTABLE()関数で取得したXMLTypeインスタンスには改行がありませんでしたが、XMLROOT()関数を利用すると改行が付加されたXMLTypeインスタンスが返されます。また、その影響だと思うが経過時間も増えている。

こりゃ参った〜という感じです。以前もOracle XML DBに関するエントリでwhitespaceのpreserve/stripは現時点のOracle XML DBでは明示的に制御できないということは書いていましたが思わぬところでwhitespaceかってに付加されるという動きには戸惑いますね。(利用する側で制御できるようにしてもらったほうがスッキリするように感じます。)


トレースして詳細に追跡したわけでは無いのであくまで想像の域を脱していないのですが、もしかすると、XMLROOT()関数はXMLTypeインスタンスを受け取りXML宣言を付加して返してくる際、XML宣言を追加したDOMを生成した上でXMLTypeインスタンスを返してくるのではないかと考えています。(くどいようですが、これは私の推測に過ぎませんので誤解なさらないようにしてください。)

時間があればもっと深〜〜〜く追っかけてみたい現象なのでとりあえず、TODOリストに追加しておきますかね。

では次回へつづく。

| | コメント (0) | トラックバック (1)

2008年2月 4日 (月)

Oracle SQL Developer for MacOSX で Oracle Instant Clientを使ってみる

前回、Oracle Instant Client 10g R1 for MacOSX(PPC)がMacOSX LeopardのRosettaによって動作するところまでは確認できたということを書いたが、今日は、Oracle SQL Developer 1.2.1 for MacOSX(現時点での最新版)で Oracle Instant Client 10g R1のTNS接続する方法を書いておくことにする。

SQL*PlusをTerminalやxtermから起動するのであれば .bashrc 等で環境変数を設定すればよいですが、Oracle SQL DeveloperのようなGUIツールはどうすればいいのか?
MacOSXのGUI環境では、.bashrc等は利用できない。その変わりにenvironment.plistが利用される。environment.plistの説明は、Apple Technical Q&A QA1067 : Setting environment variables for user processesを見てもらうとして早速試してみます。

Oracle_sql_developer_sprash Oracle_sql_developer_1_2_1

まず、最初は、environment.plistが存在しない状態でOracle SQL Developerを起動し、前回設定したOracle Instant Client 10g R1 for MacOSX(PPC)のtnsnames.oraを利用したTNS接続が行えるか確認してみる。
Oracle_sql_developer_create_conne_2


tnsnames.oraの定義してある接続文字列がドロップダウンメニューに現れないですね。TNS_ADMIN環境変数などが効いていません。
Oracle_sql_developer_not_appear_con


次にApple Technical Q&A QA1067 : Setting environment variables for user processesの説明通りにenvironment.plistを作成後、一旦ログオフする。
(尚、environment.plistに設定する環境変数に関しては、前回のエントリを参照してください。

Last login: Mon Feb  4 18:58:45 on console
Macintosh:˜ discus$ mkdir .MacOSX
Macintosh:˜ discus$ cat environment.plust
cat: environment.plust: No such file or directory
Macintosh:˜ discus$ cat environment.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>DYLD_LIBRARY_PATH</key>
<string>/Users/Shared/oracleInstantClient</string>
<key>NLS_LANG</key>
<string>Japanese_Japan.AL32UTF8</string>
<key>ORACLE_HOME</key>
<string>/Users/Shared/oracleInstantClient</string>
<key>TNS_ADMIN</key>
<string>/Users/Shared/oracleInstantClient</string>
</dict>
</plist>
Macintosh:˜ discus$ mv environment.plist .MacOSX
Macintosh:˜ discus$

再度、ログインして、Oracle SQL Developerを起動し同じ手順でTNS接続できるか確認する。
お〜〜、こんどは、tnsnames.oraに定義してある接続文字列がドロップダウンメニューにリストされています。
Oracle_sql_developer_appear_connect


接続テストも上手く行きました。
Oracle_sql_developer_test_session_s


最後に、SQL WorkSheetなどでEMP表にデータを登録したり問い合わせたりしてみました。これまた問題なく使えます。
Oracle_sql_developer_insert_data_to

Oracle_sql_developer_query_data_fro


この例では、MacOSX Leopard(Intel Mac)のRosetta配下で動作しているOracle Instant Clientを利用しましたが、MacOSX Tiger(PPC)版でも同様の手順で動作します。
興味のある方はお試しあれ。。..

| | コメント (0) | トラックバック (0)

2008年2月 3日 (日)

Oracle Instant Client 10g R1 for MacOSX(PPC) is running under Rosetta on MacOSX Leopard

先日、Oracle Instant Client 10g R1 for MacOSX(PPC)がMacOSX Tiger 10.4.11でも利用できるということを書いたが実はもう一つ試した事があった。
タイトルにも書いたようにOracle Instant Client 10g R1 for MacOSX(PPC)はなんと、MacOSX Leopard 11.5.1のIntel Mac上でも動作する。
(但し、Oracle側の保証など全くない事は心の片隅に置いておいてくださいね。あくまで use your own riskですから。。)

では、前回と同じくOTN USからダウンロード<したOracle Instant Client 10g R1 for MacOSX(PPC)版を解凍して、/Users/Shared/OracleInstantClient以下に配置したところから話をすすめる。

まず、環境の確認。

Macintosh:˜ discus$ /usr/sbin/system_profiler SPHardwareDataType SPSoftwareDataType | grep -E '((System|Kernel) Version|Processor (Name|Speed))'
Processor Name: Intel Core 2 Duo
Processor Speed: 2.2 GHz
System Version: Mac OS X 10.5.1 (9B18)
Kernel Version: Darwin 9.1.0


Oracle Instant Client向け環境変数及び、tnsnames.oraは前回と全く同じなので詳細は前回のエントリを参照してください。

Macintosh:˜ discus$ cat .bashrc
alias ll='ls -lv'

export ORACLE_HOME=/Users/Shared/OracleInstantClient
export NLS_LANG=Japanese_Japan.AL32UTF8
export DYLD_LIBRARY_PATH=$ORACLE_HOME
export PATH=$ORACLE_HOME:$PATH
export TNS_ADMIN=$ORACLE_HOME
Macintosh:˜ discus$ cat $TNS_ADMIN/tnsnames.ora
lampeye =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = lampeye.macdeoracle.jp)
)
)
Macintosh:˜ discus$ ls -l $ORACLE_HOME
total 182184
-r--r--r--@ 1 discus wheel 21299 4 29 2004 README_IC.htm
-r--r--r--@ 1 discus wheel 1461081 7 5 2004 classes12.jar
-r--r--r--@ 1 discus wheel 1393 2 2 10:26 glogin.sql
-rwxr-xr-x@ 1 discus wheel 14891264 12 13 2004 libclntsh.dylib.10.1
-rwxr-xr-x@ 1 discus wheel 27432 10 24 2004 libheteroxa10.dylib
-rw-r--r--@ 1 discus wheel 1516340 11 16 2004 libnnz10.dylib
-rw-r--r--@ 1 discus wheel 1841448 10 24 2004 libocci.dylib.10.1
-rwxr-xr-x@ 1 discus wheel 66160096 12 14 2004 libociei.dylib
-rwxr-xr-x@ 1 discus wheel 93028 11 9 2004 libocijdbc10.dylib
-rwxr-xr-x@ 1 discus wheel 744612 10 24 2004 libsqlplus.dylib
-r--r--r--@ 1 discus wheel 54032 7 5 2004 ocrs12.jar
-r--r--r--@ 1 discus wheel 1397543 7 5 2004 ojdbc14.jar
-r--r--r--@ 1 discus wheel 5018319 7 7 2004 orai18n.jar
drwxr-xr-x@ 4 discus wheel 136 12 14 2004 sdk
-rwxr-xr-x@ 1 discus wheel 15660 12 13 2004 sqlplus
-rw-r--r-- 1 discus wheel 225 2 2 10:31 tnsnames.ora


Sqlplus_binary_image

では、さっそく、Oracle Instant Client 10g R1 for MacOSX(PPC)版のSQL*Plusを起動してみる。
接続先は、Oracle11g EE R1 11.1.0.6.0 for Linux x86

Macintosh:˜ discus$ sqlplus /nolog

SQL*Plus: Release 10.1.0.3.0 - Production on 日 2月 3 13:49:12 2008

Copyright (c) 1982, 2004, Oracle. All rights reserved.

SQL> conn scott/tiger@lampeye
接続されました。
SCOTT> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Linux: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

SCOTT> exit
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing optionsとの接続が切断されました。
Macintosh:˜ discus$

お〜〜〜〜〜、動いた〜〜〜〜〜、さすが、MacOSXのRosettaの威力!! PowerPC用のバイナリがIntelで動いちゃった。

感動ものです!

興味のあるかたはお試しあれ!

http://www.apple.com/jp/rosetta/
http://ja.wikipedia.org/wiki/Rosetta

| | コメント (0) | トラックバック (0)

2008年1月30日 (水)

Oracle Instant Client 10g R1 for MacOSX(PPC)

さて、最近Mac De OracleなのにMacのOracleネタが少ない。。(OracleさんがMacOSX版のOracle11gとかリリースでもしてくれないとネタ切れ状態なので・・・)
・・・という理由で他のネタばかりでは申し訳ないので久々にMac De Oracle的なネタにしました。
MacOSX Tiger 10.4.11(Tigerでは最新)かつPowerPCでなら利用可能なOracle Instant Client 10g R1 for MacOSX(PPC)のネタを取り上げてみたいと思います。
Oracle Clientとして十分利用できるので使いたい方は試してみるといいでしょうね。

SQL*Plusを使うだけとか利用目的毎に分かれているが今回は全部のっけで!

まず、Oracle Instant Client 10g R1 for MacOSX(PPC)はUS OTNのサイトからダウンロードできる。(今回は全部のっけなので4つのzipファイル全部ダウンロードします。)

Oracle_instant_client_4_macosx_ppc

ダウンロードが済んだら適当な場所に解凍する。

解凍すると4フォルダになるはずです。

READMEにはいろいろ書かれていますが、むずかしいことは考えずに、各フォルダ以下にあるファイル全てを /Users/Shared以下に新たにフォルダを作りそこへ放り込みます!
今回の例では、OracleInstantClientHomeというフォルダを作成しました。つまり、/Users/Shared/OracleInstantClientHome以下に解凍した全ファイルを放り込みます。
(尚、MacOSX Tiger Serverを使っていますが、Client版でも問題同じ手順で簡単に利用できます。)

dG5Server:˜ discus$ sw_vers
ProductName: Mac OS X Server
ProductVersion: 10.4.11
BuildVersion: 8S169
G5Server:˜ discus$
G5Server:˜ discus$ echo $ORACLE_HOME
/Users/Shared/OracleInstantClientHome
G5Server:˜ discus$ ls -l $ORACLE_HOME
total 182192
-r--r--r-- 1 discus dba 21299 Apr 29 2004 README_IC.htm
-r--r--r-- 1 discus dba 1461081 Jul 5 2004 classes12.jar
-r--r--r-- 1 discus dba 1418 Jan 29 21:38 glogin.sql
-rwxr-xr-- 1 discus dba 14891264 Dec 13 2004 libclntsh.dylib.10.1
-rwxr-xr-- 1 discus dba 27432 Oct 24 2004 libheteroxa10.dylib
-rw-r--r-- 1 discus dba 1516340 Nov 16 2004 libnnz10.dylib
-rw-r--r-- 1 discus dba 1841448 Oct 24 2004 libocci.dylib.10.1
-rwxr-xr-- 1 discus dba 66160096 Dec 14 2004 libociei.dylib
-rwxr-xr-- 1 discus dba 93028 Nov 9 2004 libocijdbc10.dylib
-rwxr-xr-- 1 discus dba 744612 Oct 24 2004 libsqlplus.dylib
-r--r--r-- 1 discus dba 54032 Jul 5 2004 ocrs12.jar
-r--r--r-- 1 discus dba 1397543 Jul 5 2004 ojdbc14.jar
-r--r--r-- 1 discus dba 5018319 Jul 7 2004 orai18n.jar
drwxr-xr-- 4 discus dba 136 Dec 14 2004 sdk
-rw-r--r-- 1 discus dba 686 Jan 29 21:45 sqlnet.log
-rwxr-xr-- 1 discus dba 15660 Dec 13 2004 sqlplus

あとは、ORACLE_HOME、NLS_LANG、DYLD_LIBRARY_PATH、PATH、TNS_ADMINというおなじみの環境変数を設定します。

G5Server:˜ discus$ cat .bash_profile
. .bashrc
G5Server:˜ discus$
G5Server:˜ discus$ cat .bashrc
alias ll='ls -lv'

export ORACLE_HOME=/Users/Shared/OracleInstantClientHome
export NLS_LANG=Japanese_Japan.AL32UTF8
export DYLD_LIBRARY_PATH=$ORACLE_HOME
export PATH=$ORACLE_HOME:$PATH
export TNS_ADMIN=$ORACLE_HOME
G5Server:˜ discus$ . .bash_profile

次に、tnsnames.oraを$ORACLE_HOME以下(この例では/Users/Shared/OracleInstantClientHome以下)に作成します。
(tnsnames.oraは前述した$TNS_ADMIN環境変数で指定したパスが参照される。)

以下、専用サーバ接続用の記述例

G5Server:˜ discus$ cat $TNS_ADMIN/tnsnames.ora
lampeye =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = lampeye.macdeoracle.jp)
)
)
G5Server:˜ discus$

さあ、sqlplusを起動して接続してみましょう。(この例ではOracle11g R1へ接続)

G5Server:˜ discus$ sqlplus /nolog

SQL*Plus: Release 10.1.0.3.0 - Production on 火 1月 29 23:07:42 2008

Copyright (c) 1982, 2004, Oracle. All rights reserved.

SQL> conn scott/tiger@lampeye
接続されました。
SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Linux: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

SQL>

どうですか? 簡単でしょ!

Enjoy!

| | コメント (0) | トラックバック (0)