2009年6月29日 (月)

MacBook Pro と MacOS X 10.5.7 と Sleep と Hang-up

Macオンリーな話題です。

先日、MacBook ProのMacOS X 10.5.6を10.5.7にアップデートしてからSleepさせるとファンがスリープせずファンが凄い勢いで廻りっぱなしになったり、ハングアップしまくっていた。おかしいね、アップデータが問題なんだろうねと話していたら、すかさず、アップデータのアップデータが出ていたのでアップデートした。
すると、ファンが凄い勢いで廻りっぱなしになる現象は消えたものの99%の確立でSleepさせようとするとハングアップするようになった。なんだよ〜〜早くバグ直せ〜〜とAppleさんにお怒りモードの私。

しばらく考えこんだあげく、Apple Supportのforumを検索してみると日本のフォーラムには無かったが、USのフォーラムにはそれらしき対処方法があった。。。。。
ということで先日から試しているが、それ以降一度もハングしていない!!!!
やった〜〜〜。

とにかくAppleさん、ちゃんとバグ修正してね!!

以下、症状と対処方法を書いておきます。


症状:
MacBook Pro 15inchでMacOS X 10.5.7へアップデート後からSleepさせようとするとハングアップする。ハングアップしたまま冷却ファンが凄い勢いで廻りっぱなしになる。

Hang_when_sleep_002_2

対処方法:
システム環境設定→ネットワーク

Hang_when_sleep_001

左側のネットワークポートペインにイーサネットポートがリストされていない場合、本現象に遭遇する。"+"ボタンで使っていなくてもイーサーネットポートを追加する。
Hang_when_sleep_003
Hang_when_sleep_004
Hang_when_sleep_005

イーサーネットポートを追加したらOSを再起動する。このような対処でSleepさせようとするとhangしてしまう問題を回避できる。
(対処から4日経過したがいまのところ問題は再発していない。もし状況に変化があれば本記事を更新する予定。)

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

2009年5月14日 (木)

Leopard de Oracle10g R2 (Intel x86-64) #8 - (APEX3.2と遊ぶ #1)

さて、前回予告していたようにOracle10g R2 10.2.0.4.0 for MacOSX (Intel x86-64)へOracle Application Express 3.2をインストールして無理矢理使ってみましょう! の第一話。

Oracle Application Express3.2(以下、APEX3.2)は、http://www.oracle.com/technology/products/database/application_express/download.htmlからダウンロード。


2

今回はOracle10g R2 10.2.0.4.0 for MacOSX (Intel x86-64)APEX3.2の英語環境をインストールするところまでを試してみる。
PL/SQLパッケージ等の作成がメインだから問題になりそうな箇所はないんだけど、なんで未サポートなんだろう?。 Oracle HTTP Serverが未サポートだからその影響か?


上記URLからダウンロードしたAPEX3.2を解凍したディレクトリに移動(MacOSX Leopardでは通常Downloadフォルダへダウンロードされる。)

guppy:˜ oracle$ 
guppy:˜ oracle$ cd /Users/oracle/Downloads/apex
guppy:apex oracle$ ll
total 424
-r--r--r--@ 1 oracle oinstall 690 9 10 2008 apex_epg_config.sql
-r--r--r--@ 1 oracle oinstall 15749 1 18 17:38 apex_epg_config_core.sql
-r--r--r--@ 1 oracle oinstall 5208 1 8 13:33 apexins.sql
-r--r--r--@ 1 oracle oinstall 8476 1 8 13:33 apexvalidate.sql
-r--r--r--@ 1 oracle oinstall 1549 1 8 13:33 apxchpwd.sql
-r--r--r--@ 1 oracle oinstall 2830 12 23 18:39 apxconf.sql

・・・・中略・・・・

drwxr-xr-x@ 873 oracle oinstall 29682 2 11 05:50 images
-r--r--r--@ 1 oracle oinstall 1295 12 23 18:39 load_trans.sql
drwxr-xr-x@ 64 oracle oinstall 2176 2 8 19:34 owa
drwxr-xr-x@ 9 oracle oinstall 306 2 8 21:30 utilities
-rw-rw-r-- 1 oracle oinstall 4803 2 17 12:13 welcome.html
guppy:apex oracle$
guppy:apex oracle$

ディレクトリを移動後、SQL*Plusから赤太文字で示したapexins.sql(前述)を実行する。
実行時のパラメータはAPEXのマニュアルを見てね

guppy:apex oracle$ sqlplus /nolog

SQL*Plus: Release 10.2.0.4.0 - Production on 水 5月 13 19:08:04 2009

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

> conn / as sysdba
接続されました。
SYS> @apexins SYSAUX SYSAUX TEMP /i/

セッションが変更されました。

. ____ ____ ____ ____
. / \ | \ /\ / | /
.| || / / \ | | |
.| ||--- ---- | | |--
.| || \ / \ | | |
. \____/ | \/ \ \____ |____ \____
.
. Application Express Installation.
...................................
.
... Checking prerequisites

・・・・中略・・・・

I. I N S T A L L P R E - C R E A T E T A B L E S P E C S
...wwv_flow_init_htp_buffer

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

エラーはありません。

権限付与が成功しました。

・・・・中略・・・・

II. I N S T A L L F L O W T A B L E S
...create v function stub

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

エラーはありません。
...create nv function stub

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

エラーはありません。

・・・・中略・・・・

III. I N S T A L L F L O W P A C K A G E S P E C S
...wwv_flow_hot_http_links

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

エラーはありません。

・・・・中略・・・・

Package Specsのタイミング。
経過: 00:00:11.13

IV. I N S T A L L F L O W P A C K A G E B O D I E S
...wwv_dbms_sql
エラーはありません。

・・・・中略・・・・

Package Bodiesのタイミング。
経過: 00:02:50.20

V. P E R F O R M F L O W G R A N T S
Installing flows_files objects 2
...create flows_files
...trigger wwv_biu_flow_file_objects
エラーはありません。
Grantsのタイミング。
経過: 00:00:00.09

VI. I N S T A L L F L O W S
define "^" (hex 5e)
...internal messages
APPLICATION 4411 - APEX - System Messages
Set Credentials...
Check Compatibility...
WWV_FLOW_API.FLOWS_API_LAST_EXTENDED20090112
WWV_FLOW_API.CURRENT_FLOWS_VERSION20090112

・・・・中略・・・・

......Message f4400_p12_howto_step7
......Message internal_users
......Message database_users
......Message f4400_p22_obj_created
......Message f4400_p10_queries_help
......Message f4400_p9_tables_help
......Message f4400_p22_table_info
......Message f4400_p8_forms_help
......Message f4400_p20_reports_help
......Message f4400_p49_defs_help
......Message wwv_flow_item_protection_save_item_internal_only_show
......Message wwv_flow_sw_parser_line_exceeds_32k
......Message wwv_flow_sw_api_check_priv_obj
......Message f4050_approved_account_req_display
......Message archivelog

・・・・中略・・・・

Install Internal Flowsのタイミング。
経過: 00:00:34.94

...Development install if necessary

セッションが変更されました。

I. O R A C L E S Y S I N S T A L L P R O C E S S
dev_grants
...grant APEX owner development privileges

・・・・中略・・・・

...done grant APEX owner core privileges
...CONNECT as the Oracle user who will own the APEX engine

セッションが変更されました。

III. I N S T A L L F L O W P A C K A G E S P E C S
wwv_flow_plsql_editor.sql

・・・・中略・・・・

Development Package Specsのタイミング。
経過: 00:00:40.17
wwv_flow_plsql_editor.plb

パッケージ本体が作成されました。

・・・・中略・・・・

Development Package Bodiesのタイミング。
経過: 00:00:29.69

権限付与が成功しました。


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

VI. I N S T A L L F L O W S
define "^" (hex 5e)
APPLICATION 4000 - APEX - Application Builder
Set Credentials...
Check Compatibility...
API Last Extended:20090112
Your Current Version:20090112

・・・・中略・・・・

Install Internal Development Applicationsのタイミング。
経過: 00:09:10.55

load verification images

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

エラーはありません。

・・・・中略・・・・

Thank you for installing Oracle Application Express.

Oracle Application Express is installed in the APEX_030200 schema.

The structure of the link to the Application Express administration services is as follows:
http://host:port/pls/apex/apex_admin (Oracle HTTP Server with mod_plsql)
http://host:port/apex/apex_admin (Oracle XML DB HTTP listener with the embedded PL/SQL gateway)

The structure of the link to the Application Express development interface is as follows:
http://host:port/pls/apex (Oracle HTTP Server with mod_plsql)
http://host:port/apex (Oracle XML DB HTTP listener with the embedded PL/SQL gateway)

JOB_QUEUE_PROCESSES: 10

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


セッションが変更されました。


Performing Application Express component validation - please wait...

Completing registration process.
Validating installation.

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

Validate Installationのタイミング。
経過: 00:02:04.77

・・・・中略・・・・

VII. L O A D E N G L I S H D I C T I O N A R Y

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

...10000 rows
...20000 rows
...30000 rows
...40000 rows
...50000 rows
...60000 rows
...70000 rows
English Dictionaryのタイミング。
経過: 00:02:58.72
Upgradeのタイミング。
経過: 00:00:01.15
...End of install if runtime install
...create null.sql
Development Installationのタイミング。
経過: 00:17:28.33
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing optionsとの接続が切断されました。
guppy:apex oracle$
guppy:apex oracle$


特に問題もなくAPEX3.2の英語版はインストールできた。これなら次も順調かもよ・・・・・


次はAPEXのバージョン確認(FAQですが)。
apex_030200.wwv_flows_release関数を使えば確認できます。
ちなみにhtmldbなんて呼ばれていたころから flows_02000とか、リリース毎にスキーマ名が変る点にご注意を。但し関数名は変らないのでスキーマ名だけ注意すれば問題ないです。

guppy:apex oracle$ sqlplus /nolog

SQL*Plus: Release 10.2.0.4.0 - Production on 水 5月 13 19:08:04 2009

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

> conn / as sysdba
接続されました。

SYS> select apex_030200.wwv_flows_release from dual;

WWV_FLOWS_RELEASE
--------------------------------------------------------------------------------
3.2.0.00.27

SYS>

次回、日本語リソースのインストール。毎回思うけど、apexins.sqlで一緒にやってくれないかな?
jaとか指定するとenにつづいてjaをインストールしてくれるとか・・・・面倒で・・・。




バックナンバー

Oracle10g R2 for MacOSX (Intel x86-64) released !!!
Leopard de Oracle10g release 2 (Intel x86-64)
Leopard de Oracle10g R2 (Intel x86-64) #1
Leopard de Oracle10g R2 (Intel x86-64) #2
Leopard de Oracle10g R2 (Intel x86-64) #3 (ちょいと寄り道)
Leopard de Oracle10g R2 (Intel x86-64) #4 (Companion CD installation)
Leopard de Oracle10g R2 (Intel x86-64) #5 (dbstart and dbshut does not work!! But....)
Leopard de Oracle10g R2 (Intel x86-64) #6 (onsがバグっている?件..)
Leopard de Oracle10g R2 (Intel x86-64) #7 (iSQL*Plusのメッセージがものすごく怖い件)

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

2009年5月 8日 (金)

MacOSXでCDやDVDを焼く方法(初心者でも分かり易い方法)

義理の妹が妻のお下がりのIMac G5を使いだしてからいろいろと質問されることがあるのだが専門的な用語はあまり使えない(Mac初心者なので)。多分言葉より分かり易いのはやはり絵で見る方だよね?!。
ということで、一昨日「iPhotoで管理している画像ファイルをCDやDVDに記録するにはどうするの?」という質問への回答。
(ちなみに、MacOSXでCDやDVDに画像データ等を直接書き出す方法として複数の方法があるのだが今回はMacOSX初心者でも簡単な方法を紹介しておくね。)


「Finderのメニュー」→「ファイル」→「新規ディスク作成フォルダ」をクリック。
Finder_de_make_disc_001

ディスクトップ上に以下のようなフォルダが作成されるのでお好きな名前を付けておく
Finder_de_make_disc_002

新規ディスク作成フォルダをダブルクリックして開くと以下のようになっている。
Finder_de_make_disc_003

次にiPhotoを起動してCDやDVDに書き込みたい画像を選択する。(以下の例では、イベント単位で複数選択している。イベントを複数選択するときは⌘キーを押しながら該当イベントをクリックする。)
Finder_de_make_disc_005

次に「iPhotoメニュー」→「ファイル」→「書き出し」を選択する。
Finder_de_make_disc_006

