• 検索結果がありません。

PL/SQLからのオペレーティング・システム・コマンドの実行

N/A
N/A
Protected

Academic year: 2021

シェア "PL/SQLからのオペレーティング・システム・コマンドの実行"

Copied!
9
0
0

読み込み中.... (全文を見る)

全文

(1)

PL/SQL からのオペレーティング・

システム・コマンドの実行

Oracleホワイト・ペーパー 20087月 注:本書は、オラクルの一般的な製品の方向性を示すことが目的です。 また、情報提供を唯一の目的とするものであり、いかなる契約にも組み 込むことはできません。下記の事項は、マテリアルやコード、機能の提 供を確約するものではなく、また、購買を決定する際の判断材料とはな りえません。オラクルの製品に関して記載されている機能の開発、リリー ス、および時期については、弊社の裁量により決定いたします。

(2)

PL/SQL からのオペレーティング・システム・コマン

ドの実行

はじめに ... 3

ファイル・システムと SQL および PL/SQL の相互作用... 4

インストール・オプション... 4

ソフトウェア要件... 4

SQL スクリプト ... 4

インストール手順... 4

まとめ ... 7

推奨資料 ... 8

(3)

はじめに

本書では、Oracle データベースの開発者によるオペレーティング・システムまたは通常のファイルとの相 互作用を可能にする、PL/SQL パッケージの OS_COMMAND、FILE_PKG および FILE_TYPE について説 明します。オラクルは、ファイル・システムにアクセスするためだけに限定された機能を標準で提供して いますが、シェル・コマンドやオペレーティング・システムのプロセスを実行する機能は提供していませ ん。このホワイト・ペーパーでは、次の内容について説明します。 一般に、Oracle エンジンを使用してシェル・コマンドを実行する方法には、次の 3 通りがあります。 1. ネイティブ共有ライブラリをコーディングし、そのライブラリを CREATE LIBRARY を使用して Oracle

データベース内で参照し、特定の機能に対する PL/SQL ラッパーを作成します。これを行うには、Oracle を実行しているプラットフォームの C コンパイラが必要です。

2. シェル・コマンドを実行できるオラクル提供のパッケージ、DBMS_SCHEDULER を使用します。ただ し、DBMS_SCHEDULER では、STDIN および STDOUT にはアクセスできません。これらにアクセス する必要がある場合は、DBMS_SCHEDULER は選択肢から外します。

3. Oracle8i 以降、Java SE 準拠の仮想マシンがデータベース・カーネルに組み込まれているため、他の任 意の Oracle Java VM (JVM) で、System.exec メソッドを使用してシェル・コマンドを実行できます。JDBC API を使用すると、STDIN、STDOUT のコンテンツ、または OS の戻り値を SQL エンジンに戻すこと ができます。Java はプラットフォームに依存しないので、1 つのインストール・スクリプトが全プラッ トフォームのジョブを実行します。

このホワイト・ペーパーでは、3 番目の方法であるデータベースで Java を使用する方法を中心に説明しま す。

(4)

ファイル・システムと SQL および PL/SQL の相互作用

インストール・オプション

次の 2 つのインストール・オプションがあります。 1. Java クラスとパッケージを SYS ユーザーとして作成し、すべてのユーザーからアクセスできるように する。 2. Java クラスとパッケージを非権限ユーザー・スキーマに作成する。 いずれのケースでも、呼び出すユーザーには、パッケージを使用するための適切な Java 権限が必要です。

ソフトウェア要件

1. Oracle Database 10g Release1 以降

2. データベースに Java がインストールされ有効になっている

次のコマンドを SYS ユーザーとして実行し、データベースにインストールされている Java の詳細を確認し てください。

sqlplus> select comp_name, version from dba_registry where comp_name like ‘%JAVA%‘; 3. 適切なサイズの java_pool_size(最低 50MB)

SQL スクリプト

インストーラには、以下のSQLスクリプトが含まれています。

1. os_command_java.sql:SQL または PL/SQL から OS コマンドを実行し、SQL レイヤーからファイル・ システムにアクセスするための Java クラスを作成します。OS コマンドの実行は、Java ファイル・シス テム・インタフェースおよび System.exec コールを介しておこなわれます。結果は、JDBC クラスを介 して SQL エンジンにわたされます。そのため、コール元は適切な Java 権限を保持している必要があり ます。ファイル・システムにアクセスするためのクラスには、java.io.File を使用してファイルの一般的 な処理を行うためのメソッドがあります。それらのメソッドは、オブジェクト型 FILE_TYPE を使用し て PL/SQL からコールします。この結果、次の PL/SQL パッケージも作成されます。FILE_PKG は、1 つまたは複数のファイル・ハンドルを取得するためのヘルパー・パッケージであり、OS_COMMAND は、シェル・コマンドを実行するためのパッケージです。LOB_WRITER_PLSQL は、純粋な PL/SQL および"従来型"のディレクトリ・オブジェクトとして、LOB(CLOB、BLOB)をオペレーティング・ システム・ファイルに書き込むためのヘルパー・パッケージです。

2. grant_public.sql:パッケージおよび Java クラスを SYS ユーザーとして作成してあり、パブリック・シ ノニムを作成して、他のユーザーに実行権限を付与する場合は、このスクリプトを実行します。 3. java_grants.sql:OS コマンドを実行するための適切な Java 権限を付与します。

4. sample_script.sql:ZIP ファイルのコンテンツを表の中に展開するデモを実行します。 5. cleanup.sql:パッケージおよびクラスを削除します。

(5)

