« 2007年6月 | トップページ | 2007年8月 »

2007年7月30日 (月)

Mash up Caravan in Tokyo

『Mash up Caravan in 東京』に行ってきた。
今回、Mash up award 3rdに参加するとか決めているわけではないのだが、なんとなく気になったので、ウチの奥さん共々、Sun Microsystemsさんの神宮前オフィスへ。(神宮前にもオフィスあったんですね。。知らなかった。。)

APIを提供される企業より各APIの特徴などが紹介された。
http://www.tkrb.jp/
http://gainer.cc/
http://lab.nissan-carwings.com/CWC/
http://apiblog.kakaku.com/
http://labs.ecnavi.jp/developer/buzzurl/api/
http://blog.ajiyoshi.org/
http://www.mashupedia.jp/

私が面白そうだと感じたのは、http://www.placeengine.com/ですね。MacOSX向けのクライアントもあるようなのでね。
話が脱線しますが、最近、プレゼンでMacを利用する方多いですね。:-)

以下、配られたノベルティと共に、さりげなく? (笑)
Mash up Award 3rdのハガキ大のパンフレット(8枚)が。。。。はい、友人にも配っておきますよ。
Cimg5612

そして、最後に、抽選で、ノベルティが!!!!。。。と、、いつものように、くじ運は悪い・・・・。

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

iPhone ☆〜

http://oracleappslab.com/2007/07/27/my-iphone-review/
あ〜〜、どうでもいいけど、やはく、日本でも使えるようにしてほしいなぁ〜。

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

2007年7月26日 (木)

Oracle ACE directory

Oracle Application Expressで構築された、Oracle ACE Directoryが公開されているようですね。
私も、Oracle ACEの方のBlogなどかなり参考にさせて頂いている。内容が濃いものからゆるい話題まで、感謝もしているし、楽しい内容なのですが、1つだけ残念なことがある。