「写真の書き出し」ダイアログが表示されるので、「ファイルの書き出し」タブで「種類」は”現在”、「サイズ」は”フルサイズ”となっていることを確認し「書き出し」ボタンをクリックする。
Finder_de_make_disc_007

次に「ファイル選択」で先ほど作成した「新規ディスク作成フォルダ」を選択して「OK]ボタンをクリック。
Finder_de_make_disc_008



Finder_de_make_disc_009

書き出しが終わったら、「新規ディスク作成フォルダ」内にある「ディスクを作成」ボタンをクリック。
空のCDかDVDを挿入するよう指示されるので、CD(CD-R/RW等)又はDVD(DVD-R/RW等)を挿入する。

Finder_de_make_disc_010

Finder_de_make_disc_011

挿入すると書き込み速度やディスク名を聞かれるので必要であれば入力する。(「新規ディスク作成フォルダ」に名称を付けていればその名称が設定される)
確認後、「ディスクを作成」ボタンをクリックする。(あとはディスクが焼終わるのを待つだけ。

Finder_de_make_disc_012

Finder_de_make_disc_013_2

この例ではCD-RWを利用して約8MBの画像ファイルを書き込んだ。書き込みが完了すると以下のような感じでデスクトップ上に現れる。ダブルクリックして開けばiPhotoから書き出した画像ファイルが確認できるはず。あとはディスクを取り出せば終わり。:)

ディスクに書き出した「新規ディスク作成フォルダ」はゴミ箱へポイしてしまえばOK.

どう? わかった? 簡単でしょ?!ーー>義妹

Finder_de_make_disc_014

Finder_de_make_disc_015




おまけ。

ちなみに、もし「新規ディスク作成フォルダ」へ、挿入するCDやDVDに書き込めないくらいの画像データ等を入れてしまった場合はちゃ〜〜〜〜んと、駄目よ〜〜〜と警告を出してくれるからCDやDVDに書き込める程度になるまでファイルを削除してね!、1枚に入りきれなければまた別のディスクを焼けばいいわけだから。:)


以下の例は、「新規ディスク作成フォルダ」へ約2.6GBのデータを入れた状態。(DVDじゃないと書き込めないサイズになってます。)
「ディスク作成」ボタンをクリックすると2.63GB以上の容量のあるディスクが必要だと警告を出してくれるし、書き込みまで進めてしまってもディスクに書き込む前に容量不足で書き込めないことを知らせてくれます。

Finder_de_make_disc_017

Finder_de_make_disc_018_2

Finder_de_make_disc_019

Finder_de_make_disc_020

Finder_de_make_disc_021

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

2009年4月 2日 (木)

ちょいと迷惑だったストアドファンクション(おまけ)

〜〜〜〜し〜〜し〜〜でぃ〜〜っ。む、ぶん!
やけに耳の残っちゃうんだよな〜。あの声とアクセント

なんて関係ない話はおいといて。。と



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

ということを書いていたが、ちょいと迷惑だったストアドファンクションの例外ハンドラーで問題解決の手がかりとするためログ出力が実装されていたらどうするの? っていうこともあるのでおまけのおまけということで書いておきます。

以前の例では例外ハンドラーをバッサリ切り捨ててしまったのですが、例外ハンドラーで問題解決の手がかりとするためのログ出力が実装されていて例外ハンドラーを取り除くことが出来ない場合、例外名無しのRAISE文を使えば解決できますよ。:)

ちょいと迷惑だったストアドファンクションの例外ハンドラーで問題解決の手がかりとするためのログ出力を実装していたらという例・・・・(赤太字部分)

尚、この例ではオープンソースのPL/SQL向けロギングフレームワークLog4PLSQLを利用している。

CREATE OR REPLACE
PACKAGE inconvenient_package
AS
TYPE employeesType IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER;
TYPE membersType IS RECORD (
deptNo dept.deptNo%TYPE
,deptName dept.dName%TYPE
,employees employeesType
);
FUNCTION inconvenient_function(iDeptNo IN dept.deptNo%TYPE)
RETURN membersType;
END inconvenient_package;
/
show errors


CREATE OR REPLACE
PACKAGE BODY inconvenient_package
AS
FUNCTION inconvenient_function(iDeptNo IN dept.deptNo%TYPE)
RETURN membersType
AS
members membersType;
Log4PlsqlCtx plogparam.log_ctx := plog.init(pDBMS_OUTPUT => TRUE); -- Log4PLSQL setting
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;
EXCEPTION
WHEN NO_DATA_FOUND THEN
plog.warn(Log4PlsqlCtx, sqlerrm()); -- Log4PLSQL warnning
RETURN NULL;
END inconvenient_function;
END inconvenient_package;
/
show errors


変更前ファンクションの例外ハンドラー部分にある"RETURN NULL;"を"RAISE;"(例外名無しのRAISE文)に変更するだけ。

CREATE OR REPLACE
PACKAGE BODY inconvenient_package
AS
FUNCTION inconvenient_function(iDeptNo IN dept.deptNo%TYPE)
RETURN membersType
AS
members membersType;
Log4PlsqlCtx plogparam.log_ctx := plog.init(pDBMS_OUTPUT => TRUE); -- Log4PLSQL setting
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;
EXCEPTION
WHEN NO_DATA_FOUND THEN
plog.warn(Log4PlsqlCtx, sqlerrm()); -- Log4PLSQL warnning
RAISE;
END inconvenient_function;
END inconvenient_package;
/


例外ハンドラー内で例外名を省略すると該当する例外がさらに外側のブロックへスローされます。詳細はマニュアル(Oracle Database PL/SQL Language Reference 11g Release 1 : RIASE statement)及び、Oracle Database PL/SQL Language Reference 11g Release 1 : How PL/SQL Exceptions Propagate参照のこと。

SCOTT> set linesize 132
SCOTT> set serveroutput on
SCOTT> l
1 DECLARE
2 members inconvenient_package.membersType;
3 Log4PlsqlCtx plogparam.log_ctx := plog.init(pDBMS_OUTPUT => TRUE);
4 BEGIN
5 BEGIN
6 members := inconvenient_package.inconvenient_function(99);
7 DBMS_OUTPUT.PUT_LINE(
8 'Dept name/id:'
9 ||members.deptname
10 ||'/'||TO_CHAR(members.deptno)
11 );
12 FOR i IN members.employees.FIRST..members.employees.LAST LOOP
13 DBMS_OUTPUT.PUT_LINE(' -- '||members.employees(i).ename);
14 END LOOP;
15 EXCEPTION
16 WHEN NO_DATA_FOUND THEN
17 plog.warn(Log4PlsqlCtx, sqlerrm());
18 END;
19* END;
SCOTT> /
12:35:27:02-WARN-block-->SCOTT.INCONVENIENT_PACKAGE ORA-01403: データが見つかりません。
12:35:27:03-WARN-block ORA-01403: データが見つかりません。

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

SCOTT> l
1 DECLARE
2 members inconvenient_package.membersType;
3 Log4PlsqlCtx plogparam.log_ctx := plog.init(pDBMS_OUTPUT => TRUE);
4 BEGIN
5 BEGIN
6 members := inconvenient_package.inconvenient_function(10);
7 DBMS_OUTPUT.PUT_LINE(
8 'Dept name/id:'
9 ||members.deptname
10 ||'/'||TO_CHAR(members.deptno)
11 );
12 FOR i IN members.employees.FIRST..members.employees.LAST LOOP
13 DBMS_OUTPUT.PUT_LINE(' -- '||members.employees(i).ename);
14 END LOOP;
15 EXCEPTION
16 WHEN NO_DATA_FOUND THEN
17 plog.warn(Log4PlsqlCtx, sqlerrm());
18 END;
19* END;
SCOTT> /
Dept name/id:ACCOUNTING/10
-- CLARK
-- KING
-- MILLER

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

SCOTT>

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

2008年4月17日 (木)

埋込みPL/SQL Gatewayで外部URLアクセス

Oracle11g R1 11.1.0.6.0 for Linux x86 and Oracle Application Expressという記事で埋込みPL/SQL GatewayをでPython Challengeを試してみたのだが・・・埋込みPL/SQL Gatewayを利用した場合、UTL_HTTPパッケージで外部のURLへアクセスすることはできないみたいなので、あきらめて通常のmod_plsqlでやってみるか・・・。Oracle11gからならACLで許可してやればアクセスできるのに、Oracle11gに内蔵されているXDB HTTP Serverではそれは効かないのね。。遊べると思ったのに。。orz.(Oracle11gの埋込みPL/SQL Gatewayの備忘録として残しておくか。。)

エラーメッセージは以下の通り。(Apexを3.1にするとできるようになったりして。。。2008/4/19追記)

ORA-31020:操作できません。 理由:For security reasons, ftp and http access over XDB repository is not allowed on server side

以下、埋込みPL/SQL Gatewayを利用したOracle Application Expressのスクリーンショット
9


4/18追記
どうもこれは埋込みPL/SQL GatewayというよりOracle Application Express側の影響のように思えてきた。10gのmod_plsql経由でもApexでは同じエラーだった。
ちなみに、mod_plsql経由で呼び出すだけならACL定義でアクセスするホストを許可してやるだけでOK。

以下にその時のスクリーンショットを載せておく。
答えにLevel17の答えに結びつく部分はぼかしてますよ〜〜。

19


でも何故、ApexからUTL_HTTPを利用するとXDB絡みのエラーになるんだ? 不思議すぎる。。。これは追々調べておくか。。何か手順から漏れていることがあったりして。。。。つづく。

さらに追記、やはり出来ない(11gからはできなくなったと言ったほうがいいだろう)というのが正しいようだ。10gではApexから直接UTL_HTTPパッケージからHTTPリクエスト出してfeedやらHTMLやらアクセスし放題だったのに〜〜〜、プンプンのプン。 ふ〜普通のmod_plsqlでやりますよ〜〜〜〜だ。

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

2008年4月14日 (月)

Java AppletがWindowsのJavaSE6.0 Update5で動作しない件

megawattさんのブログは見ていたものここ数日コメント欄までは見ていなかったよ。megawattさんが忙しいのは知ってたけどメールくれれば調べといたのに〜。 :)
megawattさんのブログの日本の借金時計は私のブログ内にあるアプレットを呼び出しているだけですから。

ということで調べてみた。