2. このホワイト・ペーパーでは、スキーマ"SCOTT"に Java クラスとパッケージを作成します。SYS ユー ザーとして、オペレーティング・システム・コマンドを実行するための Java 権限を"SCOTT"に付与す る必要があります。そのため、SYS ユーザーとしてデータベースに接続します。

3. 次のスクリプトおよび後述のコマンドを実行します。 sqlplus> @java_grants.sql;

sqlplus> grant create public synonym to scott; 4. scott としてデータベースに接続します。 sqlplus> connect scott/<password>;

5. 以下のスクリプトを順番に実行します。その結果、必要なクラスとパッケージが作成されます。 sqlplus> @os_command_java.sql; sqlplus> @file_type_java.sql; sqlplus> @os_command.pls; sqlplus> @os_command.plb; 6. テキスト出力(ls -la)を返すシェル・コマンドを実行するには、次のコマンドを実行します。 sqlplus> select os_command.exec_clob('/bin/ls -la /home/oracle') COMMAND from dual;

次のスクリーン・ショットのような結果が表示されます。

7. ディレクトリを作成するには、次のコマンドを実行します。次のスクリーン・ショットのような結果 が表示されます。

(6)

8. ディレクトリ内のファイルを仮想表として取得するには、次のコマンドを実行します。次のスクリー ン・ショットのような結果が表示されます。

sqlplus> select * from table(file_pkg.get_file_list(file_pkg.get_file('/')));

9. ZIP ファイルを展開して、そのコンテンツを表にロードするには、sample_scripts.sql を実行します。こ のスクリプトを実行すると、展開する ZIP ファイルの指定を求められます。続いて、ZIP のアーカイブ を展開する一時ディレクトリが作成され、そのコンテンツが表にロードされ、最後に一時ディレクト リが削除されます。スクリプトを実行する前に、適切な権限を SYS から SCOTT に付与する必要があ ります。次を参照してください。

sqlplus> connect / as sysdba;

sqlplus> exec DBMS_JAVA.grant_permission('SCOTT', 'java.io.FilePermission', '<<ALL FILES>>', 'read ,write, execute, delete');

sqlplus> exec Dbms_Java.Grant_Permission('SCOTT', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', ''); sqlplus> exec Dbms_Java.Grant_Permission('SCOTT', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', ''); sqlplus> connect scott/<password>;

sqlplus> @sample_script.sql;

10. ZIP ファイルを展開し、そのコンテンツを表にロードするためのシステム要件ごとに以下のコードを変 更することもできます。

declare f file_type;

(7)

begin

--get a handle for the "tmp" directory f:=file_pkg.get_file('/tmp');

--create a new temporary directory where the zip archive is being --extracted into ... make the filename unique using TIMESTAMP fz := f.create_dir(

'zipdir_temp_'||user||'_'||to_char(systimestamp, 'YYYYMMDD_HH24MISS.SSSS') );

--extract the zipfile; the -qq switch is important here otherwise --the OS process will not come back

r := os_command.exec('unzip -o -qq [/PATH/TO/ZIPFILE] -d '||fz.file_path); --if the result is 0 (=success) load the contents of the temporary directory --(recursively) with ONE (!) SQL INSERT command

if r = 0 then

insert into document_table ( select seq_documents.nextval id, e.file_path, e.file_name, file_pkg.get_file(e.file_path).get_content_as_clob('iso-8859-1') content from table(file_pkg.get_recursive_file_list(fz)) e ); end if;

--finally delete the temporary directory and its contents fz := fz.delete_recursive(); end; / sho err

まとめ

本書では、オペレーティング・システム・ファイルと相互に作用するための PL/SQL メソッドについて説 明しました。他のすべての JVM と同様、データベース・カーネルに組み込まれている仮想マシンでは、 System.exec メソッドを使用してシェル・コマンドを実行できます。この機能については、例で説明しまし た。

(8)

推奨資料

1. OTNのテクニカル・ホワイト・ペーパー(http://www.oracle.com/technology/global/jp/tech/java/jsp/index.html)

2. Oracle Database Programming Using Java and Web Services、Kuassi Mensah著 (http://db360.blogspot.com/2006/08/oracle-database-programming-using-java_01.html)

(9)

PL/SQLからのオペレーティング・システム・コマンドの実行 2008年7月 著者:Priyanka Sharma 共著者:Carsten Czarski Oracle Corporation World Headquarters 500 Oracle Parkway Redwood Shores, CA 94065 U.S.A. 海外からのお問い合わせ窓口: 電話:+1.650.506.7000 ファクシミリ:+1.650.506.7200 www.oracle.com オラクル社はインターネット上での活動を強化するソフトウェ アを提供します。 Oracleは、オラクル社の登録商標です。本文書内で参照される各 種製品とサービスの名称はOracle Corporationの商標です。その 他の製品とサービスの名称はそれぞれの会社の商標です。 Copyright © 2002 Oracle Corporation

参照

関連したドキュメント

Microsoft/Windows/SQL Server は、米国 Microsoft Corporation の、米国およびその

これらの先行研究はアイデアスケッチを実施 する際の思考について着目しており,アイデア

Generative Design for Revit は、Generative Design を実現するために Revit 2021 から搭 載された機能です。このエンジンは、Dynamo for

・Microsoft® SQL Server® 2019 Client Access License (10 User)ライセンス証書 オープン価格. オープン価格 Microsoft SQL

本事業における SFD システムの運転稼働は 2021 年 1 月 7 日(木)から開始された。しか し、翌週の 13 日(水)に、前年度末からの

( 同様に、行為者には、一つの生命侵害の認識しか認められないため、一つの故意犯しか認められないことになると思われる。

法制執務支援システム(データベース)のコンテンツの充実 平成 13

また、第1号技能実習から第2号技能実習への移行には技能検定基礎級又は技