それは、日本人が佐藤直樹さん一人だけなこと。
本国のOracle社員の方はかなりの数登録されているようだけど、日本人が少ないのはなんとなく寂しいですね。とOracle ACE directoryを見ていて感じたので、つぶやいてみました。 (^^;;;;

http://krisrice.blogspot.com/
http://ivan.kartik.sk/
http://blogs.oracle.com/otn/2007/07/23

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

2007年7月22日 (日)

Cola + iTunes : 当選!

いや〜。くじ運が悪い私でも、当たるもんです。 

今日、スーパーで108円で買ったColaで、見事当選! しかも1回目で!

Cola_itunes_gotit

Cola_itunes_1credit

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

Glossitope

前回のエントリの勢いで、GlossitopeをPowerMac G5 Dual 2.7GhzのMacOSX 10.4.10にインストールしてみた。

Konfabulator(現Yahoo Widgets)から始まったWidgetsブーム?!ですが、Javaでもってとこですかね。

次回は、Dashboard de AquariumをWidgetコンテナへも移植してみますかね。。な〜〜んて。
(まあ、気まぐれですから、どうするかは気分しだいですけど。)

前置きはこれくらいにして、早速インストール。

● まず、Java SE 6.0 R1 Developer Previewをインストール


Glossitope0

Java SE 6.0 R1 Developer Previewは、Java SE 5.0を置き換えたりしないのでご安心を。
Glossitope1

● Glossitopeをダウンロード

今回は、Exterm versionをダウンロードしてみた。
Glossitope_buffered.jnlp がダウンロードされる

Glossitope2

● ダウンロードした Glossitope_buffered.jnlpをダブルクリックしてインストール開始

Glossitope3

Glossitope4

「Trust」ボタンをクリックして。
Glossitope5

お好きな場所に保存する。
Glossitope6

● Glossttopeの起動

Glossitope Bufferedというアプリケーションをダブルクリックして起動。
Glossitope7

Desklets(WidgetsのことをGlossitopeではDeskletsというらしい)をダウンロードするので「Yes」をクリック
Glossitope8

● 起動した!

Glossitope9

● ダブルクリックで広げると、

あら、DashboardのWidgetsにも似た、カレンダーや、目玉オヤジも!
Glossitope11

● 設定ダイアログは開発途上のようで、イマイチ。。。。(^^;;;;

Glossitope12

● Deskletsの管理

×ボタンをクリックするとDeskletsをunloadできる。
Glossitope13

Dashboardとちがって、Deskletsがバラバラになるアニメーションで消えていく
Glossitope14

ということで動きました. (^^;;;;

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

2007年7月21日 (土)

Dashcode Developer Beta - July 15, 2007.

そういえば、Dashcode Beta版の使用期限って、7月15日までだったことを思い出した。。(^^;;
TIgerでの正式版は出ないとも聞いているので、なんとなく残念な感じもする。便利な開発ツールですし。
まぁ、Leopardがリリースされたら移行すれば済むことなんだけど。。手に入るのはまだ先だろうし。それまではDashcodeに頼らずに作ろうかな。。。作りたいWidgetもあるし。。。

 Please note that the December 2006 beta of Dashcode compatible   
with Mac OS X 10.4 Tiger will cease to function on July 15, 2007.

Dashcode_beta_20070715

なんて思っていたタイミングで、Glossitopeのことを、今月の2時間で学ぶ Java Hot Topic (7月号)で知り、むくむくと制作意欲が。。。Glossitopeは、JavaVM上で動作するWidgetコンテナで、Java SE 6.0のスクリプトサポートを利用するか、javascript, Python, JRubyなど複数のスクリプト言語で記述することができるとのこと。

MacOSXでもOK。デモもMacOSXでしたし。
Glossitope のデモムービー

--追記
あ、忘れてました、Glossitopeは、Java SE 6.0が必要とのこと。

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

2007年7月14日 (土)

Oracle Database 11g - Database Resident Connection Pooling (DRCP)

データベースサーバー側でコネクションプールを管理できるようになるんですね。
コネクションプーリングしていないパッケージ製品を利用しているところでは喜ばれそうな機能でしょうね。
実際のところ、いちばん喜ぶのは、コネクションプールを利用していないパッケージ製品を開発・販売している会社さんだったりして。。それはさておき、この機能の詳細は興味のあるところです。

Oracle Database 11g Application Development whitepaperより引用。
Database Resident Connection Pooling (DRCP)

With this new feature, different application processes can share sessions within the
same host machine as well as across multiple host machines. The pool is
maintained on the database server by a new background process.
This feature is useful for applications that cannot be deployed as multithreaded (for
example, PHP applications in an Apache Web server environment) and database
requests are done in a session state independent manner. These applications no
longer have to hold the connections to the database persistently, thereby increasing
the scalability of the database.

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

Oracle Database 11g - PL/SQL - PL/Scope

これまた、渋い機能追加ですね。
Cscopeならぬ、PL/Scopeですか!。 待望の!?のクロスリファレンスツールの登場のようです。
前のエントリでもかいたプロファイリング機能や、クロスリファレンス機能などは、Oracle SQL Developerでも利用できるんでしょうかねぇ。(別途調べてみますか。。)


そういえば、Oracle7のころ、PL/SQLのクロスリファレンスって取れないのか? なんてPro*Cで、ディクショナリビューを問い合せてクロスリファレンスもどきをリストするプログラムを試しに作ったことあったっけ。。。
遠い目。。。プログラムが複雑かつ巨大になるとディクショナリビューの検索に時間がかかり過ぎ、重くて使い物にならなかったので没でしたけど。。。(笑)


Oracle Database 11g Application Development whitepaperより引用。

PL/SQL: PL/Scope

PL/Scope allows you to browse PL/SQL source code analogously to the way that
Cscope (see http://cscope.sourceforge.net/) allows you to browse C source code.
You can search for and display all types of definitions, declarations, assignments
and references in the PL/SQL source code. The PL/SQL compiler can optionally
derive the metadata needed to support PL/Scope and store it in the database
catalog. The metadata takes into account the nuances of the language, including
scoping and overloading. You can generate reports (especially hyperlinked HTML
reports) with supplied report generators. PL/Scope supports increased developer
productivity, especially for those who need to maintain someone else's code.

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

Oracle Database 11g - PL/SQL - Sequences

お〜。これは便利。
PL/SQL内から直接、シーケンスにアクセスできるようになるんですね。
これまでは、PL/SQL内でシーケンスにアクセスするには

select hoge_sequence.nextval into vSeq# from dual;

なんてクエリをPL/SQL内で発行する必要があった訳ですけど、これからはダイレクトに

vSeq# := hoge_sequence.nextval;

と書けるということなんでしょうね。便利です。

眠いので今日はこの辺りで。。。。。

Oracle Database 11g Application Development  whitepaperより引用。

PL/SQL: Sequences

The sequence generator provides a sequential series of numbers to applications.
The sequence generator is especially useful in multiuser environments for
generating unique sequential numbers such as an employee id without the overhead
of disk I/O or transaction locking.
In the previous release of Oracle Database, when a PL/SQL program needed to get
a value from syntax, it used SQL. This is a usability irritation for PL/SQL
programmers. In Oracle Database 11g, it is now possible to simply use the
pseudocolumns CURRVAL and NEXTVAL in a PL/SQL expression.
Simplifies coding.

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

Oracle Database 11g - PL/SQL - Hierarchical Profiler

へぇ〜。 PL/SQLのプロファイリングって、今までは、DBMS_PROFILEパッケージを使っていたけど、DBMS_PROFILERパッケージが進化したってことなのか?、それとも、新しいプロファイラーなのかなぁ。以下の概要ではそこまでは解説されていないけど、結果をHTMLで確認できるとか、深い部分までプロファイリングできそうですね。これまでのPL/SQLプロファイリングよりかなり使い勝手は向上しているようで期待してます。

Oracle Database 11g Application Development whitepaperより引用。

PL/SQL: Hierarchical Profiler

The PL/SQL hierarchical profiler reports the dynamic execution profile of your
PL/SQL program, organized by subprogram calls. It accounts for SQL and
PL/SQL execution times separately. Each subprogram-level summary in the
dynamic execution profile includes information such as number of calls to the
subprogram, time spent in the subprogram itself, time spent in the subprogram's
subtree (that is, in its descendent subprograms), and detailed parent-children
information. You can browse the generated HTML reports in any browser. The
browser's navigational capabilities, combined with well chosen links, provide a
powerful way to analyze performance of large applications, improve application
performance, and lower development costs.

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

Oracle Database 11g - OracleJVM

Oracle Database 11g の OracleJVMでは、Java SE 5をサポートするようですね。
ということは、先日のエントリのようなJava Stored Procedureも Java SE 5対応になるといことですね、ついに。:)

Oracle Database 11g Application Development whitepapaerより引用

Java: OracleJVM Compliance with Java 5

OracleJVM allows reusing Java SE applications and libraries directly in the database
resulting in significant productivity and performance gains. This release supports
Java SE 5 (i.e., compatibility with JDK 1.5), out of the box.

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

2007年7月12日 (木)

Oracle Database 11g

US OTNでOracle Database 11gの新機能概要や、white paperが続々と公開されはじめていますね。
時間のある時に読んでおくか。。

Oracle11g Database

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

2007年7月11日 (水)

Virtual Index

個人的にはOracle9iのころも含めて実践では利用した事は無い機能なのだが、Oracle ACEの一人である、Chris Foot氏が、dbazineでVirtual Indexについて書いていたので試してみることにした。


注)仮想索引は、今のところマニュアルに記載されていない隠し機能の一つなので、利用する際は、your own risk! ですよ。
  

まずは、準備から。dbazine.comの記事でも利用されている、HRスキーマ(サンプルスキーマ)を利用し試してみた。

SYS> 
SYS> select count(*) from hr.departments;

COUNT(*)
----------
27

SYS> select count(*) from hr.employees;

COUNT(*)
----------
107

SYS> create table scott.departments as select * from hr.departments;

表が作成されました。

SYS> create table scott.employees as select * from hr.employees;

表が作成されました。

SYS> conn scott/tiger
接続されました。


SCOTT> insert into employees select * from employees;

107行が作成されました。


....中略....


SCOTT> r
1* insert into employees select * from employees

109568行が作成されました。

SCOTT> commit;

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

SCOTT>

SCOTT> alter table departments add constraint pk_departments primary key (department_id);

表が変更されました。

SCOTT> exec dbms_stats.gather_schema_stats(ownname=>'SCOTT',cascade=>true);

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


SCOTT> alter session set optimizer_mode = 'FIRST_ROWS';

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

SCOTT> l
1 select
2 employee_id,
3 e.department_id,
4 d.department_name
5 from
6 employees e join departments d
7 on e.department_id = d.department_id
8 where
9* employee_id = 203
SCOTT> /

実行計画
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=2011 Card=1481 Bytes=35544)
1 0 NESTED LOOPS (Cost=2011 Card=1481 Bytes=35544)
2 1 TABLE ACCESS (FULL) OF 'EMPLOYEES' (TABLE) (Cost=514 Card=1494 Bytes=11952)
3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPARTMENTS' (TABLE) (Cost=1 Card=1 Bytes=16)
4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPARTMENTS' (INDEX (UNIQUE)) (Cost=0 Card=1)


SCOTT>

empoyees表のemployee_id列に索引がないので、FULLスキャンになっているようですね。

ということで、準備完了!

● 早速、仮想索引 (virtual index)を作成してみる! create index文に、 nosegment句を付けるだけ。


  ついでに統計情報も取得する。

SCOTT> create index empid_v_idx on employees(employee_id) nosegment;

索引が作成されました。

SCOTT> exec dbms_stats.gather_index_stats(ownname=>'SCOTT',indname=>'EMPID_V_IDX');

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

● 実行計画を確認してみる。


おやおや、変化しないですねぇ。って当然です。Virtual Indexは今のところ隠し機能なので、
_use_nosegment_indexes という隠しパラメータを true にセットしないと機能しません。

SCOTT> set autot trace exp
SCOTT> l
1 select
2 employee_id,
3 e.department_id,
4 d.department_name
5 from
6 employees e join departments d
7 on e.department_id = d.department_id
8 where
9* employee_id = 203
SCOTT> /

実行計画
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=2902 Card=2365 Bytes=56760)
1 0 NESTED LOOPS (Cost=2902 Card=2365 Bytes=56760)
2 1 TABLE ACCESS (FULL) OF 'EMPLOYEES' (TABLE) (Cost=513 Card=2384 Bytes=19072)
3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPARTMENTS' (TABLE) (Cost=1 Card=1 Bytes=16)
4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPARTMENTS' (INDEX (UNIQUE)) (Cost=0 Card=1)


SCOTT>


● _use_nosegment_indexesパラメータをtrueに設定して再チャレンジ。


おお〜〜〜。employee_id列に非ユニーク索引を作成すれば、このクエリは早くなりそうですね。

SCOTT> alter session set "_use_nosegment_indexes" = true;

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

SCOTT> l
1 select
2 employee_id,
3 e.department_id,
4 d.department_name
5 from
6 employees e join departments d
7 on e.department_id = d.department_id
8 where
9* employee_id = 203
SCOTT> /

実行計画
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=273 Card=2365 Bytes=56760)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMPLOYEES' (TABLE) (Cost=10 Card=88 Bytes=704)
2 1 NESTED LOOPS (Cost=273 Card=2365 Bytes=56760)
3 2 TABLE ACCESS (FULL) OF 'DEPARTMENTS' (TABLE) (Cost=3 Card=27 Bytes=432)
4 2 INDEX (RANGE SCAN) OF 'EMPID_V_IDX' (INDEX) (Cost=1 Card=2384)