おかげで、何ヶ月か振りでWindowsを起動しちゃったよ。(笑

結論から言うと、Java SE6.0 update 5のバグっぽい。

試してみたところWindows XP SP1(32bit)にJ2SE5.0のJREのみインストールしてある場合にはIE6、FIrefox2、Safari3.1とも特に問題もなくapplet動作する

次に、J2SE5.0をアンインストールした後にJavaSE6.0のJREのみインストールし、IE6、FIrefox2、Safari3.1でappletを起動してみると、IE6以外はappletが正しく動作せず、Firefox2やSafari3.1ではその後挙動があやしくなりHang upしたり、強制終了すると起動しなくなったりと散々な結果になった。IEはやはり動きが特殊なのなかぁ。
以下、その時のスクリーンショット。

Javase6_applet_win01

Javase6_applet_win02 Javase6_applet_win03

Javase6_applet_win04


Javase6_applet_win06


Javase6_applet_win07


Javase6_applet_win08


それは置いといて、JavaSE6.0でappletを動作させる方法は、このブログに書かれていた。(ありがとうございます)ので早速試してみると、お〜〜お見事! 回避できた。
Javase6_applet_win09

Javase6_applet_win10

Javase6_applet_win11


ちなみに、MacOSXではJavaSE6.0はPreview ReleaseのままですがWindowsのコントロールパネルと違い、Appletを実行するjavaのversionを簡単に切り替えられる。
とは言ってもMacOSX版では今のところ今回のような問題は起きていない(ようだ)。

Javase6_applet_mac_preference


ちなみに、MacOSX 10.4.11 PowerPC G5ではOpera9.25/Safari3.1/Firefox2.0.0.13ともOKだった。

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

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年1月27日 (日)

MacOSX で Eclipse の日本語化(備忘録)

Eclipseの日本語化プラグインのインストール手順について以下を参考にしたのだが、MacOSX以外の記述もあり少々分かりにくかったので自分なりの備忘録として書いておく。
とはいってもMacOSX上で利用する可能性は低いのだけれど・・・
Eclipse Wiki - 日本語化に関する記述

だったら何故、EclipseをMacOSXで使おうと思ったのか?・・・・

先日、OTN-Jのエントリに回答したのがきっかけで・・・、仕事ではEclipseを利用する事が多いウチの奥さんと

私     :「MacOSXでEclipseを日本語化する手順ってブログで書いてたっけ?
ウチの奥さん:「書いてないと思う」

という話になりこのエントリを書く気になったというわけ。。。(個人的には日本語化しないと使いにくいというわけでもないのですが・・・)

2008/1/28追記
奥さん曰く、Eclipseネタは沢山あるからネタとしてはつまらないし、誰かがもう書いていると思ったからだとか。。。

今回利用した Eclipse for MacOSXのバージョンは、3.3.1.1
日本語化プラグインは、pleiades-all-in-one-java-wtp_20071121.zip
MacOSX : version 10.4.11

http://www.eclipse.org/downloads/
http://mergedoc.sourceforge.jp/

※ダウンロードしたEclipseと日本語化プラグインはぞれぞれ適当なフォルダで解凍済み。

以下の例では、Eclpseと日本語化プラグインはそれぞれ

/Volumes/ExtraDisk/Application



/Volumes/DiscusWork/temp

以下に解凍した。

Last login: Wed Jan 23 17:16:05 on console
Welcome to Darwin!
G5Server:˜ discus$
G5Server:˜ discus$ cd /Volumes/ExtraDisk/Application/eclipse/
G5Server:/Volumes/ExtraDisk/Application/eclipse discus$ ls -l
total 64
drwxr-xr-x 3 discus discus 102 Nov 4 02:47 Eclipse.app
drwxr-xr-x 10 discus discus 340 Jan 23 18:06 configuration
lrwxrwxrwx 1 discus discus 34 Jan 23 17:48 eclipse -> Eclipse.app/Contents/MacOS/eclipse
-rw-r--r-- 1 discus discus 16536 Nov 4 02:47 epl-v10.html
drwxr-xr-x 104 discus discus 3536 Jan 23 17:50 features
-rw-r--r-- 1 discus discus 6506 Nov 4 02:47 notice.html
drwxr-xr-x 461 discus discus 15674 Jan 23 17:52 plugins
drwxr-xr-x 3 discus discus 102 Nov 4 02:47 readme
G5Server:/Volumes/ExtraDisk/Application/eclipse discus$

※これが重要。
日本語化パッケージのconfiguration、features、pluginsの各ディレクトリ以下にある全ファイルをコピーする(注:ディレクトリごと上書きしないように!)

G5Server:/Volumes/ExtraDisk/Application/eclipse discus$ cp -Rf /Volumes/DiscusWork/temp/pleiades-all-in-one-java-wtp_20071121/configuration/*.* configuration
G5Server:/Volumes/ExtraDisk/Application/eclipse discus$ cp -Rf /Volumes/DiscusWork/temp/pleiades-all-in-one-java-wtp_20071121/features/*.* features
G5Server:/Volumes/ExtraDisk/Application/eclipse discus$ cp -Rf /Volumes/DiscusWork/temp/pleiades-all-in-one-java-wtp_20071121/plugins/*.* plugins
G5Server:/Volumes/ExtraDisk/Application/eclipse discus$

※eclipse.iniを編集。

(configuration以下のelipse.iniではないので注意。)
G5Server:/Volumes/ExtraDisk/Application/eclipse discus$ cat Eclipse.app/Contents/MacOS/eclipse.ini
-showsplash
org.eclipse.platform
-vmargs
-Xdock:icon=../Resources/Eclipse.icns
-XstartOnFirstThread
-Xms40m
-Xmx512m
-XX:MaxPermSize=256m
-javaagent:/Volumes/ExtraDisk/Application/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar=no.mnemonic
-Dosgi.requiredJavaVersion=1.5
-Dorg.eclipse.swt.internal.carbon.smallFonts


※細かいことは考えずにとりあえず、-cleanを付けて起動しちゃう。(日本語プラグイン追加後に一度だけ。)

G5Server:/Volumes/ExtraDisk/Application/eclipse discus$ 
G5Server:/Volumes/ExtraDisk/Application/eclipse discus$ ./eclipse -clean &
[1] 1814
2008-01-23 18:06:41.005 eclipse[1704] [Java CocoaComponent compatibility mode]: Enabled
2008-01-23 18:06:41.005 eclipse[1704] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000

G5Server:/Volumes/ExtraDisk/Application/eclipse discus$
[1]+ Done ./eclipse -clean
G5Server:/Volumes/ExtraDisk/Application/eclipse discus$

上手くできました〜。 :)


Eclipse1 Eclipse2

Eclipse3

Eclipse4

最後の画像は、最初に

先日、OTN-Jのエントリに回答したのがきっかけで・・・、

と書いた”きっかけ”の話題に関連したおまけ・・・次回のエントリはそのネタにしようかと思う。

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

2008年1月22日 (火)

Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #4 のおまけ

Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #4では専用サーバ接続であるためoracle.exeがユーザメモリ空間の制限である2GBを超えてスレッドを作れずにORA-12518が発生していた。
では2GBを超えない範囲で共有サーバを起動して接続した場合はどうなるだろうか?(大抵の方は共有サーバ接続であればこの問題を解決できることは認識されていると思うが共有サーバ接続にした場合、専用サーバ接続に比べデメリットもある。テスト環境でしっかりテストし条件を満たせるかしっかり見極める必要がある。共有サーバ接続のご利用は計画的に!!)

2006年のOOWで興味深い資料が公開されていたのでURLを載せておきます。
http://www.oracle.co.jp/openworld/tokyo2006/session_download/1B-8.pdf

以下に示した初期化パラメータ以外は以前のエントリで記載した値に同じ

SYS> alter system set shared_servers=5 scope=both;

システムが変更されました。

SYS> alter system set dispatchers='(PROTOCOL=TCP)(SERVICE=catfishS)(DIS=10)' scope=both;

システムが変更されました。

SYS> select name,network from v$dispatcher;

NAME NETWORK
---- --------------------------------------------------------------------------------
D000 (ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=3818))
D001 (ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=1463))
D002 (ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=1464))
D003 (ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=1465))
D004 (ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=1466))
D005 (ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=1467))
D006 (ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=1468))
D007 (ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=1469))
D008 (ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=1470))
D009 (ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=1471))


10行が選択されました。

SYS> $lsnrctl service

SYS> select count(*) from v$session;

COUNT(*)
----------
16


ここでJDeveloperから接続(400セッション)接続に利用したコードは以前テストで利用したものと同じ。
Shared_server_jdev

Shared_server_win_mon

SYS> select count(*) from v$session;

COUNT(*)
----------
416

SYS> $lsnrctl service

LSNRCTL for 32-bit Windows: Version 10.2.0.2.0 - Production on 20-1月 -2008 14:47:56

Copyright (c) 1991, 2005, Oracle. All rights reserved.

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=catfish.macdeoracle.jp)(PORT=1521)))に接続中
サービスのサマリー...
サービス"catfish.macdeoracle.info"には、1件のインスタンスがあります。
インスタンス"catfish"、状態READYには、このサービスに対する1件のハンドラがあります...
ハンドラ:
"DEDICATED" 確立:0 拒否:0 状態:ready
LOCAL SERVER
サービス"catfishS.macdeoracle.info"には、1件のインスタンスがあります。
インスタンス"catfish"、状態READYには、このサービスに対する10件のハンドラがあります...
ハンドラ:
"D009" 確立:40 拒否:0 現行:40 最大:1002 状態:ready
DISPATCHER <machine: CATFISH, pid: 320>
(ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=2213))
"D008" 確立:40 拒否:0 現行:40 最大:1002 状態:ready
DISPATCHER <machine: CATFISH, pid: 2756>
(ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=2212))
"D007" 確立:40 拒否:0 現行:40 最大:1002 状態:ready
DISPATCHER <machine: CATFISH, pid: 2912>
(ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=2211))
"D006" 確立:40 拒否:0 現行:40 最大:1002 状態:ready
DISPATCHER <machine: CATFISH, pid: 856>
(ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=2210))
"D005" 確立:40 拒否:0 現行:40 最大:1002 状態:ready
DISPATCHER <machine: CATFISH, pid: 2092>
(ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=2209))
"D004" 確立:40 拒否:0 現行:40 最大:1002 状態:ready
DISPATCHER <machine: CATFISH, pid: 1256>
(ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=2208))
"D003" 確立:40 拒否:0 現行:40 最大:1002 状態:ready
DISPATCHER <machine: CATFISH, pid: 3236>
(ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=2206))
"D002" 確立:40 拒否:0 現行:40 最大:1002 状態:ready
DISPATCHER <machine: CATFISH, pid: 3248>
(ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=2205))
"D001" 確立:40 拒否:0 現行:40 最大:1002 状態:ready
DISPATCHER <machine: CATFISH, pid: 3312>
(ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=2204))
"D000" 確立:40 拒否:0 現行:40 最大:1002 状態:ready
DISPATCHER <machine: CATFISH, pid: 3288>
(ADDRESS=(PROTOCOL=tcp)(HOST=catfish.macdeoracle.jp)(PORT=2203))
コマンドは正常に終了しました。

SYS>
SYS>

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

2007年12月21日 (金)

太った空白

書こうか迷っていたのだが、意外とハマっている方が多いらしいので書いておく事にした。
まあ、エラーメッセージがわかりずらいのでしょうがないとは思うが。

PL/SQLで開発する際に出くわす事がある。
(私もたまにやっちゃいますけどハマることはないです。こればかりは慣れるしかないですね。)

ということで太った空白のお話。

PL/SQLではマルチバイト文字の空白(全角の空白と言ったほうがわかりやすいでしょうか?)が原因で意味不明のコンパイルエラーを引き起こす。
そう、”太った空白”と書いたのはマルチバイト文字の空白。半角の空白が2つあるように見えるが全角の空白が1文字。

まずは、以下の例を見てください。

Last login: Fri Dec 21 08:25:31 on console
Welcome to Darwin!
G5Server:˜ discus$ su - oracle
Password:
G5Server:˜ oracle$ ssh oracle@corydoras
oracle@corydoras's password:
Last login: Sun Dec 16 18:02:52 2007 from 192.168.1.19
[oracle@corydoras ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on 金 12月 21 19:50:10 2007

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

> conn scott/tiger
接続されました。
SCOTT> create or replace function now
2 return timestamp
3 is
4 begin
5  return systimestamp;
6 end;
7 /

警告: ファンクションが作成されましたが、コンパイル・エラーがあります。

SCOTT> show errors
FUNCTION NOWのエラーです。

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/3 PLS-00103: 記号""が見つかりました。 次のうちの1つが入るとき:
( begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge
記号"" は無視されました。

上記では、now()というストアドファンクションを作成しようとして5行目の3カラム目でコンパイルエラーが発生している。
(ストアドファンクション自体は意味の無いものなので気にしないでね。コンパイルエラーに注目してください。)

5行目の3カラム目は、"r"だなと思ったあなたは、もうすでにハマっていますよ。

実は、5行目の先頭の空白は半角の空白2文字ではなく”全角の空白1文字”なんです。

もうお分かりですよね。では、全角空白1文字を半角空白2文字に置換して再実行してみましょう。

SCOTT> list 5
5*  return systimestamp;
SCOTT> c / return/ return
5* return systimestamp;
SCOTT> l
1 create or replace function now
2 return timestamp
3 is
4 begin
5 return systimestamp;
6* end;
SCOTT> /

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

SCOTT> select now() from dual;

NOW()
---------------------------------------------------------------------------
07-12-21 19:56:19.046993000

SCOTT> /

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

2007年11月14日 (水)

Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #4

久々のオラクルネタですがWindows版のOracleネタです。随分前にこんなこと書いてました。

で、それ以後、見た目にはどんなエラーがでるの? とか、最近の検索フレーズ/ワードに、"Windows oracle 最大 session数"のようなフレーズを多く目にするようになったので、超簡単な再現例を一つ。


尚、Windows 32ビット環境で同時接続可能なセッション数(processes、sessions初期化パラメータに設定している値を超えた場合を除く。)は、SGAのサイズや各セッションのPGAサイズ、それに専用サーバーであるか、共有サーバーであるかという点にも影響される。お使いのシステムで、どの程度まで同時に接続できるかはその環境でしか確認できないということを付け加えておく。

また、必要最小限のPGAサイズ(単に接続しているだけなので)でどれだけ同時に接続できるのかを試している点にもご注意願いたい。(ストアドやDML文を実行する際に必要なPGAサイズはもっと大きくなる場合がほとんどなので実際に同時接続できるセッション数はもっと少なくなることの方が多い。)

●準備

この例ではすぐに接続数の上限に達するようSGAサイズはOracle10g R2 EE for Windows(32bit)が起動できる限界付近のサイズまで増加させた。

注)この方法でテストするのであれば、変更前のspfileをpfileへ退避して置く事をおすすめします。SGAサイズを大きくし過ぎてOracleを起動できなくなった場合でもpfileを使って起動することで元に戻せますから。

接続は専用サーバー接続で行い、目的のエラーを発生させる以前にprocess数やsession数の上限を超えないようにprocesses初期化パラメータを調整してある。
(SGA_TARGET及び、SGA_MAX_SIZE初期化パラメータは、私の環境でOracle10g EEが起動できる最大サイズに近い値に設定してある。ここまでSGAサイズを大きくすると、SQL*Plusを複数起動して接続するという力技でも目的のエラーを再現できる。その他初期化パラメータは以下を参照のこと。)

SYS>

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Prod
PL/SQL Release 10.2.0.2.0 - Production
CORE 10.2.0.2.0 Production
TNS for 32-bit Windows: Version 10.2.0.2.0 - Production
NLSRTL Version 10.2.0.2.0 - Production

SYS> show parameter sga_

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_max_size big integer 1760M
sga_target big integer 1760M
SYS>

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 60M
SYS>
SYS> show parameter sessions

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
・・・・中略・・・・
sessions integer 555
・・・・中略・・・・
SYS>
SYS>
SYS> show parameter processes

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
・・・・中略・・・・
processes integer 500
SYS>

SYS> select sum(value) from v$sga;

SUM(VALUE)
----------
1845493760

SYS>
SYS> select count(*) from v$session;

COUNT(*)
----------
16


前述の状態で、ひたすら(と言っても400までだが)Oracleへ接続するだけのjava programを実行すると。。。oracle.exeのVMサイズが2GBを超えた為に、あたらなスレッドを作れないことが原因で、ORA-12518というエラーが発生する。

●以下、JDeveloper10gで試してるスナップショット

Jdev_macosx_maxconn

/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/bin/java -server -classpath /Users/discus/jdevhome/mywork/MaxConnection/
MaxConnection/classes:/Volumes/ExtraDisk/Application/JDeveloper.app/Contents/Resources/jdev/jdbc/lib/ojdbc14dms.jar:/Volumes/ExtraDisk/
Application/JDeveloper.app/Contents/Resources/jdev/jdbc/lib/orai18n.jar:/Volumes/ExtraDisk/Application/JDeveloper.app/Contents/Resources/jdev/
jdbc/lib/ocrs12.jar:/Volumes/ExtraDisk/Application/JDeveloper.app/Contents/Resources/jdev/diagnostics/lib/ojdl.jar:/
Volumes/ExtraDisk/Application/JDeveloper.app/Contents/Resources/jdev/lib/dms.jar maxconnection.MaxConnection
コネクション数:21
java.sql.SQLException: Listener refused the connection with the following error:
ORA-12518, TNS:listener could not hand off client connection
The Connection descriptor used by the client was:
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(PORT=1521)(HOST=192.168.1.2))(CONNECT_DATA=(SERVICE_NAME=catfish.macdeoracle.info)))

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:138)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:293)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:328)
at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:430)
at oracle.jdbc.driver.T4CConnection.(T4CConnection.java:151)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:608)
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:218)
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:159)
at maxconnection.MaxConnection.(MaxConnection.java:26)
at maxconnection.MaxConnection.main(MaxConnection.java:41)


●21セッション増えたことの確認!

SYS> r   
1* select count(*) from v$session

COUNT(*)
----------
37

SYS>

SGAサイズをOracleが起動可能な最大値に近づけたため、たった22セッションでoracle.exeのVMサイズが2GBを超えORA-12518が発生した。

ハッキリ言って、ORA-12518 : TNS:listener could not hand off client connection というエラーメッセージを見て32ビット版Windowsの上で実行されているoracle.exeが2GBの制限を超えたため新たなスレッドを作ることができなかったエラーであると、直感的に理解出来る人は少ないんじゃないかと思う。
(他の原因でこのエラーが発生する場合もあるのかもしれないが、私がこのエラーを目にしたのはWindows環境でoracle.exeが利用できるメモリサイズを超過したため新たに専用サーバーのスレッドを作れなかった場合だけだった。
2007/11/29追記:共有サーバーモードでも試してみるか!。またWindowsでOracleを使う事もあるだろうから。。ー>TODO)

不幸にしてORA-12518に遭遇した場合は、まず最初にoracle.exeのVMサイズが2GBを超えていないか確認したほうがいいだろう。(尚、本番システムやテスト環境で発生する場合は、SGAと新たに必要とするされるPGAサイズの関係で、oracle.exeのVMサイズが1.5GBから1.6GB程度でも発生する場合もある。)

●以下、マニュアルからの引用


ORA-12518: TNS: リスナーはクライアント接続をハンドオフできませんでした
 原因: クライアント接続を別のプロセスにハンドオフするプロセスが失敗しました。
 処置: トレースをオンにして、失敗した操作を再実行してください。
    リスナーおよびデータベース・インスタンスが、

    ダイレクト・ハンドオフに対して正しく構成されていることを確認してください。
    問題が解決されない場合は、オラクル社カスタマ・サポート・センターに連絡して
    ください。



●以下、テストに利用したjavaのソース。

package jp.macdeoracle.maxconnection;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import oracle.jdbc.pool.OracleDataSource;


public class MaxConnection
{
public MaxConnection()
{
OracleDataSource ods;
ArrayList connList = new ArrayList();
try
{
ods = new OracleDataSource();
ods.setServerName( "192.168.1.2" );
ods.setServiceName( "catfish.macdeoracle.info" );
ods.setPortNumber( 1521 );
ods.setDriverType( "thin" );
ods.setUser( "scott" );
ods.setPassword( "tiger" );

for (int i=0;i<400;i++){
connList.add( ods.getConnection() );
}

} catch (SQLException e)
{
e.printStackTrace();
} finally
{
System.out.println("コネクション数:"+connList.size());
}
}

public static void main(String[] args)
{
MaxConnection maxConnection = new MaxConnection();

try
{
Thread.sleep(60000L); //sleep 60sec
}
catch (InterruptedException e)
{
// TODO
}
}
}


おまけ。
ORA-12518が発生した際、Pslist.exeを実行して取得したoracle.exeのVMサイズとスレッド一覧の例)

VMサイズ(赤字)が2GBに近い。

Thread detail for CATFISH:

Name Pid VM WS Priv Priv Pk Faults NonP Page
oracle 972 2074972 324688 1918700 1922024 123716 59 165
oracle 972:
Tid Pri Cswtch State User Time Kernel Time Elapsed Time
2832 9 314 Wait:Executive 0:00:00.000 0:00:00.250 0:37:03.156
2228 9 97 Wait:UserReq 0:00:00.000 0:00:00.031 0:37:01.281
2236 9 327 Wait:UserReq 0:00:00.000 0:00:00.015 0:37:01.265
2376 10 1082 Wait:UserReq 0:00:00.000 0:00:00.046 0:36:57.718
2380 8 1363 Wait:UserReq 0:00:00.015 0:00:00.000 0:36:57.687
2384 8 999 Wait:UserReq 0:00:00.375 0:00:00.015 0:36:57.671
・・・・中略・・・・
2484 10 45 Wait:UserReq 0:00:00.000 0:00:00.015 0:00:02.359
1512 10 48 Wait:UserReq 0:00:00.031 0:00:00.015 0:00:02.312
2316 10 45 Wait:UserReq 0:00:00.015 0:00:00.015 0:00:02.250

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

2007年9月28日 (金)

"日本語"のデータベースオブジェクト名 #2

ということで、前回のつづきというか、予告通り、"日本語"(マルチバイト文字)をデータベースオブジェクト名として定義しているデータベースで起こりうる問題点について。

"日本語"(マルチバイト文字)で 表名、列名、いないと思うけど(笑)ストアドプロシージャ名などを定義している方々は注意しておいたほうがよいだろう。

Oracleで許可されているデータベースオブジェクト名のサイズは、マニュアルにも記載されているように、データベース名とデータベースリンクを除き、30バイトまでと規定されていることを思い出してほしい。

日本語:Oracle Database SQLリファレンス 10g リリース2(10.2) - スキーマ・オブジェクトのネーミング規則

英語:Oracle® Database SQL Reference 10g Release 2 (10.2) - Schema Object Names and Qualifiers

例えば、データベースキャラクタセットが、JA16SJISである場合、テーブル名や列名を日本語(マルチバイト文字)で定義すると利用できる文字数は最大15文字までである。(半角英数字であれば、30文字)

以下、データベースキャラクタセット:JA16SJIS環境下でマルチバイト/シングルバイトでテーブル名を定義した場合の例

SCOTT> select * from v$nls_parameters where parameter = 'NLS_CHARACTERSET';

PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET JA16SJISTILDE

SCOTT>
SCOTT>
SCOTT> create table z12345678901234567890123456789 (a number);

表が作成されました。

●マルチバイト文字で15文字(30バイト)なのでOK!

SCOTT> create table "Z12345678901234" (a number);

表が作成されました。

SCOTT> create table z12345678901234567890123456789x (a number);
create table z12345678901234567890123456789x (a number)
*
行1でエラーが発生しました。:
ORA-00972: 識別子が長すぎます。

●マルチバイト文字で16文字(32バイト)なのでNG!

SCOTT> create table "Z123456789012345" (a number);
create table "Z123456789012345" (a number)
*
行1でエラーが発生しました。:
ORA-00972: 識別子が長すぎます。


SCOTT>
SCOTT> select table_name,lengthb(table_name) from user_tables;

TABLE_NAME LENGTHB(TABLE_NAME)
------------------------------ -------------------
Z12345678901234567890123456789 30
Z12345678901234 30

SCOTT>


前述のようなJA16SJISをデータベースキャラクタセットとするデータベースを、Unicodeのキャラクタセットである AL32UTF8 をデータベースキャラクタセットとするデータベースへ移行しようとした場合、どうなるか想像できますか?

想像できますよね? 

そう、単純には移行できないのですよ。JA16SJISでは2バイトだった文字がAL32UTF8では3バイトになる訳ですから。

マルチバイト1文字のバイト数の増加によりデータ量も増加するので、DISK容量の見直しも必要になるのですが、一番問題になるのが、日本語でデータベースオブジェクト名を定義しているという点でしょう。

もし、表名や列名を日本語(マルチバイト文字)11文字以上で定義しているとしたら、データベースキャラクタセットが AL32UTF8 であるデータベース上では、DDL全てがエラーになるはずです。
それらを修正するとなると、SQL/DDL文。その他プログラムに至まで、その影響は広範囲に渡るのではないでしょうか?


将来的なことも考慮してUnicode環境へ移行したいということであれば、コストを掛けて移行する価値はあると思います。その際にはシングルバイト文字で各名称を定義したほうがよいでしょうね。日本語の表名や列名の方が、直感的にわかりやすいからと日本語でテーブル名や列名を定義し、たった10文字でわかりやすい名称を定義することはかなり難しいと思いますから。

A:「--------」
B:「え、10文字でも定義できますよって!? 」
B:「もしや、"T123456789"とかいうテーブル名にでもしようと考えていますか?」
B:「それとも、名称を省略しまくって10文字以内の略名にしようと考えているのでしょうか?」
B:「それが、直感的に見てわかりやすい名称でしょうか?」
B:「見て、直感的に理解しやすいから日本語名称でテーブル名を定義したいのではないですか?」
な〜〜〜〜んて、やりとりが聞こえてきそう。。。

私が関わったところではそんな面倒なところは無かったので幸せだったりするが・・・・・

以下、データベースキャラクタセット:AL32UTF8環境でマルチバイト/シングルバイト、それぞれでテーブル名を定義した場合の例

SCOTT> select * from v$nls_parameters where parameter = 'NLS_CHARACTERSET';

PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET AL32UTF8

SCOTT>
SCOTT> create table z12345678901234567890123456789 (a number);

表が作成されました。

●マルチバイト文字で15文字(45バイト)!、当然サイズ超過!


SCOTT> create table "Z1234567891234" (a number);
create table "Z1234567891234" (a number)
*
行1でエラーが発生しました。:
ORA-00972: 識別子が長すぎます。

●マルチバイト文字で10文字。(30バイト)

SCOTT> create table "Z123456789" (a number);

表が作成されました。

●シングルバイト文字で31文字(31バイト)なので当然エラー!

SCOTT> create table z12345678901234567890123456789x (a number);
create table z12345678901234567890123456789 (a number)
*
行1でエラーが発生しました。:
ORA-00972: 識別子が長すぎます。


SCOTT>


SCOTT> select table_name,lengthb(table_name) from user_tables;

TABLE_NAME LENGTHB(TABLE_NAME)
------------------------------------------------------------ -------------------
Z123456789 30
Z12345678901234567890123456789 30

SCOTT>

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

2007年9月27日 (木)

"日本語"のデータベースオブジェクト名 #1

Oracle10gのグローバリゼーションガイドには、新たに構築するデータベースでは、データベースキャラクタセットとして AL32UTF8 を推奨している。
Oracle Database グローバリゼーション・サポート・ガイド
10g リリース2(10.2)- データベース・キャラクタ・セットに関する指示書

ちなみに、Oracle製品間であっても、こんな注意点もある。
Oracle Content Management SDK(Oracle CM SDK)

とにかく、データベースキャラクタセットを選択する際には、関連するプロダクトの制限などもよ〜〜く調査して、方針を決めないといけないだろうね。あとで苦労しないためにも。

次回は、データベースキャラクタセット絡みで注意しないとならない点を書こうかな。
特に、日本語(マルチバイト文字)で表名、列名、その他のデータベースオブジェクト名を定義しているようなところでは注意しておいたほうがよい点について書いてみようかと。

そういえば、"日本語" de ストアドなんてお遊びもやってましたねぇ。(^^;;

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

2007年9月23日 (日)

SQL*Loader で BLOBロード

少々前に、大量のBLOBデータをデータベースへロードするためのプログラムをコーディングしている方がいたのだが、そのプログラムの仕様を聞いてみたら、SQL*Loaderでも対応可能な内容だった。SQL*LoaderでBLOBデータをローディングできることは知らなかったのだ。知っていたらもっと楽だったろうに。


今回の例ではOracle10g R1を利用しているのだが、Oracle10g R2でも使い方は同じ。

● 参考:
・Oracle Database ユーティリティ 10g リリース1(10.1)
・Oracle Database ユーティリティ 10g リリース2(10.2)LOBFILEからのLOBデータロード
・Oracle Database ユーティリティ 10g リリース2(10.2)EXPRESSIONパラメータ

ということで、前述の話に比べると少々単純なのだがロードの例を一つ。

● まずは準備。

BLOBを格納する表のキーはユニークな数値なので、シーケンスを利用する。え!? SQL*Loaderでシーケンスが利用できるのか?
できるんです。EXPRESSIONパラメータを利用すれば!(EXPRESSIONパラメータの利用例は随分前にOTN-JのCode Tipsへも投稿してあったっけ。OTN-JのCode Tipsを参照するにはOTN-Jへのユーザ登録(無料)必要です。)

> conn scott/tiger
接続されました。
SCOTT>
SCOTT>
SCOTT> create sequence sq_blob_key
2 start with 1
3 increment by 1
4 maxvalue 999999
5 nocycle
6 nocache;

順序が作成されました。

BLOBデータを登録する表の定義は以下。
(blob用表領域は他のデーブルデータとは別表領域にしている)

SCOTT> l
1 create table blobtab
2 (
3 blob_id number primary key,
4 blob_type varchar(4),
5 content blob
6 )
7 lob(content) store as
8 (
9 tablespace blobspace
10 nocache logging
11* )
SCOTT> /

表が作成されました。

SCOTT>


● SQL*Loaderの制御ファイルとBLOBとして登録するファイルは同一ディレクトリ上へ配置。

ちなみに、Linux/Unix系OSでは、hostコマンドまたは、! を利用すればSQL*Plusからshellコマンドなとを直接実行できる。
SCOTT>  
SCOTT> !ls | grep -E '¥.(ctl|jpg|zip|png|gif)$'
blobload.ctl
discus.gif
generic_connectivity.zip
image001.png
neontetra.jpg

SCOTT>


● SQL*Loaderの制御ファイルの内容

ポイントは、シーケンスを利用するために、expressionパラメータで sq_blob_key.nextval と設定している点と、ex_fname FILLER以降の定義(赤字部分)。
SCOTT> !cat blobload.ctl
LOAD DATA
INFILE 'blobload.dat'
INTO TABLE blobtab
FIELDS TERMINATED BY ','
(
blob_id expression "sq_blob_key.nextval",
blob_type,
ext_fname FILLER CHAR(80),
content LOBFILE(ext_fname) TERMINATED BY EOF
)


● SQL*Loaderの制御ファイルのINFILEパラメータで指定するデータファイルの内容

この例では同一ディレクトリに配置した gif/zip/png/jpgを登録対象とした。
拡張子、ファイル名の順にカンマ区切りでデータファイルを作成。(awkを使えば簡単ですしね)

SCOTT> !ls | grep -E '¥.(zip|jpg|png|gif)$' | awk '{print substr($1,index($1,".")+1)","$1","}' > blobload.dat
SCOTT> !cat blobload.dat
gif,discus.gif,
zip,generic_connectivity.zip,
png,image001.png,
jpg,neontetra.jpg,

SCOTT>
SCOTT>


● 準備完了!

準備が整った。今回はSQL*Loaderの制御ファイル、データファイル、BLOBとして登録するファイルを同一ディレクトリに配置した。
SCOTT> !ls | grep -E '¥.(ctl|dat|jpg|zip|png|gif)$'
blobload.ctl
blobload.dat
discus.gif
generic_connectivity.zip
image001.png
neontetra.jpg

SCOTT>


● SQL*Loaderの実行

SCOTT> !sqlldr userid=scott/tiger@xtiger control=blobload.ctl log=blobload.log

SQL*Loader: Release 10.1.0.3.0 - Production on 土 9月 22 17:12:16 2007

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

コミット・ポイントに達しました。 - 論理レコード件数4

SCOTT>


● SQL*Loaderのログを確認!

SCOTT> !cat blobload.log

SQL*Loader: Release 10.1.0.3.0 - Production on 土 9月 22 17:12:16 2007

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

制御ファイル: blobload.ctl
データ・ファイルblobload.dat
不良ファイル: blobload.bad
廃棄ファイル: 指定なし

(すべて廃棄できます)

ロード数: ALL
スキップ数: 0
許容エラー数: 50
バインド配列: 64行、最大256000バイト
継続文字: 指定なし
使用パス: 従来型

表BLOBTAB、 ロード済 すべての論理レコードから
この表に対する有効な挿入オプション: INSERT

Column Name Position Len Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
BLOB_ID EXPRESSION
列のSQL文字列 : "sq_blob_key.nextval"
BLOB_TYPE FIRST * , CHARACTER
EXT_FNAME NEXT 80 , CHARACTER
(FILLERフィールド)
CONTENT DERIVED * EOF CHARACTER
動的LOBFILE - ファイル名EXT_FNAME


表BLOBTAB:
4行のロードに成功しました。
0行はデータ・エラーのためロードされませんでした。
0行はWHEN句のエラーのためロードされませんでした。
0行はすべてのフィールドがNULLのためロードされませんでした。

バインド配列に割り当てられた領域: 21760バイト(64行)
読取りバッファのバイト数: 1048576

スキップされた論理レコードの合計: 0
読み込まれた論理レコードの合計: 4
拒否された論理レコードの合計: 0
廃棄された論理レコードの合計: 0

実行開始土 9月 22 17:12:16 2007
実行終了土 9月 22 17:12:17 2007

実行時間: 00: 00: 00.80
CPUタイム : 00: 00: 00.06

SCOTT>


● 内容確認。(登録ファイルのサイズとBLOBサイズが同じであることを確認)

SCOTT> select
2 blob_id,
3 blob_type,
4 lengthb(content)
5 from
6 blobtab
7 order by
8 blob_id;

BLOB_ID BLOB LENGTHB(CONTENT)
---------- ---- ----------------
1 gif 9675
2 zip 20070
3 png 2327573
4 jpg 6492

SCOTT>
SCOTT> !ls -l | grep -E '¥.(jpg|zip|png|gif)$'
-rw-r--r-- 1 oracle oinstall 9675 Dec 31 1997 discus.gif
-rw-r--r-- 1 oracle oinstall 20070 Nov 17 2005 generic_connectivity.zip
-rw-r--r-- 1 oracle oinstall 2327573 Jul 21 16:21 image001.png
-rw-r--r-- 1 oracle oinstall 6492 May 4 1999 neontetra.jpg

SCOTT>

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

2007年8月 4日 (土)

Shutdown Timeout

今回は、Oracle10g R2から実装された停止タイムアウトネタです。よく、shutdown immediateを実行したのに、”すぐにshutdownしない”。なんて話を聞きますが、
当然ですよ、immediateという言葉とは裏腹に、shutdown immediateにより強制的にrollbackされたトランザクションが、大量にundoブロックを保持していたらどうなると思いますか?

トランザクションのロールバックに時間がかかり、shutdown処理が待たされる、という状況が発生します!

これが、shutdown immediateを実行したのに、”すぐには停止しない”理由です。(これ以外の理由で停止しない場合もあるにはあるようだが・・・、大抵の場合はこれが原因。)

Oracle10g R2 より前のリリースでは、shutdown immeidateが終了せず、遠くを見つめて、ただ、ひたすら終了を待ち続けた方は、意外と多いかもしれません。。
しかも、Oracleさん、な〜〜〜んにもメッセージ出してくれないので何を待機しているのか、何をしているのか分かりずらいし。
で、そのガス抜き策? なのか、 Oracle10g R2から、停止タイムアウトという機能が追加されています。
これは、文字通り、shutdownが一定時間内に終了しないと、shutdown自体がキャンセルされてしまうという機能です。
正常に復帰しても、本当に実行したかったのは、shutdownなのですから、それはそれで欲求不満状態ではあるのですが・・・(笑)


SYS> l
1 create smallfile tablespace test datafile E:¥ORACLE¥ORADATA¥CATFISH¥CATFISH¥test.dbf' size 10g
2 autoextend on
3 extent management local uniform size 1m
4* segment space management auto
SYS> /

表領域が作成されました。

SYS>
SYS> create table scott.test (data varchar2(4000)) tablespace test;

表が作成されました。

いうことで、準備完了。(Windows版のOracle Database 10g R2を利用しています。)

次に、以下のように、大量のデータを登録し、1時間以上実行させておく。
(当然、ストレージの性能などにより、どの程度のデータを登録すれば、ロールバックが1時間以上になるのか異なってくることをお忘れなく。今回テストに利用したものは、HDDが2本、OSとは別ドライブのDISKにOracleのバイナリ及びデータファイルを配置。)

では、SCOTTユーザに接続して、大量データを登録!

SCOTT> 
SCOTT> l
1 begin
2 for i in 1..2000000 loop
3 insert into test values(lpad('x',4000,'x'));
4 end loop;
5* end;
SCOTT> /


おまけ。
別途、SQL*Plusを起動し、SYSDBAで接続して、UNDOの量をモニタしているところ。

SYS> r
1 select
2 s.username,
3 t.used_ublk,
4 to_char(systimestamp,'hh24:mi:ss.ff') as time
5 from
6 v$session s join v$transaction t
7* on t.addr = s.taddr

USERNAME USED_UBLK TIME
---------- ---------- ------------------------------------
SCOTT 2618 17:29:43.890000


大量データ登録処理を実行したまま、一時間以上経過したところで、shutdown immediateを実行!!
すると、一時間以上実行していたトランザクションのロールバック処理のため、shutdownが待機させられる。

そう、これが、shutdown immediateで、shutdownしても言葉通り、即刻には停止しない状況の一例なのである。
Oracle10g R2より前のリリースであれば、延々と待たなければならない。それが、2時間や3時間だとキツいですよね。
しかも、shutdownを実行してしまったので、その後は何もできないし。

そこで、Oracle10g R2から実装されたのが、shutdownが自動的にcancelされるという機能。
(便利なだと感じるかどうかは。。。いろいろ・・・)


では、ロールバックに1時間以上かかる状態になったところで、shutdown immeidateを実行!!!

SYS> shutdown immediate;
・・・・・ここでおおよそ1時間ほど待たされます。コーヒーでも飲んで、ゆったりと・・・・お待ちください。

ほぼ1時間経過しても、shutdownが待機させられていると、以下のようなメッセージとともに
SQL*plusへ制御が返されます。

ORA-01013: ユーザーによって現行の操作の取消しがリクエストされました。

SYS>

この時点で、shutdownがキャンセルされ、通常の状態に戻っています。


alert_<SID>.logには以下のように記録されます。
以前のリリースに比べると、shutdownが待機させられているというメッセージや、shutdownがキャンセルされたというメッセージなど、意外と分かり易いメッセージが記録されている事に気付くはずです。ず〜〜〜っと、なんのメッセージもなく待たされるよりはましといったところです。

Tue Jul 31 23:03:16 2007
Shutting down instance: further logons disabled
Tue Jul 31 23:03:24 2007
Stopping background process QMNC
Tue Jul 31 23:03:24 2007
Stopping background process CJQ0
Tue Jul 31 23:03:25 2007
Stopping background process MMNL
Tue Jul 31 23:03:26 2007
Stopping background process MMON
Tue Jul 31 23:03:26 2007v
Thread 1 advanced to log sequence 289
Current log# 1 seq# 289 mem# 0: E:¥ORACLE¥ORADATA¥CATFISH¥CATFISH¥REDO01.LOG
・・・・中略・・・・
Tue Jul 31 23:03:27 2007
Shutting down instance (immediate)
License high water mark = 14
Tue Jul 31 23:03:27 2007
Stopping Job queue slave processes
Tue Jul 31 23:03:27 2007
Job queue slave processes stopped
・・・・中略・・・・
Tue Jul 31 23:08:26 2007
Active call for process 884 user 'SYSTEM' program 'ORACLE.EXE (SHAD)'
SHUTDOWN: waiting for active calls to complete.

Tue Jul 31 23:22:39 2007
MMNL absent for 1203 secs; Foregrounds taking over
・・・・中略・・・・
Wed Aug 01 00:03:26 2007
SHUTDOWN: Active sessions prevent database close operation

まあ、shutdown immediateする場合には事前に、rollbackに時間を要するトランザクションが実行中でないことをよ〜〜〜〜く確認するか、運用ルールで実行しない/できないように制限したりすることが重要だと思いますね。

次回は、ロールバックの終了時刻を大雑把に見積もるファンクションでも作成してみるか・・・

参考:「Oracle Database 管理者ガイド 10g リリース 2(10.2)- 停止タイムアウト」

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

2007年6月 8日 (金)

Mac De Oracle : PL/SQL de Collection #5


Marcus Miller - Silver Rain - It'll Come Back to YouMarcus Miller - Silver Rain - It'll Come Back to You

ちょいと間が空いたが、PL/SQLのコレクションでのお遊び。その5回目。

検索ワードで結構目にするのが、"N次元 結合配列" というキーワード。

ということで、今回は、多次元のコレクションの例を。

N次元のコレクションってどうやって作るの? ってことで情報を検索しているのだと思いますが、しっかりマニュアルにも記載されているので、そちらもしっかり読んでおくことをおすすめしますよ!。

Associative Array(以下、結合配列)、VARRAYやNested Table(以下、ネスト表)どれでも、考え方は同じ。
コレクション自体を別コレクションの要素にすればできるんですよ。 コレクションを入れ子にする と言えばイメージしやすい? ですかね。


以下のコードで赤太字で示しているところが多次元コレクション定義とアクセスのポイント。
まず、empType型を要素とするNestedTableType型(ネスト表)を定義し、次にNestedTalbType型を要素とするStrAssociativeArrayType型(結合配列)を定義している。
以下の例は多少、ひねくれた例? として結合配列とネスト表という異なるコレクションを利用して多次元コレクションを定義している。その影響でコレクションの操作は多少面倒になるのだが..

尚、empType型は、事前に作成しておいたオブジェクト型。

create or replace
PROCEDURE multiLevelCollections
AS
TYPE NestedTableType IS TABLE OF empType;
TYPE StrAssociativeArrayType IS TABLE OF NestedTableType INDEX BY VARCHAR2(50);

myNestedTable NestedTableType := NestedTableType();
myStrAssociativeArray StrAssociativeArrayType;


claerMyStrAssociateArray StrAssociativeArrayType;

myEmp empType;
j dept.dname%TYPE;
vDeptName dept.dname%TYPE := NULL;

CURSOR csrEmp IS
SELECT
emp.job,
emp.deptno,
dept.dname,
emp.empno,
emp.ename,
emp.sal,
emp.hiredate
FROM
emp JOIN dept
ON emp.deptno = dept.deptno
ORDER BY
emp.deptno,
emp.ename;

PROCEDURE printArray
IS
BEGIN
DBMS_OUTPUT.NEW_LINE;
DBMS_OUTPUT.PUT_LINE('**** コレクションに要素が存在している状態 ****');
DBMS_OUTPUT.PUT_LINE(
'myStrAssociativeArray('
|| myStrAssociativeArray.COUNT
|| ')'
);

j := myStrAssociativeArray.FIRST;
WHILE j IS NOT NULL LOOP
DBMS_OUTPUT.NEW_LINE;
DBMS_OUTPUT.PUT_LINE(
'myStrAssociativeArray('
|| j || ')(' || myStrAssociativeArray(j).COUNT || ')'
);

FOR k IN
myStrAssociativeArray(j).FIRST..myStrAssociativeArray(j).LAST
LOOP
DBMS_OUTPUT.PUT_LINE(
'myStrAssociativeArray(' || j || ').'
|| 'myNestedTable(' || TO_CHAR(k) || ') = '
|| myStrAssociativeArray(j)(k).TO_STRING()
);
END LOOP;
j := myStrAssociativeArray.NEXT(j);
END LOOP;
END;

BEGIN
FOR emp_rec IN csrEmp LOOP
IF csrEmp%ROWCOUNT = 1 THEN
vDeptName := emp_rec.dname;
END IF;

myEmp := empType (
emp_rec.empno,
emp_rec.ename,
emp_rec.job,
emp_rec.hiredate,
emp_rec.sal,
emp_rec.deptno
);

IF vDeptName <> emp_rec.dname THEN
myStrAssociativeArray(vDeptName) := myNestedTable;
vDeptName := emp_rec.dname;
myNestedTable := NestedTableType();
END IF;

myNestedTable.EXTEND(1);
myNestedTable(myNestedTable.COUNT) := myEmp;
END LOOP;

IF myNestedTable.COUNT > 0 THEN
myStrAssociativeArray(vDeptName) := myNestedTable;
END IF;

printArray();

-- 結合配列を空にする!
myStrAssociativeArray := claerMyStrAssociateArray;

DBMS_OUTPUT.NEW_LINE;
DBMS_OUTPUT.PUT_LINE('**** コレクションが空の状態 ****');
DBMS_OUTPUT.PUT_LINE(
'myStrAssociativeArray('
|| myStrAssociativeArray.COUNT
|| ')'
);


END;
/

SCOTT> l
1 select
2 emp.deptno,
3 dept.dname,
4 emp.empno,
5 emp.ename,
6 emp.sal,
7 emp.hiredate
8 from
9 emp join dept
10 on emp.deptno = dept.deptno
11 order by
12 emp.deptno,
13* emp.ename
SCOTT> /

DEPTNO DNAME EMPNO ENAME SAL HIREDATE
---------- -------------- ---------- ---------- ---------- --------
10 ACCOUNTING 7782 CLARK 2450 81-06-09
10 ACCOUNTING 7839 KING 5000 81-11-17
20 RESEARCH 7876 ADAMS 1100 87-05-23
20 RESEARCH 7566 JONES 2975 81-04-02
20 RESEARCH 7788 SCOTT 3000 87-04-19
20 RESEARCH 7369 SMITH 800 80-12-17
30 SALES 7499 ALLEN 1600 81-02-20
30 SALES 7698 BLAKE 2850 81-05-01
30 SALES 7900 JAMES 950 81-12-03
30 SALES 7654 MARTIN 1250 81-09-28
30 SALES 7844 TURNER 1500 81-09-08
30 SALES 7521 WARD 1250 81-02-22

12行が選択されました。

SCOTT>

実行結果は次のようになる。(Oracle SQL Developer 1.1 for MacOSX) 
1.2がリリースされたようなので後でダウンロードしとくか・・> TODO

Oracleplsqldev11

Mlevelcollresults


ということで、今日はここまで。

Have a good Week end!

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

2007年5月29日 (火)

Mac De Oracle : PL/SQL de Collection #4

さて、PL/SQLのコレクションでのお遊び。その4回目。

今回は、既に要素を持っているコレクションを空にしてみましょう。

第二回目にも似たようなことをやっているので、VarrayとNested Tableについては想像できると思いますが、Associative Arrayにいてはどうすればよいでしょう?

ということで、答えは以下のコードを読めば分かりますよ!

create or replace
PROCEDURE COLLECTIONS AS
TYPE VarrayType IS VARRAY(100) OF empType;
TYPE NestedTableType IS TABLE OF empType;
TYPE StrAssociativeArrayType IS TABLE OF empType INDEX BY VARCHAR2(50);
TYPE NumAssociativeArrayType IS TABLE OF empType INDEX BY BINARY_INTEGER;

myVarray VarrayType := VarrayType();
myNestedTable NestedTableType := NestedTableType();
myStrAssociativeArray StrAssociativeArrayType;
myNumAssociativeArray NumAssociativeArrayType;

claerMyStrAssociateArray StrAssociativeArrayType;
clearMyNumAssociateArray NumAssociativeArrayType;

myEmp empType;

CURSOR csrEmp IS
SELECT
job,
empno,
ename,
hiredate,
sal,
deptno
FROM
emp
ORDER BY
empno;

PROCEDURE printCount
IS
BEGIN
DBMS_OUTPUT.PUT_LINE(
'Varray : '
|| myVarray.COUNT
|| ' 件の要素が存在します。'
);
DBMS_OUTPUT.PUT_LINE(
'Nested Table : '
|| myNestedTable.COUNT
|| ' 件の要素が存在します。'
);
DBMS_OUTPUT.PUT_LINE(
'Associative Array(String) :'
|| myStrAssociativeArray.COUNT
|| ' 件の要素が存在します。'
);
DBMS_OUTPUT.PUT_LINE(
'Associative Array(Number) :'
|| myNumAssociativeArray.COUNT
|| ' 件の要素が存在します。'
);
END;

BEGIN
FOR emp_rec IN csrEmp LOOP
myEmp := empType (
emp_rec.empno,
emp_rec.ename,
emp_rec.job,
emp_rec.hiredate,
emp_rec.sal,
emp_rec.deptno
);
myVarray.EXTEND(1);
myVarray(myVarray.COUNT) := myEmp;
myNestedTable.EXTEND(1);
myNestedTable(myNestedTable.COUNT) := myEmp;
myStrAssociativeArray(TO_CHAR(myEmp.empno) || ':' || myEmp.ename) := myEmp;
myNumAssociativeArray(myEmp.empno) := myEmp;
END LOOP;


DBMS_OUTPUT.PUT_LINE('**** コレクションに要素が存在している状態 ****');
printCount;


myVarray := VarrayType();
myNestedTable := NestedTableType();
myStrAssociativeArray := claerMyStrAssociateArray;
myNumAssociativeArray := clearMyNumAssociateArray;

DBMS_OUTPUT.NEW_LINE;
DBMS_OUTPUT.PUT_LINE('**** コレクションが空の状態 ****');
printCount;


END;
/


上記のコードの通り、Assciative Array(結合配列)を空にする方法は、同じ型の”空”結合配列をセットしてやればいいわけです。
今回の例では1次元の結合配列ですが、N次元の結合配列でも考え方は同じです。(VarrayやNested Tableとは異なります。)
ちなみに、第二回目にも書きましたが、VarrayやNexted Tableは、NULLにすることができます。その場合、VarrayやNexted Tableは、atomic nullであるためコンストラクタによる初期化が行われるまで一切の操作は行えないということもお忘れなく。

最後に、上記プロシージャの実行結果。

SCOTT> set serveroutput on size 10000 format wrapped
SCOTT> exec collections;
**** コレクションに要素が存在している状態 ****
Varray : 29 件の要素が存在します。
Nested Table : 29 件の要素が存在します。
Associative Array(String) :29 件の要素が存在します。
Associative Array(Number) :29 件の要素が存在します。

**** コレクションが空の状態 ****
Varray : 0 件の要素が存在します。
Nested Table : 0 件の要素が存在します。
Associative Array(String) :0 件の要素が存在します。
Associative Array(Number) :0 件の要素が存在します。

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

SCOTT>

Collection4

今日はこのへんで。

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

2007年5月17日 (木)

Mac De Oracle : Oracleのバージョン確認(FAQ) #9

OCFS2 のバージョン確認方法は?

10万円 de RAC #22の最後にも記載してありますが、ググれば沢山ヒットすると思いますよ。   


Googleで検索する例も載せておきましょう!

how to determine ocfs2 version で検索すれば英語のページは沢山ヒットする。
ocfs2のバージョン確認 と入力して検索すれば、私のBlogも含んだ検索結果が返ってきますよ。

以下のスクリーンショットは、MacOSXのTerminalからCentOSへssh接続したもの
Mac_linux_ssh


[root@discus1 ˜]# cat /proc/fs/ocfs2/version
OCFS2 1.2.3 Thu Aug 10 18:16:03 PDT 2006 (build 6b798aaadf626d3b137c3952809b2f38)
[root@discus1 ˜]#

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

2007年5月16日 (水)

Mac De Oracle : Oracleのバージョン確認(FAQ) #8

Oracle JDBC Driverのバージョンは確認方法は?

マニュアルにしっかり載ってます。 
今回は、先日公開された、Oracle JDeveloper11g Technology Previewで試してみた。

ちなみに、接続先は、Oracle10g R2 EE 10.2.0.2.0
Jdev11g_jdbc11

よく見えないかもしれないので、ログペインを拡大したスクリーンショットも載せておく。
Jdbcversionresult

Oracle JDeveloper11g Technology Previewでは、Oracle JDBC Driver 11.1.0.0.0-Alpha が使われているんですね!。

Determining the Version of the JDBC Driverを見れば分かるし、マニュアルからコピペすればよいので、書くまでもないのだが。。。。。。。

読んでないのか!?、見つけられないのか?  よく聞かれるのでコードも載せておく。

package jp.macdeoracle.discus;

import oracle.jdbc.pool.OracleDataSource;
import java.sql.DatabaseMetaData;
import java.sql.Connection;
import java.sql.SQLException;

public class JdbcVersion
{
public static void main(String[] args)
{
OracleDataSource ods = null;
Connection conn = null;
try {
ods = new OracleDataSource();
ods.setURL("jdbc:oracle:thin:scott/tiger@192.168.1.2:1521:catfish");
conn = ods.getConnection();
DatabaseMetaData meta = conn.getMetaData();
System.out.println(meta.getDriverName() + "," + meta.getDriverVersion());
}
catch (SQLException se) {
System.out.println(se.getSQLState());
System.out.println(se.getErrorCode());
}
finally
{
try {
if (ods != null && conn != null && !conn.isClosed()) {
conn.close();
ods.close();
}
}
catch (SQLException se){
se.printStackTrace();
}
}
}
}

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

2007年5月14日 (月)

Mac De Oracle : Oracleのバージョン確認(FAQ) #7

Oracle Enterprise Manager 10g Database Controlのバージョンは以下のようにしても確認できる。ついでに、URLの確認にもなるから便利。

ちなみに、EM10g R1 と R2では、Port番号が異なっているので要注意。

G5Server:˜ oracle$ emctl status dbconsole
Oracle Enterprise Manager 10g Database Control Release 10.1.0.3.0
Copyright (c) 1996, 2004 Oracle Corporation. All rights reserved.
http://192.168.1.19:5500/em/console/aboutApplication
Oracle Enterprise Manager 10g is not running.
G5Server:˜ oracle$

[oracle@discus1 ˜]$ emctl status dbconsole
TZ set to Japan
Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0
Copyright (c) 1996, 2005 Oracle Corporation. All rights reserved.
http://192.168.1.100:1158/em/console/aboutApplication
Oracle Enterprise Manager 10g is not running.
[oracle@discus1 ˜]$

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

2007年4月27日 (金)

Mac De Oracle : Oracleのバージョン確認(FAQ) #6

リスナーのバージョン確認方法は?

注意)この方法でバージョンを確認するには、リスナーが起動している必要があります。

[oracle@discus1 ˜]$ lsnrctl version

LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 26-4月 -2007 22:44:06

Copyright (c) 1991, 2005, Oracle. All rights reserved.

(ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))に接続中
TNSLSNR for Linux: Version 10.2.0.1.0 - Production
TNS for Linux: Version 10.2.0.1.0 - Production
Unix Domain Socket IPC NT Protocol Adaptor for Linux: Version 10.2.0.1.0 - Production
Oracle Bequeath NT Protocol Adapter for Linux: Version 10.2.0.1.0 - Production
TCP/IP NT Protocol Adapter for Linux: Version 10.2.0.1.0 - Production,,
コマンドは正常に終了しました。
[oracle@discus1 ˜]$

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

2007年4月26日 (木)

Mac De Oracle : Ask Discus : 問い合わせた結果、ある列(文字列)の右端2文字でソートするには?

Ask Tomのパクリ! なんてことはやりませんが、ウチの奥さんからヘルプメールが来たので。

今、Oracle10g R2 + Seaser2 + Hibernate だっけ? を使ったプロジェクトで奮闘しているウチの奥さんから SQL文に関するヘルプメールが来たので、 Ask Discus という Ask Tomのパクリ風? ヘルプを一つ。 
FAQだと思うのでFAQカテゴリにしておきます。


You Asked...
ウチの奥さんからのヘルプ内容:

問い合わせた結果をソートする必要がある。
そして、ソート条件は、varchar2型として定義されている列で、右端から2文字で昇順にソートする。
この場合、order by句はどのように書けばいいの?  
おしえて Discus! (ダーリン!。。。かも。。。笑い)


という質問。

and I said...

簡単なんだけど。。(知らない人には簡単では無いかも。。。。)

order by句でもスカラ関数が利用できるので、 substr()を利用して可変長文字列の右端2文字を取り出せば OK.

では、お約束のscottユーザに接続し、emp表の ename列の右端2文字で昇順にソートしてみよう!

length()を利用しなくても substr()の第二引数に負の値を指定すれば簡単にできるということを忘れていた!!
こちらの方がスマートです。コメントくださった方に感謝します。

SCOTT> l
1 select
2 emp.*,
3 substr(ename,-2) as right2chars
4 from
5 emp
6 where
7 empno < 8000
8 order by
9* substr(ename,-2)
SCOTT> /

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO RIGHT2CHARS
---------- ---------- --------- ---------- -------- ---------- ---------- ---------- ----------
7905 JEAN 7904 AN
7901 SADE 7876 DE
7499 ALLEN SALESMAN 7698 81-02-20 1600 300 30 EN
7844 TURNER SALESMAN 7698 81-09-08 1500 0 30 ER
7934 MILLER CLERK 7782 82-01-23 1300 10 ER
7566 JONES MANAGER 7839 81-04-02 2975 20 ES
7900 JAMES CLERK 7698 81-12-03 950 30 ES
7903 ALEX 7901 EX
7654 MARTIN SALESMAN 7698 81-09-28 1250 1400 30 IN
7698 BLAKE MANAGER 7839 81-05-01 2850 30 KE
7876 ADAMS CLERK 7788 87-05-23 1100 20 MS
7839 KING PRESIDENT 81-11-17 5000 10 NG
7521 WARD SALESMAN 7698 81-02-22 1250 500 30 RD
7902 FORD ANALYST 7566 81-12-03 3000 20 RD
7782 CLARK MANAGER 7839 81-06-09 2450 10 RK
7369 SMITH CLERK 7902 80-12-17 800 20 TH
7788 SCOTT ANALYST 7566 87-04-19 3000 20 TT
7904 DISCUS 7903 US
7907 Wendy 7906 dy
7906 Duke 7905 ke

20行が選択されました。

この方法でもできるんだが、length()関数を使わないので上記の方法がいいですね。

SCOTT> l
1 select
2 emp.*,
3 substr(ename,length(ename)-1,2) as right2chars
4 from
5 emp
6 order by
7* substr(ename,length(ename)-1,2)
SCOTT> /


ちなみに、NLSSORTを利用すれば、言語ソートも可能。 
length()関数を利用しないよう修正。

SCOTT> select 
2 emp.*,
3 substr(ename,-2) as right2chars
4 from
5 emp
6 where
7 empno between 8000 and 8010
8 order by
9 substr(ename,-2)
10 /

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO RIGH
---------- ---------- --------- ---------- -------- ---------- ---------- ---------- ----
8002 かきくあい あい
8001 おえういあ いあ
8000 あいうえお えお
8008 カキクアイ アイ
8007 オエウイア イア
8006 アイウエオ エオ
8004 カキクアイ アイ
8005 オエウイア イア
8003 アイウエオ エオ

9行が選択されました。

SCOTT> l
1 select
2 emp.*,
3 substr(ename,-2) as right2chars
4 from
5 emp
6 where
7 empno between 8000 and 8010
8 order by
9 nlssort(
10 substr(ename,-2),
11 'NLS_SORT=JAPANESE_M'
12* )
SCOTT> /

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO RIGH
---------- ---------- --------- ---------- -------- ---------- ---------- ---------- ----
8002 かきくあい あい
8008 カキクアイ アイ
8004 カキクアイ アイ
8001 おえういあ いあ
8007 オエウイア イア
8005 オエウイア イア
8000 あいうえお えお
8006 アイウエオ エオ
8003 アイウエオ エオ

9行が選択されました。


NLSSORT()関数や言語ソートの詳細はマニュアルを参照していろいろと試してみてくださいね。。
Oracle Database グローバリゼーション・サポート・ガイド 10g リリース2(10.2) 言語ソート
Oracle Database グローバリゼーション・サポート・ガイド 10g リリース2(10.2) 言語ソートパラメータ
Oracle Database グローバリゼーション・サポート・ガイド 10g リリース2(10.2)言語ソートの使用
Oracle Database グローバリゼーション・サポート・ガイド 10g リリース2(10.2) NLSSORT関数

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

2007年4月25日 (水)

Mac De Oracle : Oracleのバージョン確認(FAQ) #5

APEXのバージョンを確認するには?

以下は、APEX3.0でのバージョン確認方法だが、APEX2.2の場合には、flows_020200.wwv_flows_release()ファンクションを実行する必要がある。この方法はバージョン毎にスキーマ異なるので少々面倒だ。(APEX上で表示するのならば話は別だが。。)

SYS> select flows_030000.wwv_flows_release from dual;

WWV_FLOWS_RELEASE
--------------------------------------------------------
3.0.0.00.20

SYS>

そこで、スキーマに関係なく確認する方法として、以前にも紹介した、DBA_REGISTRYビューを問い合わせる方法がある。

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

2007年4月24日 (火)

Mac De Oracle : Oracleのバージョン確認(FAQ) #4

Oracle WebTool kitのバージョンを確認するには?

OWA_UTILパッケージの get_version関数を使う!


ちなみに、SQL*Plusから接続するユーザは、SYSユーザである必要はないが、Web toolkit関連パッケージの実行を制限している場合には権限が付与されているユーザで接続すれはOK。


OWA_UTILパッケージにアクセスできるか簡単に確認するには、

SQL> desc owa_util

としてパッケージに定義されているプロシージャやファンクションの一覧がでてくれば実行可能だ。


SYS> select owa_util.get_version from dual;

GET_VERSION
--------------------------------------------------------------------------------
10.1.2.0.6

SYS>

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

2007年4月23日 (月)

Mac De Oracle : Oracleのバージョン確認(FAQ) #3

Oracleデータベースにロードされている各コンポーネントのバージョンを知りたいときは、dba_registryビューを問い合わせる。

マニュアル「Oracle® Database Reference 10g Release 2 (10.2)」 
普段参照することはなくても、こんなビューがあるということを思えておくだけでも、いざという時には役に立つんじゃないかなぁ。

SYS> select comp_name,version,status from dba_registry;

COMP_NAME VERSION STATUS
---------------------------------------- ------------------------------ -----------
Oracle Application Express 3.0.0.00.20 VALID
Oracle Ultra Search 10.1.0.3.0 VALID
Oracle Enterprise Manager 10.1.0.3.0 VALID
Oracle XML Database 10.1.0.3.0 VALID
OLAP Catalog 10.1.0.3.0 VALID
Oracle Text 10.1.0.3.0 INVALID
Spatial 10.1.0.3.0 VALID
Oracle interMedia 10.1.0.3.0 VALID
Oracle Expression Filter 10.1.0.3.0 VALID
Oracle Workspace Manager 10.1.0.2.0 VALID
Oracle Data Mining 10.1.0.3.0 VALID
Oracle Database Catalog Views 10.1.0.3.0 VALID
Oracle Database Packages and Types 10.1.0.3.0 INVALID
JServer JAVA Virtual Machine 10.1.0.3.0 VALID
Oracle XDK 10.1.0.3.0 VALID
Oracle Database Java Packages 10.1.0.3.0 VALID
OLAP Analytic Workspace 10.1.0.3.0 VALID
Oracle OLAP API 10.1.0.3.0 VALID

18行が選択されました。

SYS>

注意)この静的ディクショナリービューは、Oracle9i R2以降で利用可能。

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

Mac De Oracle : Oracleのバージョン確認(FAQ) #2

Oracleのバージョン確認 その2は、SQL*Plusのバージョン確認

特に解説することも無いが、SQL*Plusのバージョンを確認は以下の方法もある。
(たまに、Oracle Universal Installerを起動して確認している方もいるが、以下の方法で確認するほうが簡単。)

discus1:˜ oracle$ sqlplus -version

SQL*Plus: Release 10.2.0.2.0 - Production

discus1:&tilde oracle$

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

2007年4月21日 (土)

Mac De Oracle : Oracleのバージョン確認(FAQ) #1

検索ワードを見ていると、ORA-20000から ORA-20999までのエラーコードに次いで、バージョン確認というキーワードが目立つ。。。。。

基本はマニュアルを見ることですよ!

該当部分を発見しにくいマニュアルにも原因はあるかもしれないけど。。。(^^;;;;;

では、よく言聞かれるであろう、Oracle のバージョンや、Oracle のエディションの確認方法。

サポートに確認する場合、その他いろいろなフォーラムでオラクルに関する質問する際、バージョンやエティション、それにプラットフォームやそのバージョンを提示するのは当たり前のことなのだが、、、

最近、そのような基本的な事を提示しない方も多いなぁ、と感じる場面も少なくない。
しかも、検索ワードで、"Oracle Version確認" の検索数が目立つ状況だと、Blogのネタとしては面白くないのだが、確認方法を載せたほうがよいだろうと思い、FAQとして載せておく事にした。
(バージョンやエディションを提示するということ以前に、バージョンの確認方法を知らないという可能性もあるので。。。)

以下は、MacOSX Server版 Oracle10g R1 EEの例

v$version動的パフォーマンスビューを問い合わせれば確認することができる。
但し、Oracle9i 以降では、v$系のビューはselect any dictionaryシステム権限が無いと参照できないため、sysユーザか、systemユーザ、又は前述の権限を付与されたユーザで確認する。
SYS> conn / as sysdba
接続されました。
SYS>
SYS> 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 MacOS X Server: Version 10.1.0.3.0 - Production
NLSRTL Version 10.1.0.3.0 - Production

SYS>

v$version動的パフォーマンスビューを問い合わせれば、 Oracle のバージョン と エディション以外に、SQL*net や PL/SQLのバージョンも確認することができる。

尚、v$パフォーマンスビューや その他のビューからは有益な情報を問い合わせることが可能なので、暇のある時にでも眺めてみるだけでも見てみるといいだろう。 
「きっと、後々役に立つと思うよ。 あ、そういえば、あんなのがあったなぁ。とか。。。ね。」
Oracle Database リファレンス (10.2)

また、次のような確認方法もある。(但し、SQL*Plusがインストールされているという前提である。)

以下の例は、Oracle9i R2 9.2.0.1.0 のOracle Clientから、Oracle10g R2 10.2.0.2.0 EE へ接続した際のログであるが、接続後のバナーと、 exitコマンド入力後のバナーに、接続先データベースのバージョンとエディションが表示されるので、v$version動的パフォーマンスビューを問い合わせる権限の無いユーザで接続している場合でも、Oracleのversionとeditionを容易に確認することができる。 知っていて損はないだろう。
discus1:˜ oracle$ sqlplus scott@catfish

SQL*Plus: Release 9.2.0.1.0 - Production on 土 4月 21 12:49:12 2007

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

パスワードを入力してください:

Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options
に接続されました。
SQL> exit
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
With the Partitioning, OLAP and Data Mining optionsとの接続が切断されました。
discus1:˜ oracle$

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

2007年4月 9日 (月)

ORA-20001

マニュアルにもしっかり記載されているが、意外に多いなぁと感じた検索ワードの ”ORA-20001”を取り上げておこうと思います。

ORA-20001 を エラーメッセージマニュアルで確認してみると、

ORA-20000: %s
原因:
このメッセージが発生する原因となったストアド・プロシージャraise_application_errorが呼び出されました。
処置:
エラー・メッセージの記述どおりに問題を修正するか、詳細をアプリケーション管理者またはDBAに問い合せてください。

と、少々、不親切な書き方になっています。

上記、エラーメッセージの解説からは、ORA-20001が、ORA-20000と同じ、ユーザ定義エラーとして予約されているエラーコードであるとは読み取れません。
(Oracleさん、もうちょっとだけ、親切なドキュメントに修正してくれるとありがたいのですが・・・・・)


PL/SQLに慣れた方なら、最初に、冒頭でリンクしているこのマニュアルを見る確立は高いでしょうが、そうで無い方は、ORA-20001というエラーコードを見て、最初に参照するマニュアルはエラーメッセージマニュアルであることの方が多いはず!。 

で、「マニュアルに記載されていない!」 ということになり、ハマるわけです。。。。ね。

前置きはこれくらいにして、本題。

Oracle Database PL/SQLユーザーズ・ガイドおよびリファレンス 10g リリース2(10.2)に書かれているように、ORA-20000からORA-20999は、ユーザが自由にメッセージを割り当てる事ができるように予約されているエラーコードだ。

つまり、ORA-20000 というエラーコードには、Oracle側では対応するエラーメッセージが割り当てられていない。
ユーザが自由にエラーメッセージを割当て意味を持たせることができるエラーコードなんですよ。

たとえば、プロシージャAでは、ORA-20000は、「URLが指定されていません。」というエラーメッセージを割り当てたり、ファンクションBでは、ORA-20001には「指定された予約がありません。」というメッセージを割り当てることができるわけです。


尚、ORA-20000からORA-20999までのエラーコードはユーザが自由に設定できるエラーコードであるため、ほとんどの場合、プロジェクト毎に標準化されることが多いと思います。理由は、ORA-20000からORA-20999のエラーコードに対して一意にエラーメッセージを割り当て、1つのエラーコードが複数の意味を持たないようにするためです。
私が関わったプロジェクトでは、台帳で一元管理し、リリース後は該当システム独自のエラーメッセージマニュアルとしても利用させました。

サンプルコードは、Oracle Database PL/SQLユーザーズ・ガイドおよびリファレンス 10g リリース2(10.2)にもあるのでそちらも参照してください。

以下、簡単なサンプル。。。と行きたいところだがここまで。
(後日、このエントリを更新してサンプルを載せるかも。。。マニュアルに記載されているから追記しないかも。。。。気分次第です。)

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

2006年10月15日 (日)

アクセスログを見ていて #3 - 全角半角入り乱れ

ココログのアクセスログには、サーチエンジンで検索された検索ワード/フレーズが記録されている。
その検索ワード/フレーズを見ていると、英数字及び半角カナの全角半角入り乱れが目につくことも少なくない。

その中から、半角/全角が ”細かく”切り替えられているものをビックアップし、入力の器用度等も含め、10点満点で評価してみた。(笑)


ブラウザや、ご使用のフォントによっては全角/半角の区別しずらい状況があるかもしれないので、半角文字は、”赤”にしてあります。



この検索ワードでは、 PLとSQLが全角英字で、なぜか、"/"が半角。DIRECTORYは半角英字。、なかなか半角/全角英数字の切り替えが器用ですね。8点
一文字単位で切り替えてくれたら、10点だった。(笑)
作成 DIRECTRY PL/SQL



半角英字から全角英数字、そして又、半角英字。3点。
ORACLE10g USER_TAB_COLUMNS



"型"の勢いで、全角英字、途中からなぜか、半角英字。3点。
型 datetime オラクル



途中から全角文字。1点。
oraー12560 



そして、全角カナから、半角カナになり、また全角。 ネット上で半角カナを使うという”勇気”ある行動 (笑) だね。 10点。
oracle ストアド char型パラメータバイト上限



これも、半角英数字->半角カナ、途中から全角カナ。前の検索ワードに比べるとパターンが単純なので、9点。
Oracle10g データベース リスナー 停止

ところで、MacOSX で、"ことえり"や"ATOK for MacOSX"を利用している場合、デフォルトでは、半角カナは入力できない。(入力できるように設定することも可能だが使うこともないので入力できるようにしたことはないが。。)

Img2 Img3

ちなみに、アクセスログを見てみると、意外に半角カナを検索文字列として入力しているものが多いのだが、100% Windowsユーザであった。(Mac De Oracleのアクセスログより)ついでなので調べてみたのだが、Windowsでは、半角カナの入力制限及び、半角カナへの変換を制限する設定は無いようですね、今でも。

最後に、
レガシーなシステムやラインプリンタだと、半角カナが無くちゃ困るなんてところもまだ残っているかもしれませんが、ネット上では困った問題を起こす事はあっても、半角カナが無くて困ることは無いだろうと思う。したがって、MacOSXの半角カナ入力制限がデフォルト設定となっていることに対しては大賛成なのである。Windowsもそうなってほしいものだ。

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

2006年3月30日 (木)

"日本語" de ストアド

少なくなったとはいえ、今でも、日本語(マルチバイト文字でと言ったほうがいいかもしれない)で表名や列名などを定義したがる方達がいるのですよ。
Oracleでは、""(引用識別子)で囲めば正式にサポートされているわけですから、”利用できるか” といえば、「はい」というのは正しい答えであるわけです。

日本語を用いる理由としては、日本人なら直感的に理解し易い、論理名と同じで理解し易いからだとか。(それ以外の理由を聞いたことがない。。)
本当にそうでしょうか? 日本語で書こうが、英語で書こうが、意味が分かりづらい名称を付けてしまえば同じ事だと思うのですが。。。

マルチバイトで表名や列名を定義した場合の利点と欠点を比べた場合、欠点のほうが多いという事実があるにも関わらず、頑にマルチバイトのオブジェクト名に固執する方には出会ったことはないですが、既存システムで、数百もある表名と列名全てがマルチバイトで定義されているというシステムに不運にも遭遇したことはあります。

その事実を知らされたとき、「そこまで、日本語を使いたいんだったら、スドアドプロシージャ名も日本語で書けや〜〜〜っ!」、と怒鳴りたい気持ちと、暗い穴の中に落ちていく感覚が・・・・・「あ〜〜〜〜〜〜〜っ!」。 orz。
さらに、部屋の反対側で、ソースコードを編集している姿が目に映る。DISPLAYを遠くから眺めると、DISPLAYには以下のような模様が(間違いなくプログラムだと思うが模様に見えた)・・・・・・。そして、その模様はWINDOWをかなりスクロールしても終わらないようだった・・・・・・・模様としては美しいかな。(かなり引きつりならが、苦笑い。)

**********************
*********************
********************
********************
*******************
*******************
******************
*******************
********************
*******************
******************
*******************
*******************
********************
********************
*********************
**********************
**********************
*********************
********************
********************
*******************
*******************
******************
*******************
********************
*******************
******************
*******************
*******************
********************
********************
*********************
**********************

という思い出話とともに、”日本語" de スドアド をやってみましょう。
こんなことやらないとは思いますが、良い子の皆さんは、危険ですので、絶対にやらないでくださいね。念のため。(笑)
> conn / as sysdba
接続されました。

SYS> create user pleco identified by zebra
2 default tablespace users
3 temporary tablespace temp
4 quota unlimited on users;

ユーザーが作成されました。

SYS> grant connect,create procedure to pleco;

権限付与が成功しました。

SYS> conn pleco
パスワードを入力してください:
接続されました。
PLECO>

PLECO> CREATE OR REPLACE FUNCTION "おりゃ"
2 RETURN VARCHAR2 AS
3 BEGIN
4 RETURN 'マルチバイトのプロシージャ名';
5 END;
6 /

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

PLECO>
PLECO> col "おりゃ" for a40
PLECO> select "おりゃ"() as "おりゃ" from dual;

おりゃ
----------------------------------------
マルチバイトのプロシージャ名

PLECO>
PLECO> CREATE OR REPLACE PROCEDURE "おりゃおりゃ"
2 AS
3 BEGIN
4 DBMS_OUTPUT.PUT_LINE('マルチバイトのプロシージャ名');
5 END;
6 /

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

PLECO> set serveroutput on
PLECO> execute "おりゃおりゃ";
マルチバイトのプロシージャ名

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

PLECO>

さらに、Oracle SQL Developer 1.0 for MacOSXでもやってみた。そこまでしなくても・・・・。
(Oracle SQL Developer 1.0 for MacOSXで、どこまで出来るのか試したかったというのが本音だったりして。。)

ところで、Oracle SQL Developer 1.0 for MacOSX では、スプラッシュを表示する設定になっていてもスプラッシュがでません。(Windowsや、Linuxでもそうなんだろうか? --> 自分で試せば早いのだが。。)








それにしても、ココログの管理画面が重たい。。バージョンアップの影響とのことだが。。これまたクレーム処理が大変だろうなぁ。大きなトラブルのあとだけに。。。

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