SCOTT>


● では、本当の索引を作成したらどうなのでしょうね。


おお〜〜〜。Cost=3042もある〜〜〜。 Virtual Indexの時は、Cost=273なのに〜〜。
だから、隠し機能なんですかね????。 
単純な問合せでは、Virtual Indexとの差はあまりなかったのですが。。。

SCOTT> drop index empid_v_idx;

索引が削除されました。

SCOTT> alter session set "_use_nosegment_indexes" = false;

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

SCOTT> create index empid_idx on employees(employee_id);

索引が作成されました。

SCOTT> exec dbms_stats.gather_index_stats(ownname=>'SCOTT',indname=>'EMPID_IDX');

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

SCOTT> l
1 select
2 employee_id,
3 e.department_id,
4 d.department_name
5 from
6 employees e join departments d
7 on e.department_id = d.department_id
8 where
9* employee_id = 203
SCOTT> /

実行計画
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=3042 Card=1657 Bytes=39768)
1 0 NESTED LOOPS (Cost=3042 Card=1657 Bytes=39768)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'EMPLOYEES' (TABLE) (Cost=1365 Card=1673 Bytes=13384)
3 2 INDEX (RANGE SCAN) OF 'EMPID_IDX' (INDEX) (Cost=4 Card=1673)
4 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPARTMENTS' (TABLE) (Cost=1 Card=1 Bytes=16)
5 4 INDEX (UNIQUE SCAN) OF 'PK_DEPARTMENTS' (INDEX (UNIQUE)) (Cost=0 Card=1)

SCOTT>


● なぜ? 実行計画に差がでてしまうのだろうか???? (だから隠し機能のままなのか???) 疑問。。。


推測なので、間違っているかもしれないという前提ですが、以下のログを見てもらいたい。
user_objectsには索引として存在しているが、 user_indexesには存在しない。
user_indexesに存在しないということは、dbms_statsパッケージでアナライズしたVirtual Indexの統計情報はどこに格納されるのか???
それがポイントになりそうな気がします。

統計情報の格納場所が無い = 統計情報が無い = 統計情報の欠落 = コストベース・オプティマイザは、統計情報のデフォルト値を利用して実行計画を立てる!
 
ということになるのではないか? と思った次第。従って、実体のある索引とはかけ離れたCostが算出されてしまう。 
これは私個人の推測に過ぎません。なにせ、隠し機能なので、マニュアルにも解説は無いので・・・。

このようなことを踏まえた上で、開発環境で、試してみる程度なら楽しいかもしれませんね。。(趣味の世界の話になっちゃいますけどね。。笑)

今回は、Oracle10g R1を利用した結果なので、Oracle10g R2でも試してみましょうかね。気が向いた時にでも。

SCOTT> l
1 select
2 object_name
3 ,object_type
4 from
5 user_objects
6 where
7* object_type = 'INDEX' and object_name = 'EMPID_V_IDX'
SCOTT> /

OBJECT_NAME OBJECT_TYPE
------------------------------ -------------------
EMPID_V_IDX INDEX

SCOTT> l
1 select
2 index_name
3 ,table_name
4 ,index_type
5 ,uniqueness
6 ,initial_extent
7 ,last_analyzed
8 ,status
9 from
10 user_indexes
11 where
12* index_name = 'EMPID_V_IDX'
SCOTT> /

レコードが選択されませんでした。

SCOTT>

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

2007年7月 8日 (日)

Stored Procedure で host command #3

前回からの続きです。
さて、前回は、javaクラスをOracle Databaseへデプロイしたところまでだった。

ということで、デプロイしたクラスとメソッドを確認しておきましょう! (以下の例は、 user_java_methodsビューを問い合わせたもの)

このマニュアルも参考になるのでリンクしておきます。

SQL> conn scott/tiger
SQL> select name,method_name,accessibility,is_static,return_class from user_java_methods;

NAME METHOD_NAM ACCESSIBILITY IS_STA RETURN_CLA
---------------------------------------- ---------- ------------------ ------ ----------
jp/macdeoracle/CommandOutputReader $init$ NO -
jp/macdeoracle/CommandOutputReader <init> PUBLIC NO -
jp/macdeoracle/CommandOutputReader run PUBLIC NO -
jp/macdeoracle/HostCommandExecuter <clinit> YES -
jp/macdeoracle/HostCommandExecuter exec PRIVATE YES -
jp/macdeoracle/HostCommandExecuter ls PUBLIC YES -
jp/macdeoracle/HostCommandExecuter main PUBLIC YES -
jp/macdeoracle/HostCommandExecuter <init> PUBLIC NO -

8行が選択されました。

SQL>

● 次にjavaストアドプロシージャのコール仕様を作成する

language java以降がポイントですよ。実行するstatic methodを指定します。
SQL> create or replace procedure ls(directory IN VARCHAR2)
2 as language java
3 name 'jp.macdeoracle.HostCommandExecuter.ls(java.lang.String)';
4 /

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

では、実行してみると・・・・・。
あれれ、権限が足りないとでますね。。。。。

SQL>
SQL> exec ls('c:¥temp');
BEGIN ls; END;

*
行1でエラーが発生しました。:
ORA-29532: 不明なJava例外でJavaコールが終了しました: java.security.AccessControlException: the Permission (java.io.FilePermission <<ALL
FILES>> execute) has not been granted to SCOTT. The PL/SQL to grant this is dbms_java.grant_permission( 'SCOTT',
'SYS:java.io.FilePermission', '<<ALL FILES>>', 'execute' )
ORA-06512: "SCOTT.LS", 行1
ORA-06512: 行1


● エラーメッセージの指示通りに、 dbms_java.grant_permissionを実行してみることに。。
  user_java_policyを確認してみると権限は付与されたようですね。。。

SQL> conn / as sysdba
SQL> execute dbms_java.grant_permission('SCOTT','SYS:java.io.FilePermission','<<ALL FILES>>','execute');

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

SQL>
SQL> conn scott/tiger
SQL> select action,type_name,name,enabled from user_java_policy;


ACTION TYPE_NAME NAME ENABLED
---------- ---------------------------------------- ---------------------------------------- ----------------
read java.io.FilePermission <<ALL FILES>> ENABLED
java.lang.RuntimePermission accessClassInPackage.* ENABLED
java.lang.RuntimePermission defineClassInPackage.* ENABLED
java.lang.RuntimePermission getProtectionDomain ENABLED
java.lang.RuntimePermission stopThread ENABLED
connect, java.net.SocketPermission * ENABLED
resolve
java.lang.RuntimePermission createSecurityManager ENABLED
java.lang.RuntimePermission exitVM ENABLED
java.lang.RuntimePermission loadLibrary.* ENABLED
java.lang.RuntimePermission modifyThread ENABLED
java.lang.RuntimePermission modifyThreadGroup ENABLED
java.lang.RuntimePermission preferences ENABLED
read java.util.PropertyPermission * ENABLED
write java.util.PropertyPermission user.language ENABLED
oracle.aurora.rdbms.security.PolicyTable 0:java.lang.RuntimePermission#loadLibrar ENABLED
Permission y.*
oracle.aurora.security.JServerPermission DUMMY DISABLED
oracle.aurora.security.JServerPermission LoadClassInPackage.* ENABLED
oracle.aurora.security.JServerPermission LoadClassInPackage.java.* ENABLED
oracle.aurora.security.JServerPermission LoadClassInPackage.oracle.aurora.* ENABLED
oracle.aurora.security.JServerPermission LoadClassInPackage.oracle.jdbc.* ENABLED
execute java.io.FilePermission <<ALL FILES>> ENABLED

21行が選択されました。

SQL>


再度、実行してます!

SQL> exec ls('c:¥temp');
BEGIN ls; END;

*
行1でエラーが発生しました。:
ORA-29532: 不明なJava例外でJavaコールが終了しました: java.security.AccessControlException: the Permission (java.io.FilePermission <<ALL
FILES>> execute) has not been granted to SCOTT. The PL/SQL to grant this is dbms_java.grant_permission( 'SCOTT',
'SYS:java.io.FilePermission', '<<ALL FILES>>', 'execute' )
ORA-06512: "SCOTT.LS", 行1
ORA-06512: 行1


なんなんでしょうね。よくわからないエラーメッセージですね。権限はあるのに。
わかりにくいメッセージ。やはりこうでなくちゃ、オラクルは。。なんてね。
イライラしてきたので、javasysprivロールを付与しちゃいました。(セキュリティ面からみれば好ましくないのですけど。)
各クラス毎に実行権限を細かく付与すればうまくいきそうですが、エラーメッセージからは、何のどんな権限が不足しているのか単純には判断できない(予想はつきますけど・・・)ので、この件に関しては別途調べることにして先へ進むことにします。要調査->TODO

SQL> conn / as sysdba
接続されました。
SQL> grant javasyspriv to scott;

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


:-) やっと動いた〜。

SQL> conn scott/tiger
接続されました。

SQL>
SQL> set serveroutput on
SQL> exec dbms_java.set_output(2000);

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

SQL> exec ls('c:¥temp');
apex_3.0
apex_3.0.zip
jdevstudio10131.zip
version.log

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

SQL>

なんとか実行できました。。。ね。 (^^;;;;

Jdeveloper_filelist3

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

2007年7月 4日 (水)

Stored Procedure で host command #2

さて、前回のつづきです。
javaストアドプロシージャのソースは以下の通り。

OSコマンドを実行するjavaの例は、ググればやまほどヒットするので特に解説はなし。
Oracleでjavaストアドプロシージャを作成する方法は、マニュアル「Oracle Database Java開発者ガイド - 3 Oracle DatabaseでのJavaメソッドのコール」を参照のこと。
基本は前述のマニュアルで足りると思います。(今回は、JDBCも利用していませんし。)
それに加えて、OTN-JのOracleJVM and Java Stored Procedures なども参考になるでしょうね。

以下、Oracle JDeveloper 10.1.3.1 for MacOSXを利用。

Jdev10gmacosx_hostcommand

package jp.macdeoracle;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;


public class CommandOutputReader extends Thread {
private InputStream is;
private String lines = "";

public CommandOutputReader(InputStream is) {
this.is = is;
}

public void run()
{
String outputLine;
try {
BufferedReader br = new BufferedReader(new InputStreamReader(this.is));
while ((outputLine = br.readLine()) != null) {
System.out.println(outputLine);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package jp.macdeoracle;

import java.lang.Runtime;
import java.lang.SecurityException;
import java.io.IOException;

public class HostCommandExecuter
{
public static final String OS_WINDOWS_ = "Windows";
public static final String OS_MACOSX_ = "Mac OS X";
public static final String OS_LINUX_ = "Linux";

private static void exec(String[] command)
throws IOException,
SecurityException,
InterruptedException
{
Process myproc = Runtime.getRuntime().exec(command);
new CommandOutputReader(myproc.getInputStream()).start();
new CommandOutputReader(myproc.getErrorStream()).start();
myproc.waitFor();
}

public static void ls(String directory)
throws IOException,
SecurityException,
InterruptedException
{
String osname = System.getProperty("os.name");
if (osname.indexOf(OS_WINDOWS_) >= 0) {
String[] cmd = {"CMD.EXE", "/C", "DIR", "/B", directory};
exec(cmd);
} else if (
osname.indexOf(OS_MACOSX_) >= 0
|| osname.indexOf(OS_LINUX_) >= 0
) {
String[] cmd = {"/bin/ls", directory};
exec(cmd);
} else {
throw new IOException(osname + ":このOSには対応していません。");
}
}

public static void main(String[] args)
throws IOException,
InterruptedException,
SecurityException
{
ls(".");
}
}

上記ソースをコンパイルしてOracle Databaseへデプロイ! (以下、Oracle10g R2の例)
うまくいけば以下のようなログが表示される。

loadjavaを接続'Oracle10gR2_Scott'で呼出し中。引数:
-order -resolve -definer -force -thin -schema scott -verbose
creating : class SCOTT.jp/macdeoracle/CommandOutputReader
loading : class SCOTT.jp/macdeoracle/CommandOutputReader
creating : class SCOTT.jp/macdeoracle/HostCommandExecuter
loading : class SCOTT.jp/macdeoracle/HostCommandExecuter
resolving: class SCOTT.jp/macdeoracle/CommandOutputReader
resolving: class SCOTT.jp/macdeoracle/HostCommandExecuter
Loadjavaが終了しました。
公開が終了しました。
---- ストアド・プロシージャのデプロイが終了しました ----


次のようなエラーがでたら、J2SE 1.4.xでコンパイルし直してデプロイすべし! 
オラクルにしては、わかり易いメッセージじゃ。 (^^) 

loadjavaを接続'Oracle9iR2_Scott'で呼出し中。引数:
-order -resolve -definer -force -thin -schema scott -verbose
creating : class SCOTT.jp/macdeoracle/CommandOutputReader
loading : class SCOTT.jp/macdeoracle/CommandOutputReader
created : "SCOTT".CREATE$JAVA$LOB$TABLE
Error while creating class jp/macdeoracle/CommandOutputReader
ソケットから読み込むデータはこれ以上ありません。
Error while testing for existence of dbms_java.handleMd5
Exception java.sql.SQLException: OALL8 is in an inconsistent state.
created : "SCOTT".JAVA$CLASS$MD5$TABLE
creating : class SCOTT.jp/macdeoracle/HostCommandExecuter
loading : class SCOTT.jp/macdeoracle/HostCommandExecuter
Error while creating class jp/macdeoracle/HostCommandExecuter
ソケットから読み込むデータはこれ以上ありません。
The following operations failed
class SCOTT.jp/macdeoracle/CommandOutputReader: creation (createFailed)
class SCOTT.jp/macdeoracle/HostCommandExecuter: creation (createFailed)
oracle.aurora.server.tools.loadjava.ToolsException: Failures occurred during processing
at oracle.aurora.server.tools.loadjava.LoadJava.process(LoadJava.java:863)
at oracle.jdeveloper.deploy.tools.OracleLoadjava.deploy(OracleLoadjava.java:116)
at oracle.jdeveloper.deploy.tools.OracleLoadjava.deploy(OracleLoadjava.java:46)
at oracle.jdevimpl.deploy.OracleDeployer.deploy(OracleDeployer.java:97)
at oracle.jdevimpl.deploy.StoredProcHandler.doDeploy(StoredProcHandler.java:473)
at oracle.jdevimpl.deploy.StoredProcHandler.doDeploy(StoredProcHandler.java:360)
at oracle.jdevimpl.deploy.StoredProcHandler.doDeploy(StoredProcHandler.java:284)
at oracle.jdevimpl.deploy.StoredProcProfileDt$Action$1.run(StoredProcProfileDt.java:383)
#### デプロイが不完全です ####
*** Note ***
デプロイ・エラーの可能性の1つとして、ターゲット・データベースがJDKバージョン1.5をサポートしていないことが考えられます。
お使いのプロジェクト・プロパティ・コンパイラのソースとターゲットを古いバージョンに変更することで、この問題を修復できます。
************


プロジェクトプロパティを開いて、j2se 1.4.2を設定している様子。
Change_jdk1 Change_jdk2Change_jdk3Change_jdk4

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

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