Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1...

44
Caché での Perl の使用 Version 5.1 2006-03-14 InterSystems Corporation 1 Memorial Drive Cambridge MA 02142 www.intersystems.com

Transcript of Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1...

Page 1: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

Caché での Perl の使用法

Version 5.12006-03-14

InterSystems Corporation 1 Memorial Drive Cambridge MA 02142 www.intersystems.com

Page 2: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

Caché での Perl の使用法

Caché Version 5.1 2006-03-14

Copyright © 2006 InterSystems Corporation.

All rights reserved.

このドキュメントは、 Sun Microsystems、RenderX Inc.、 アドビ システムズ および ワールドワイド・ウェブ・コンソーシアム

(www.w3c.org)のツールと情報を使用して、Adobe Portable Document Format (PDF)で作成およびフォーマットされました。

主要ドキュメント開発ツールは、InterSystemsが構築したCaché と Javaを使用した特別目的のXML処理アプリケーションで

す。

Caché 製品とロゴは InterSystems Corporation の登録商標です。

Ensemble 製品とロゴは InterSystems Corporation の登録商標です。

InterSystems という名前とロゴは InterSystems Corporation の登録商標です

このドキュメントは、インターシステムズ社(住所:One Memorial Drive, Cambridge, MA 02142)あるいはその子会社が所有す

る企業秘密および秘密情報を含んでおり、インターシステムズ社の製品を稼動および維持するためにのみ提供される。こ

の発行物のいかなる部分も他の目的のために使用してはならない。また、インターシステムズ社の書面による事前の同意

がない限り、本発行物を、いかなる形式、いかなる手段で、その全てまたは一部を、再発行、複製、開示、送付、検索可能

なシステムへの保存、あるいは人またはコンピュータ言語への翻訳はしてはならない。

かかるプログラムと関連ドキュメントについて書かれているインターシステムズ社の標準ライセンス契約に記載されている

範囲を除き、ここに記載された本ドキュメントとソフトウェアプルグラムの複製、使用、廃棄は禁じられている。インターシス

テムズ社は、ソフトウェアライセンス契約に記載されている事項以外にかかるソフトウェアプログラムに関する説明と保証を

するものではない。さらに、かかるソフトウェアに関する、あるいはかかるソフトウェアの使用から起こるいかなる損失、損害

に対するインターシステムズ社の責任は、ソフトウェアライセンス契約にある事項に制限される。

前述は、そのコンピュータソフトウェアの使用およびそれによって起こるインターシステムズ社の責任の範囲、制限に関する

一般的な概略である。完全な参照情報は、インターシステムズ社の標準ライセンス契約に記され、そのコピーは要望によっ

て入手することができる。

インターシステムズ社は、本ドキュメントにある誤りに対する責任を放棄する。また、インターシステムズ社は、独自の裁量

にて事前通知なしに、本ドキュメントに記載された製品および実行に対する代替と変更を行う権利を有する。

Caché および InterSystems Caché、Caché SQL、 Caché ObjectScript および Caché Object は、インターシステムズ社の

商標です。

ここで使われている他の全てのブランドまたは製品名は、各社および各組織の商標または登録商標です。

インターシステムズ社の製品に関するサポートやご質問は、以下にお問い合わせください:

InterSystems ワールドワイド カスタマサポート

+1 617 621-0700Tel:

+1 617 374-9391Fax:

[email protected]:

Page 3: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

目次

1 Caché Perl バインディング .......................................................................................... 1

1.1 Perl バインディング・アーキテクチャ ..................................................................... 1

1.2 クイック・スタート ............................................................................................... 2

1.3 インストールと構成 ............................................................................................ 3

1.3.1 Perl クライアント要件 ................................................................................ 3

1.3.2 UNIX 環境でのインストール ....................................................................... 4

1.3.3 Windows 環境でのインストール .................................................................. 4

1.3.4 Caché サーバ構成 ................................................................................... 5

1.4 サンプル・プログラム ......................................................................................... 6

2 Perl バインディングの使用法 ....................................................................................... 9

2.1 Perl バインディングの基礎 ................................................................................. 9

2.1.1 Caché データベースへの接続 .................................................................. 10

2.1.2 Caché Database メソッドの使用法 .............................................................. 11

2.1.3 Caché Object メソッドの使用法 ................................................................. 12

2.2 タイ変数の使用法 ........................................................................................... 13

2.3 コレクションとリストの使用法 .............................................................................. 14

2.3.1 %Collection オブジェクト .......................................................................... 14

2.3.2 %List 変数 ............................................................................................. 15

2.4 リレーションシップの使用法 .............................................................................. 19

2.5 クエリの使用法 ............................................................................................... 19

2.6 %Binary データの使用法 .................................................................................. 21

2.7 例外処理 ...................................................................................................... 22

2.7.1 エラー報告 ............................................................................................ 22

3 Perl クライアント・クラス・リファレンス ............................................................................ 25

3.1 データ型 ....................................................................................................... 25

3.2 接続 ............................................................................................................. 26

3.2.1 接続情報 .............................................................................................. 27

3.3 データベース ................................................................................................. 28

3.4 オブジェクト ................................................................................................... 29

3.5 クエリ ............................................................................................................ 31

3.5.1 クエリの作成 .......................................................................................... 31

3.5.2 パラメータの設定 .................................................................................... 31

3.5.3 クエリの実行 .......................................................................................... 32

3.5.4 結果の取得 ........................................................................................... 32

3.6 時刻と日付 .................................................................................................... 33

3.6.1 %TIME .................................................................................................. 33

Caché での Perl の使用法                                                                                                            iii

Page 4: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

3.6.2 %DATE ................................................................................................. 34

3.6.3 %TIMESTAMP ....................................................................................... 35

3.7 ロケールとクライアント・バージョン ...................................................................... 38

iv                                                                                                            Caché での Perl の使用法

Page 5: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

1Caché Perl バインディング

Caché Perl バインディングは、Perl アプリケーション内でCaché オブジェクトを直接操作する簡単な

方法を提供します。Caché Perlバインディングを使用することで、Perlプログラムで、Caché上のデー

タベースへの接続の確立、データベース内のオブジェクトの作成とオープン、オブジェクト・プロパ

ティの操作、オブジェクトの保存、オブジェクト上のメソッドの実行、クエリの実行などが可能になりま

す。Caché のすべてのデータ型がサポートされています。

Perl バインディングは、並行処理やトランザクション制御に加えて、オブジェクト・データベースの永

続性を完全にサポートします。また、高度なデータ・キャッシング・スキーマも装備されており、Caché

サーバとPerl アプリケーションが別マシンにある場合のネットワーク・トラフィックを最小限に抑えるこ

とができます。

このドキュメントは、Perl および標準の Perl モジュールの基礎を理解しているユーザのために作成

されたものです。Caché には、Perl インタープリタや開発環境は含まれていません。

1.1 Perl バインディング・アーキテクチャ

Caché Perl バインディングを使用すると、Perl アプリケーションは Caché サーバ上のオブジェクトと

相互運用できます。Perl バインディングには、以下のコンポーネントが含まれます。

• Intersys::PERLBIND モジュール — Caché データベースに格納されているオブジェクトに対す

る透過的な接続を、Perl アプリケーションに提供する Perl C 拡張です。

• Caché オブジェクト・サーバ — Perl クライアントと Caché データベース・サーバ間の通信を管理

する高性能なサーバ・プロセスです。通信には標準のネットワーク・プロトコル (TCP/IP)が使用

され、Cachéがサポートする任意のプラットフォーム上で動作できます。Cachéオブジェクト・サー

バは、Perl、Python、C++、Java、JDBC、ODBC などの、あらゆる Caché 言語バインディングに

よって使用されます。

Caché での Perl の使用法                                                                                                             1

Page 6: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

基本機能は以下のとおりです。

• Caché内で 1つ以上のクラスを定義します。これらのクラスは、Cachéデータベースに格納され

る永続オブジェクト、または、Caché サーバで動作する一時的なオブジェクトです。

• 実行時、Perl アプリケーションはCaché サーバに接続します。その後、Caché サーバ内に格納

されているオブジェクトのインスタンスにアクセスできます。Cachéは、すべての通信とクライアン

ト側のデータ・キャッシングを自動的に管理します。実行時のアーキテクチャは以下のとおりで

す。

- Caché データベース・サーバ (1 つまたは複数)

- Perl インタープリタ。現在、Caché では Perl 5.6 が必須です。

- Perl アプリケーション。実行時、Perl アプリケーションは、オブジェクト接続インタフェースま

たは標準 ODBC インタフェースのいずれかを使用して、Caché に接続します。Perl アプリ

ケーションと Caché サーバ間のすべての通信は、TCP/IP プロトコルを使用します。

1.2 クイック・スタート

ここでは、Perl バインディングの中核となる基本的な機能をいくつか紹介します。

• 接続の確立とデータベースの取得

$url = "localhost[1972]:Samples" $conn = Intersys::PERLBIND::Connection->new($url,"_SYSTEM","SYS",0); $database = Intersys::PERLBIND::Database->new($conn);

$database は、$url で指定されたネームスペースへの論理接続です。

• 既存のオブジェクトのオープン

$person = $database->openid("Sample.Person","1", -1, -1);

$person は、Caché サーバ上の Sample.Person オブジェクトへの論理接続です。

• 新規オブジェクトの作成

$person = $database->create_new("Sample.Person",undef);

• プロパティの設定と取得

$person->set("Name","Adler, Mortimer"); $name = $person->get("Name");

• メソッドの実行

$answer = $person->Addition(17,20);

2                                                                                                             Caché での Perl の使用法

Caché Perl バインディング

Page 7: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

• オブジェクトの保存

$person->run_obj_method("%Save")

• 保存されているオブジェクトの ID の取得

$id = $person->run_obj_method("%Id")

• クエリの実行

$query = $database->alloc_query(); $query->prepare("SELECT * FROM SAMPLE.PERSON WHERE ID=?",$sqlcode); $query->set_par(1,2); $query->execute($sqlcode); while (@data_row = $query->fetch($sqlcode)) { $colnum = 1; foreach $col (@data_row) { $col_name = $query->col_name($colnum); print "column name = $col_name, data=$col\n"; $colnum++; } }

1.3 インストールと構成

標準の Caché インストールでは、Caché Perl バインディングに必要なすべてのファイルが

<cachesys>/dev/perlに配置されます (<cachesys>は Caché のメイン・ディレクトリ)。以下のインス

トール手順の完了後は、任意の Perl サンプル・プログラムが実行可能になります。

1.3.1 Perl クライアント要件

Caché は、 Intersys::PERLBIND モジュールにより、クライアント側の Perl をサポートします。このモ

ジュールは、Caché サーバとの通信に必要な接続機能とキャッシング機能を実装します。

このモジュールを使用するには、以下の環境が必要です。

• Perl バージョン 5.6

• C++ コンパイラ。Windows では、Microsoft Visual C++ 6.0 または Visual Studio .NET 2003 が

必要です。UNIX の場合は GCC が必要です。

• PATH には <cachesys>\binディレクトリを含める必要があります。<cachesys> は、Caché イン

ストールのルート・ディレクトリです。<cachesys>の既定の場所は、Windowsでは c:\cachesys、

UNIX では /usr/cachesys です。

• C コンパイルとリンクをサポートするための環境変数を設定します。例えば、Windows では、

VCVARS32.BAT (Visual Studio 6.0) または VSVARS32.BAT (Microsoft Visual Studio .NET

2003) を呼び出します。この手順を実行しないと、make の段階でエラーが報告されます。

Caché での Perl の使用法                                                                                                             3

インストールと構成

Page 8: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

1.3.2 UNIX 環境でのインストール

• PATHおよび LD_LIBRARY_PATHに <cachesys>/binが含まれていることを確認します。以下

はその例です。

export PATH=/usr/cachesys/bin:$PATH export LD_LIBRARY_PATH=/usr/cachesys/bin:$LD_LIBRARY_PATH

• Makefile.PL を実行します (<cachesys>/dev/perlにあります)。<cachesys>の場所は引数とし

て指定できます。以下はその例です。

perl Makefile.PL /usr/cachesys

引数なしで実行すると、<cachesys> の場所を入力するよう要求されます。

• パスに <cachesys>/bin があることを確認したら、以下を実行します。

make

• make がエラーなしで実行されたら、以下を実行してテストします。

make test

• make test に成功したら、以下を実行します。

make install

1.3.3 Windows 環境でのインストール

• <cachesys>\bin が PATH にあることを確認します。

• Makefile.PL を実行します (<cachesys>\dev\perlにあります)。<cachesys>の場所は引数とし

て指定できます。以下はその例です。

perl Makefile.PL C:\cachesys

引数なしで実行すると、<cachesys> の場所を入力するよう要求されます。

• パスに <cachesys>\bin があることを確認したら、以下を実行します。

nmake

• nmake がエラーなしで実行されたら、以下を実行してテストします。

nmake test

• nmake test に成功したら、以下を実行します。

nmake install

4                                                                                                             Caché での Perl の使用法

Caché Perl バインディング

Page 9: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

1.3.4 Caché サーバ構成

Caché サーバで Perl クライアントを使用するのに、特別な構成はほとんど必要ありません。Caché

が提供する Perl サンプル・プログラムは、Caché を既定でインストールすると、変更を加えなくても

動作します。このセクションでは、Perl に関連するサーバ設定とそれらの変更方法について説明し

ています。

Caché サーバに接続するすべての Perl クライアントには、以下の情報が必要です。

• サーバ IP アドレス、ポート番号、および Caché ネームスペースを指定する URL

• ユーザ名とパスワード

既定では、Perl サンプル・プログラムは、以下の接続情報を使用します。

• 接続文字列 : "localhost[1972]:Samples"

• ユーザ名 : "_SYSTEM"

• パスワード : "SYS"

問題が発生した場合は、以下の点を確認してください。

• Caché サーバがインストールされ実行中であることを確認します。

• Caché サーバを実行しているマシンの IPアドレスを確認します。Perl サンプル・プログラムでは

"localhost"が使用されます。サンプル・プログラムで別のシステムを既定とする場合は、コー

ド内の接続文字列を変更する必要があります。

• 待ち受け状態になっているCaché サーバのTCP/IP ポート番号を確認します。Perl サンプル・

プログラムは "1972" を使用します。サンプル・プログラムで別のポートを既定とする場合は、

サンプル・コード内で番号を変更する必要があります。

• 接続を行うためのユーザ名とパスワードが有効であることを確認します (ユーザ名とパスワード

は Caché 管理ポータルで管理できます)。Perl サンプル・プログラムは、管理者のユーザ名

"_SYSTEM" と既定のパスワード "SYS" または "sys" を使用します。通常、サーバのインス

トール後に既定のパスワードを変更します。サンプル・プログラムで異なるユーザ名とパスワー

ドを既定にする場合は、サンプル・コードを変更する必要があります。

• 接続 URL に有効な Caché ネームスペースがあることを確認してください。ネームスペースは、

プログラムで使用するクラスとデータを含む必要があります。Perl サンプルは、Caché で事前に

インストールされている SAMPLES ネームスペースに接続します。

Caché での Perl の使用法                                                                                                             5

インストールと構成

Page 10: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

1.4 サンプル・プログラム

Caché には、Caché Perl バインディングの使用法を示すサンプル・プログラム・セットが用意されて

います。これらのサンプルは、Caché インストールの <cachesys>/dev/perl/samples/サブディレク

トリにあります。これらは、Java バインディング・サンプルと同じ要領で名前と番号が付けられ、実装

されています。

以下は、そのサンプル・プログラムです。

• CPTest2.pl — Sample.Person のインスタンスのプロパティを取得および設定します。

• CPTest3.pl — 埋め込みオブジェクト Sample.Person.Home のプロパティを取得します。

• CPTest4.pl — 埋め込みオブジェクト Sample.Person.Home を更新します。

• CPTest5.pl — データ型コレクションを処理します。

• CPTest6.pl — ByName クエリの結果セットを処理します。

• CPTest7.pl — ダイナミック SQL クエリの結果セットを処理します。

• CPTest8.pl — employee サブクラスおよび company/employee リレーションシップを処理します。

これらすべてのアプリケーションは、SAMPLES ネームスペースの Sample パッケージにあるクラス

を使用します (Caché スタジオでアクセス可能)。Sample パッケージを以前に使用したことがない場

合は、このパッケージを Caché スタジオで開き、正しくコンパイルされることを確認してください。

引数

サンプル・プログラムはさまざまなスイッチによって制御されます。これらのスイッチは、プログラムへ

の引数としてコマンド行に入力できます。引数を入力しない場合は既定値が使用されます。

例えば、CPTest2.pl には、以下のオプション引数を指定できます。

• -user — ログイン時に使用するユーザ名 (既定値は "_SYSTEM")。

• -password — 使用するパスワード (既定値は "SYS")。

• -host — 接続先のホスト・コンピュータ (既定値は "localhost")。

• -port — 使用するポート (既定値は "1972")。

-user 引数は以下のように指定します。

perl CPTest2.pl -user _MYUSERNAME

CPTest7.pl サンプルは、SQL クエリに渡される -query 引数を受け入れます。

perl CPTest7.pl -query A

6                                                                                                             Caché での Perl の使用法

Caché Perl バインディング

Page 11: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

このクエリは、文字 "A" で始まる名前を含むすべての Sample.Person レコードを列挙します。

Caché での Perl の使用法                                                                                                             7

サンプル・プログラム

Page 12: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142
Page 13: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

2Perl バインディングの使用法

この章では、Caché Perl バインディングを使用する Perl コードの具体例を紹介します。ここで説明

する内容は以下のとおりです。

• Perl バインディングの基礎—Cachéデータベース・オブジェクトへのアクセスと操作に関する基

本事項です。

• タイ変数の使用法 — Perl バインディングへのアクセスに使用可能な Perl 固有の方法

• コレクションの使用法 — Caché のリストと配列を反復処理します。

• リレーションシップの使用法 — 埋め込みオブジェクトを操作します。

• クエリの使用法 — Caché クエリとダイナミック SQL クエリを実行します。

• %Binary データの使用法 — Caché %Binary と Perl 順序配列との間でデータを移動します。

• 例外処理 — Perl バインディングからの Perl 例外とエラー・メッセージを処理します。

ここで紹介する例の多くは、<cachesys>/dev/perl/samples/ にあるサンプル・プログラムに収録さ

れています。コードを簡略化するため、引数処理とエラー・トラップの文 (try/catch)は除外されてい

ます。完全なサンプル・プログラムをロードして実行する方法の詳細は、"サンプル・プログラム" を

参照してください。

2.1 Perl バインディングの基礎

Caché Perl バインディング・アプリケーションは非常にシンプルです。以下は、完全なサンプル・プ

ログラムです。

Caché での Perl の使用法                                                                                                             9

Page 14: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

use Intersys::PERLBIND; eval { # Connect to the Cache' database $url = "localhost[1972]:Samples"; $user = "_SYSTEM"; $password = "SYS"; $conn = Intersys::PERLBIND::Connection->new($url,$user,$password,0); $database = Intersys::PERLBIND::Database->new($conn);

# Create and use a Cache' object $person = $database->create_new("Sample.Person", undef); $person->set("Name","Doe, Joe A"); print "Name: ",$person->get("Name"), "\n"; };

このコードは Intersys::PERLBIND モジュールをインポートして、以下の処理を実行します。

• Caché データベースの Samples ネームスペースに接続します。

- Caché データベースへの接続に必要な情報を定義します。

- Connection オブジェクト ($conn) を作成します。

- Connectionオブジェクトを使用して、Databaseオブジェクト ($database) を作成します。

• Caché オブジェクトを作成し、使用します。

- Database オブジェクトを使用して、Caché Sample.Person クラスのインスタンスを作成しま

す。

- Sample.Person オブジェクトの Name プロパティを設定します。

- Name プロパティを取得し、出力します。

この後のセクションでは、これらの基本処理について詳しく説明します。

2.1.1 Caché データベースへの接続

Caché データベースのネームスペースへ接続するための基本的な手順は以下のとおりです。

• 物理的な接続を確立します。

$conn = Intersys::PERLBIND::Connection->new($url, $userid, $password, $timeout);

Connection->new() メソッドは、Cachéデータベースのネームスペースへ物理的に接続します。

$url パラメータは、Connection オブジェクトがアクセスするサーバとネームスペースを定義し

ます。Connection クラスには、Kerberos を使用した安全な接続を確立する new_secure() メソッ

ドもあります。これらのメソッドの詳細は、"接続" を参照してください。

• 論理接続を作成します。

$database = Intersys::PERLBIND::Database->new($conn);

10                                                                                                           Caché での Perl の使用法

Perl バインディングの使用法

Page 15: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

Connectionオブジェクトを使用してDatabaseオブジェクトを作成します。これは、ネームスペー

スのクラスを使用してデータベースを操作できるようにする論理接続です。

以下のコードによって、Samples ネームスペースへの接続が確立されます。

$address ="localhost"; # server TCP/IP address ("localhost" is 127.0.0.1) $port = "1972"; # server TCP/IP port number $namespace = "SAMPLES"; # sample namespace installed with Cache'

$url = $address."[$port]:".$namespace; $user = "_SYSTEM"; $password = "SYS";

$conn = Intersys::PERLBIND::Connection->new($url,$user,$password,0); $database = Intersys::PERLBIND::Database->new($conn);

2.1.2 Caché Database メソッドの使用法

Intersys::PERLBIND::Databaseクラスを使用すると、Caché クラスのメソッドを実行して、サーバ上の

Caché オブジェクトに接続できます。Database クラスのメソッドで実行できる基本操作は以下のとお

りです。

• オブジェクトの作成。

create_new() メソッドを使用して、新しい Caché オブジェクトを作成します。構文は、以下の通り

です。

$object = $database->create_new($class_name, $initial_value)

$class_nameは、$databaseによってアクセスされるネームスペース内のCaché クラスの名

前です。例えば、Sample.Person クラスの新規インスタンスを作成する場合は、以下の文を実

行します。

$person = $database->create_new("Sample.Person", undef);

この例では、$person の初期値は未定義です。

• オブジェクトのオープン。

openid() メソッドを使用して、既存のCachéオブジェクトをオープンします。構文は、以下の通り

です。

$object = $database->openid($class_name, $id, $concurrency, $timeout)

例えば、以下の文は、id の値が 1 である Sample.Person オブジェクトをオープンします。

$person = $database->openid("Sample.Person", "1", -1, 0);

同時処理とタイムアウトは既定値に設定されています。

• クラス・メソッドの実行。

Caché での Perl の使用法                                                                                                           11

Perl バインディングの基礎

Page 16: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

以下の構文を使用してクラス・メソッドを実行できます。

$result = $database->run_class_method($classname,$methodname,LIST)

LIST は、メソッド引数のリストです。例えば、前述の $database->openid() の例は以下の

コードと同等です。

$person = $database->run_class_method("Sample.Person","%OpenId","1");

このメソッドは、Caché ##class 構文と類似しています。以下はコードの例です。

$list = $database->run_class_method("%ListOfDataTypes","%New",undef); $list->Insert("blue");

上記のコードは、以下の ObjectScript コードとまったく同じです。

set list=##class(%ListOfDataTypes).%New() do list.Insert("blue")

2.1.3 Caché Object メソッドの使用法

Intersys::PERLBIND::Object は、Caché オブジェクトへアクセスするためのクラスです。Object クラ

スのメソッドで実行できる基本操作は以下のとおりです。

• プロパティの取得と設定。

プロパティにアクセスするには、アクセサ・メソッド get() と set() を使用します。これらのメソッドの

構文は以下のとおりです。

$value = $object->get($propname) $object->set($propname,$value)

以下はその例です。

$person->set("Name","Adler, Mortimer"); $name = $person->get("Name");

プライベート・プロパティと多次元プロパティは、Perlバインディングからはアクセスできません。

• オブジェクト・メソッドの実行。

オブジェクト・メソッドを直接呼び出すことで、それらを実行できます。

$answer = $object->MethodName(LIST);

以下はその例です。

$answer = $person->Addition(17,20);

run_obj_method() によっても、同じ処理を実行できます。

$answer = $object->run_obj_method($MethodName,LIST);

12                                                                                                           Caché での Perl の使用法

Perl バインディングの使用法

Page 17: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

以下はその例です。

$answer = $object->run_obj_method("Addition", 17, 20);

このメソッドは、直接アクセスできない継承メソッド (%Save や %Id など) を呼び出すときに役立ち

ます。

• オブジェクトの保存。

オブジェクトを保存するには、run_obj_method() を使用して %Save を呼び出します。

$object->run_obj_method("%Save")

保存されているオブジェクトの ID を取得するには、run_obj_method() を使用して %Id を呼び出

します。

$id = $object->run_obj_method("%Id")

• メソッドおよびプロパティに関する情報の取得。

Object クラスには、オブジェクト内のメソッドおよびプロパティに関する情報を返すメソッドがいく

つかあります。get_methods() および get_properties() メソッドは、そのコンテキストに応じて、使

用可能な項目数か有効な項目名のリストのどちらかを返します。

$methodcount = $object->get_methods(); # scalar context @methodlist = $object->get_methods(); # list context

$propcount = $object->get_properties(); # scalar context @proplist = $object->get_properties(); # list context

is_method() および is_property() メソッドは、文字列が有効な項目名であるかどうかを判別する

テストを実行します。

$bool = $object->is_method($methodname); $bool = $object->is_property($propname);

2.2 タイ変数の使用法

Perlバインディングによって返されたオブジェクトをハッシュにタイし、そのハッシュを介してオブジェ

クトのプロパティにアクセスできます。以下はその例です。

$object = $database->openid("Sample.Person", "1", -1, 0); $person = tie %person,"Intersys::PERLBIND::ObjectHash",( _object => $object) $name = $person{"Name"};# The following line is equivalent to $person->set("Name","Tregar, Sam"); $person{"Name"} = "Tregar, Sam";

$person->get("Name") によって個人の名前を取得する代わりに、タイを使用することで、ハッ

シュの $person{"Name"} から名前を取得できます。

Caché での Perl の使用法                                                                                                           13

タイ変数の使用法

Page 18: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

タイからの返り値を使用して、メソッドを実行できます。または、Perl の "tied" ビルトインを使用して、

メソッドを実行できます。以下はその例です。

$ans = $person->Addition(12,17); print "ans=$ans\n";

$ans = tied(%person)->Addition(12,17); print "ans=$ans\n";

両方の場合で、値 29 が返されます。

また、タイを使用して、プロパティのリストを繰り返し処理することもできます。

while (($property, $value ) = each(%person)) { print "propety=$property value=$value\n"; }

以下はその完全な例です。

$database = Intersys::PERLBIND::Database->new($conn); $personobj = $database->openid("Sample.Person", "1", -1, 0);

$person = tie %person,"Intersys::PERLBIND::ObjectHash",( _object => $personobj);

while (($propname, $value) = each(%person)) { print "property $propname = $value\n"; }

この例では、各プロパティとその値を表示する以下の出力が生成されます。

property Age = 61 property DOB = 1942-01-18 property SSN = 295-62-8728 property Home = Intersys::PERLBIND::Object=SCALAR(0x1831ee4) property Name = Adler, Mortimer property Office = Intersys::PERLBIND::Object=SCALAR(0x183eed0) property Spouse = property FavoriteColors = Intersys::PERLBIND::Object=SCALAR(0x1831e3c)

2.3 コレクションとリストの使用法

Caché %Collection オブジェクトは、他の Perl バインディング・オブジェクトと同様に処理されます。

Caché %List変数は、Perl の配列参照にマップされます。この後のセクションでは、コレクションとリス

ト両方の使用方法を示します。

2.3.1 %Collection オブジェクト

コレクションを操作するには、Caché %Collectionクラスのオブジェクト・メソッドを使用します。以下の

例は、Caché %ListOfDataType コレクションを操作する方法を示しています。

14                                                                                                           Caché での Perl の使用法

Perl バインディングの使用法

Page 19: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

# Create a %ListOfDataTypes object and add a list of colors $newcolors = $database->run_class_method("%ListOfDataTypes","%New",undef); @color_list = qw(red blue green); for $color (@color_list) { $newcolors->Insert($color); print " added >$color<\n"; };

# Add the list to a Sample.Person object $person = $database->openid("Sample.Person",$id,-1,0); $person->set("FavoriteColors",$newcolors);

# Get the list back from $person and print it out. $colors = $person->get("FavoriteColors"); print "Number of colors: ",$colors->get("Size"), "\n"; do { $color = $colors->GetNext($i); print " New Color #$i = $color\n" if defined($i); } until (!defined($i));

# Remove and replace the second element $colors->RemoveAt(2) if $colors->get("Size") > 0; $colors->InsertAt("purple",2);

# Show the changes to the collection print("Modified 'FavoriteColors' list:\n"); do { $color = $colors->GetNext($i); print " Element #$i = $color\n" if defined($i); } until (!defined($i));

2.3.2 %List 変数

Perl バインディングでは、Caché %List 変数は Perl 配列参照にマップされます。

注意: Perl の配列にはサイズの制限がありませんが、Caché %List 変数は約 32 KB に制

限されています。実際の上限は、データ型と、各要素に必要なヘッダ・データのサ

イズによって異なります。%Listデータのサイズがこの上限に達する可能性がある場

合は、適切なエラー・チェック (この後の例を参照) を使用してください。%List 変数

の内部構造に関する詳細は、"Caché ObjectScript リファレンス" の "ZZDUMP" コ

マンドを参照してください。

このセクションの例では、以下の Caché クラスが使用されています。

Caché での Perl の使用法                                                                                                           15

コレクションとリストの使用法

Page 20: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

Class Sample.List Extends %Persistent { Property CurrentList As %List;

Method InitList() As %List { q $LB(1,"hello",3.14) }

Method TestList(NewList As %List) As %Integer { set $ZTRAP="ErrTestList" set ItemCount = $LISTLENGTH(NewList) if (ItemCount = 0) {set ItemCount = -1} q ItemCount ErrTestList set $ZERROR = "" set $ZTRAP = "" q 0 } }

TestList() メソッドは、Perl 配列が有効なCaché リストかどうかのテストに使用されます。リストが長す

ぎる場合、このメソッドはエラーをトラップし、0 (Perl の偽) を返します。リストが有効な場合は、要素

の数が返されます。有効なリストの要素数が 0 の場合は、-1 が返されます。

例 1 : Caché から Perl への変換

以下のコードは、Sample.List オブジェクトを作成して InitList() メソッドから事前定義済みの Caché

リストを取得し、それを Perl 配列に変換してその配列に関する情報を表示します。

$listobj = $database->create_new("Sample.List",undef); $arrayref = $listobj->InitList(); @array = @$arrayref;

print "Initial List from Cache:\n"; print "array address = $arrayref\n"; print "array contents = @array\n"; print "There are ",scalar(@array)," elements in the list:\n"; for ($i=0;$i<scalar(@array);$i++) { print " element ",$i+1," = [$array[$i]]\n"; }

このコードは以下の出力を生成します。

Initial List from Cache: array address = ARRAY(0x18d3d04) array contents = Cache to Perl: hello! 1 3.14 There are 4 elements in the list: element 1 = [Cache to Perl: hello!] element 2 = [1] element 3 = [] element 4 = [3.14]

element 3 の Caché のNULL リスト要素は、Perl 配列では undef 値に相当します。

例 2 : Perl から Caché への変換および Perl への再変換

以下のコードは両方向にリストを渡します。このコードは、小規模な Perl 配列を作成してそれを

Caché オブジェクトの CurrentList プロパティに格納し、その後で、同じプロパティから再取得して

Perl 配列に再変換します。

16                                                                                                           Caché での Perl の使用法

Perl バインディングの使用法

Page 21: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

@oldarray = (1, undef, 2.78,"Just a small list."); $listobj->set("CurrentList",\@oldarray); $arrayref = $listobj->get("CurrentList"); @newarray = @$arrayref;

print "\n\nThis list is from property CurrentList:\n"; print "There are ",scalar(@newarray)," elements in the list:\n"; for ($i=0;$i<scalar(@newarray);$i++) { print " element ",$i+1," = [$newarray[$i-1]]\n"; } print "\nThe old and new arrays "; if ("@oldarray" eq "@newarray") {print "match:\n"} else {print "DON'T match:\n"}; print " old:>@oldarray<\n", " new:>@newarray<\n";

このコードは以下の出力を生成します。

This list is from property CurrentList: There are 4 elements in the list: element 1 = [Just a small list.] element 2 = [1] element 3 = [] element 4 = [2.78]

The old and new arrays match: old:>1 2.78 Just a small list.< new:>1 2.78 Just a small list.<

例 3 : リスト容量のテスト

Cache %List 変数に Perl 配列をすべて格納できるようにすることは重要です。以下のコードは、過

度に大規模な Perl 配列を作成し、それを CurrentList プロパティに格納しようとします。

Caché での Perl の使用法                                                                                                           17

コレクションとリストの使用法

Page 22: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

# Create a large array and print array information. $longitem = "1022 character element".(1234567890 x 100); @array =("This array is too long."); $cache_list_size = length($array[0]); for ($i=0;$i<33;$i++) { push(@array,$longitem); $cache_list_size += length($longitem); }; print "\n\nNow for a HUGE list:\n"; print "Total bytes required by Cache' list: more than $cache_list_size\n"; print "There are ",scalar(@array)," elements in the ingoing list.\n\n";

# Check to see if the array will fit. $bool = $listobj->TestList(\@array); print "TestList() reports that the array "; if ($bool) {print "is okay, and has $bool elements.\n";} else {print "will be damaged by the conversion.\n"};

# Pass the array to Cache', get it back, and display the results $listobj->set("CurrentList",\@array); $badarrayref = $listobj->get("CurrentList"); @badarray = @$badarrayref;

print "There are ",scalar(@badarray)," elements in the returned list:\n"; for ($i=0;$i<scalar(@badarray);$i++) { $line = $badarray[$i]; # long elements are shortened for readability. if (length($line)> 1000) {substr($line,10,980) = "..."}; print " element ",$i+1," = [$line]\n"; }

出力をわかりやすく示すため、正常なセクションについては要素が省略されています。Unicodeシス

テムでは以下の出力が生成されます。

Now for a HUGE list: Total bytes required by Cache' list: more than 33749 There are 34 elements in the ingoing list.

TestList() reports that the array will be damaged by the conversion. There are 17 elements in the returned list: element 1 = [This array is too long.] element 2 = [1022 chara...90123456789012345678901234567890] element 3 = [1022 chara...90123456789012345678901234567890] element 4 = [1022 chara...90123456789012345678901234567890] element 5 = [1022 chara...90123456789012345678901234567890] element 6 = [1022 chara...90123456789012345678901234567890] element 7 = [1022 chara...90123456789012345678901234567890] element 8 = [1022 chara...90123456789012345678901234567890] element 9 = [1022 chara...90123456789012345678901234567890] element 10 = [1022 chara...90123456789012345678901234567890] element 11 = [1022 chara...90123456789012345678901234567890] element 12 = [1022 chara...90123456789012345678901234567890] element 13 = [1022 chara...90123456789012345678901234567890] element 14 = [1022 chara...90123456789012345678901234567890] element 15 = [1022 chara...90123456789012345678901234567890] element 16 = [1022 chara...90123456789012345678901234567890] element 17 = [1022 chara...90123456ray is too long.ﴠȇ1022 c]

元の 34 要素のうち、破損したリストには 17 要素しか含まれていないので、17 要素が破損している

ことになります。

18                                                                                                           Caché での Perl の使用法

Perl バインディングの使用法

Page 23: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

2.4 リレーションシップの使用法

リレーションシップは、リレーションシップ・オブジェクトとそのメソッドによってサポートされています。

以下の例は、$company オブジェクトと一連の $employee オブジェクト間にある 1 つまたは複数

のリレーションシップを使用してレポートを生成します。このコードでは、リレーションシップ・オブジェ

クトの $emp_relationship によって、$company オブジェクトに関連付けられているすべての

$employee オブジェクトへのアクセスが可能になっています。

$company = $database->openid("Sample.Company", "1", -1, 0); $emp_relationship = $company->get("Employees"); $index=undef; do { $employee = $emp_relationship->run_obj_method("GetNext",$index); # "GetNext" sets $index to the next valid index, or to undef if # there are no more records. if ($index) { $name = $employee->get("Name"); $title = $employee->get("Title"); $company = $employee->get("Company"); $compname = $company->get("Name"); $SSN = $employee->get("SSN"); print "index=$index employee name=$name SSN=$SSN ", "title=$title companyname=$compname\n"; }; } while ($index);

以下のコードは、新しい従業員レコードを作成してそれをリレーションシップに追加し、$company

の保存時にその従業員の情報を自動的に保存します。

$new_employee = $database->create_new("Sample.Employee",""); $new_employee->set("Name",$name); $new_employee->set("Title",$title); $new_employee->set("SSN",$SSN); $emp_relationship->run_obj_method("Insert", $new_employee); $company->run_obj_method("%Save");

2.5 クエリの使用法

クエリを実行するための基本的な手順は以下のとおりです。

• クエリ・オブジェクトを作成します。

$query = $database->alloc_query()

$database は Intersys::PERLBIND::Database オブジェクトで、$query は

Intersys::PERLBIND::Query オブジェクトです。

• クエリを作成します。

Caché での Perl の使用法                                                                                                           19

リレーションシップの使用法

Page 24: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

SQL クエリは prepare() メソッドを使用します。

$query->prepare($sql_query, $sqlcode)

$sql_query は、実行するクエリを含む文字列です。

Caché クラスのクエリは prepare_class() メソッドを使用します。

$query->prepare_class($class_name, $query_name, $sqlcode)

• パラメータ値を割り当てます。

$query->set_par($idx, $val)

set_par() メソッドは、パラメータ $idx に値 $val を割り当てます。既存のパラメータの値を変

更するには、新しい値を指定して set_par() を再度呼び出します。Query クラスには、既存のパ

ラメータに関する情報を返すいくつかのメソッドが用意されています。

• クエリを実行します。

$query->execute($sqlcode)

execute() メソッドは、set_par() の呼び出しで定義されているパラメータを使用して、結果セットを

生成します。

• データ行を取得します。

@data_row = $query->fetch($sqlcode)

fetch() メソッドを呼び出すたびに、結果セットからデータ行が取得され、そのデータがリストとし

て返されます。取得するデータがない場合は、空のリストが返されます。Query クラスには、行

内の列に関する情報を返すいくつかのメソッドが用意されています。

Sample.Person からデータを取得する簡単な SQL クエリを以下に示します。

# Allocate, prepare, set a parameter, and get a result set: $query = $database->alloc_query(); $sql_query = "SELECT ID, Name, DOB, SSN FROM Sample.Person ~WHERE Name %STARTSWITH ?"; $sqlcode=0; $query->prepare($sql_query, $sqlcode); $query->set_par(1,"A"); $query->execute($sqlcode);

# Fetch each row in the result set, and print the # name and value of each column in a row: $rownum = 1; while (@data_row = $query->fetch($sqlcode)) { print "Row $rownum ===================\n"; $colnum = 1; foreach $col_data (@data_row) { $col_name = $query->col_name($colnum); print " $col_name: $col_data\n"; $colnum++; } $rownum++ }

20                                                                                                           Caché での Perl の使用法

Perl バインディングの使用法

Page 25: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

Intersys::PERLBIND::Query クラスの詳細は、"Perl クライアント・クラス・リファレンス" の章の "クエ

リ"を参照してください。Cachéのクエリの詳細は、"Cachéオブジェクトの使用法"の "クエリの実行"

を参照してください。

2.6 %Binary データの使用法

Perl バインディングでは、Perl pack() および unpack() 関数を使用して、Caché %Binary と Perl の順

序配列間でデータを変換します。Caché バイナリ・データの各バイトは、Perl では 0 ~ 255 の整数

として表されます。

このセクションの例では、以下の Caché クラスが使用されています。

Class Sample.Bin Extends %Persistent { Property B As %Binary;

Method GetBinary() As %Binary { q "hello"}

Method SetBinary(PerlBin As %Binary) { s ^foobar=PerlBin} }

このクラスは、さまざまな方法 (プロパティ値、メソッドの返り値、メソッドの引数、グローバル変数) で

%Binaryデータを使用します。以下のコードは、Caché と Perl 間で、バイナリ・データを双方向に複

数回変換します。Perl アプリケーションは、そのたびにデータを変更します。

最初の入力はメソッドの結果です。GetBinary() メソッドは、%Binary 値 "hello" を返します。この

値がアンパックされ、結果として得られる配列が出力されます。

$binobj = $database->openid("Sample.Bin",1,-1,0); $B_packed = $binobj->run_obj_method("GetBinary"); @B_unpacked = unpack("c*",$B_packed ); # "c*" is the template for an ord foreach $c (@B_unpacked) { # "%c" turns the ord value $c into a character printf "[%c]",$c } print "\n";

出力の先頭行は以下のようになります。

[h][e][l][l][o]

ここで、最初のバイトを "j" に変更し、配列を再パックします。パックした値は Caché %Binary の B

プロパティに格納され、変更した Caché オブジェクトが保存されます。

$B_unpacked[0] = ord("j"); $B_packed = pack("c*",@B_unpacked); $binobj->set("B",$B_packed); $binobj->run_obj_method("%Save");

Caché での Perl の使用法                                                                                                           21

%Binary データの使用法

Page 26: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

2 番目の入力はプロパティ値です。B プロパティから %Binaryの "jello"値を取得し、アンパック

します。今回、プログラムは、新しい要素を配列の最後に追加することで値を再び変更します。

$B_packed = $binobj->get("B"); @B_unpacked = unpack("c*",$B_packed ); # "c*" is the template for an ord push @B_unpacked, ord("!"); foreach $c (@B_unpacked) { printf "[%c]",$c } print "\n"; };

前の行と結合されます。出力結果は以下のとおりです。

[h][e][l][l][o] [j][e][l][l][o][!]

最後に、配列を再度パックし、それを引数として SetBinary() メソッドに渡します。このメソッドは、渡

された引数を Caché のグローバル変数 ^foobar に格納します。

$B_packed = pack("c*",@B_unpacked); $binobj->run_obj_method("SetBinary",$B_packed);

2.7 例外処理

Perl バインディングでは、Perl 例外を使用して、C バインディングなどからのエラーを返します。

以下に、Perl 例外の使用例を示します。

eval { $answer = $variant2->run_obj_method("PassLastByRefAdd17","10","goodbye"); }; if ($@) { print "Perl exception $@\n"; }

# Attempt to open a nonexistent id eval { $causeException = $database2->openid("NonExistent", "1", -1, 0); }; if ($@) { print "Perl exception $@\n"; }

2.7.1 エラー報告

引数または返り値の処理時、C バインディングからのエラー・メッセージは Perl バインディング層に

よって特別な形式にフォーマットされます。この情報は、インターシステムズのサポート窓口が問題

を診断する際に使用します。

以下はエラー・メッセージの例です。

22                                                                                                           Caché での Perl の使用法

Perl バインディングの使用法

Page 27: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

file=PERLBIND.xs line=71 err=-1 message=cbind_variant_set_buf() cpp_type=4 var.cpp_type=-1 var.obj.oref=1784835886 class_name=%Library.RelationshipObject mtd_name=GetNext argnum=0

エラー・メッセージの構成要素は以下のとおりです。

意味メッセージ

エラーが発生したファイル。file=PERLBIND.xs

ファイル内の行番号。line=71

C バインディングから返されるコード。err=-1

C バインディングのエラー・メッセージ。message= cbind_variant_set_buf()

メソッド引数の cpp タイプまたは返り値のタイ

プ。

cpp_type=4

variant の cpp タイプ。var.cpp_type=-1

variant の oref。var.obj.oref=1784835886

メソッドを呼び出すオブジェクトのクラス名。class_name=

%Library.RelationshipObject

メソッド名。mtd_name=GetNext

引数の番号。0 は最初の引数、-1 は返り値

を表します。

argnum=0

Caché での Perl の使用法                                                                                                           23

例外処理

Page 28: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142
Page 29: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

3Perl クライアント・クラス・リファレンス

この章では、Caché クラスおよびデータ型が Perl コードにマッピングされる方法と、Caché Perl バイ

ンディングによってサポートされるクラスおよびメソッドの詳細を説明します。ここで説明する内容は

以下のとおりです。

• データ型 — %Binary データおよび NULL のサポート。

• 接続 — Caché データベースのネームスペースへ物理的に接続するためのメソッド。

• データベース — Caché オブジェクトのオープンと作成、クエリの作成、および Caché クラス・メ

ソッドの実行に使用するメソッド。

• オブジェクト — プロパティの取得と設定、オブジェクト・メソッドの実行、オブジェクトに関する情

報の取得など、Caché オブジェクトを操作するためのメソッド。

• クエリ — クエリを実行し、その結果を取得するためのメソッド。

• 時刻と日付 — Caché の %Time データ型、%Date データ型、%Timestampデータ型にアクセス

するためのメソッド。

• ロケールとクライアント・バージョン — Caché のバージョン情報と Windows のロケール設定にア

クセスするためのメソッド。

3.1 データ型

Cachéのすべてのデータ型がサポートされています。特定のデータ型については、この後のセクショ

ンを参照してください。

• Caché %Binary データ型は、Perl の順序配列に相当します。使用例は、"%Binary データの使

用法" を参照してください。

Caché での Perl の使用法                                                                                                           25

Page 30: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

• %Library.ArrayOfDataTypesや %Library.ListOfDataTypes などのコレクションは、Caché

%Collection クラスのオブジェクト・メソッドで操作します。使用例は、"%Collection オブジェクト"

を参照してください。

• Caché %Library.List変数は、Perl の配列参照にマップされます。使用例は、"%List 変数" を参

照してください。

• Caché %Time、%Date、および %Timestampデータ型は、Perl バインディングの対応するクラス

によってサポートされます。これらのクラスについては、"時刻と日付" を参照してください。

NULL のサポート

Perl バインディングでは、Perl undefが Caché の NULL (つまり、"") に相当します。Perl には空文

字列の概念はありますが、Perl バインディングは、これを Caché の NULL として解釈しません。

3.2 接続

Intersys::PERLBIND::Connectionパッケージのメソッドは、Cachéデータベースのネームスペースへ

物理的に接続します。Connectionオブジェクトは、Databaseオブジェクトを作成する目的でのみ使

用されます。Databaseオブジェクトは、Perl バインディング・アプリケーションから Caché オブジェク

トを操作可能にする論理接続です。Connectionメソッドの使用方法については、"Cachéデータベー

スへの接続" を参照してください。

以下は、Connection のメソッド一覧です。

new()

$conn = Intersys::PERLBIND::Connection->new($url, $user, $pwd, $timeout)

パラメータの詳細は、この後の "接続情報" を参照してください。

new_secure()

$conn = Intersys::PERLBIND::Connection->new_secure($url, $srv_principal, $security_level, $timeout)

Connection->new_secure() は接続プロキシを返します。このプロキシを使用して、$url で

識別されるCachéネームスペースのプロキシを取得します。このメソッドには以下のパラメー

タを指定します。

• $url — URL 形式の詳細は、後述の "接続情報" を参照してください。

26                                                                                                           Caché での Perl の使用法

Perl クライアント・クラス・リファレンス

Page 31: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

• $srv_principal — Kerberos の "プリンシパル" は Kerberos データベースで使用

される ID であり、Kerberos KDC (鍵配布センター) とのみ共有される永続秘密鍵を所

有します。さらに、資格情報が割り当てられ、Kerberos 認証プロトコルに関与すること

ができます。

- "ユーザ・プリンシパル"はユーザに関連付けられ、サービスに対する認証に使用

され、それによってリソース (コンピュータ・アカウントや Caché サービスなど) の使

用が認可されます。

- "サービス・プリンシパル" はサービスに関連付けられ、ユーザ・プリンシパルを認

証するために使用されます。またオプションで、ユーザ・プリンシパルに対してサー

ビス・プリンシパル自体を認証することもできます。

- "サービス・プリンシパル名" ($srv_principal_name など) は、サービス・プリ

ンシパルの名前の文字列表現で、慣習的に以下の形式が使用されています。

<service>/<instance>@<REALM>

以下はその例です。

cache/[email protected]

Windows の場合、KDC はドメイン・コントローラに組み込まれ、サービス・プリンシパル

名はドメイン・アカウントに関連付けられます。

プリンシパルの詳細は、お使いのシステムのKerberos ドキュメントを参照してください。

• $security_level — "接続のセキュリティ・レベル" を設定します。このレベルは、ク

ライアント/サーバ・ネットワークに対する推奨または必須のセキュリティ・サービスを示

す整数で表されます。セキュリティ・レベルには以下の値を指定できます。

- 0 — なし。

- 1 — Kerberos クライアント/サーバ相互認証。データは保護されません。

- 2 — 1 と同じ。さらに、データ・ソースとコンテンツの整合性が保護されます。

- 3 — 2 と同じ。さらに、データが暗号化されます。

• $timeout — タイムアウトになるまで待機する秒数。

3.2.1 接続情報

Caché データベースに接続するには、以下の情報が必要です。

• URL — アクセスするサーバとネームスペースを文字列として指定します。形式は次のとおりで

す。

<address>[<port>]:<namespace>

Caché での Perl の使用法                                                                                                           27

接続

Page 32: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

例えば、サンプル・プログラムは以下の接続文字列を使用します。

"localhost[1972]:Samples"

この文字列の構成要素は以下のとおりです。

- <address> — サーバの TCP/IP アドレス、または完全修飾されたドメイン名 (FQDN)。サ

ンプル・プログラムでは "localhost" (127.0.0.1) が使用されます。この場合、サーバ

と Perl アプリケーションが同一マシン上に配置されているものとします。

- <port> — この接続のサーバ TCP/IP ポート番号。IP アドレスとポートの組み合わせによ

り、一意な Caché サーバが指定されます。

- <namespace> — 使用するオブジェクトが含まれている Caché ネームスペース。このネー

ムスペースでは、Cachéシステム・クラスをコンパイルしておく必要があります。また、操作の

対象となるオブジェクトはこのネームスペースに含まれている必要があります。サンプル・プ

ログラムでは、SAMPLE ネームスペースのオブジェクトが使用されます。

• user name — 接続を行うユーザの名前。サンプル・プログラムでは、"_SYSTEM" (SQL システ

ム・マネージャの既定のユーザ名) が使用されます。

• password — 指定したユーザ名に関連付けられているパスワード。サンプル・プログラムでは既

定の "SYS" が使用されます。

3.3 データベース

Database オブジェクトは、Caché ネームスペースへの論理接続を可能にします。

Intersys::PERLBIND::Databaseパッケージのメソッドは、Cachéオブジェクトのオープンまたは生成、

クエリの作成、および Caché クラス・メソッドの実行に使用します。Database オブジェクトは、

Database->new() メソッドによって生成されます。Databaseオブジェクトの作成方法の詳細は、"Caché

データベースへの接続" を参照してください。

以下は、Database のメソッド一覧です。

alloc_query()

$query = $database->alloc_query()

新しいQueryオブジェクトを作成します。Queryオブジェクト・メソッドの詳細は、"クエリ"を

参照してください。

create_new()

$obj = $database->create_new($type, $init_val)

28                                                                                                           Caché での Perl の使用法

Perl クライアント・クラス・リファレンス

Page 33: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

$type によって指定されたクラスから、新しい Caché オブジェクト・インスタンスを作成しま

す。通常、$init_valは ""です。このメソッドで作成されたオブジェクトの詳細は、"オブ

ジェクト" を参照してください。

new()

$database = Intersys::PERLBIND::Database->new($conn)

Caché ネームスペースへの論理接続を可能にする Database オブジェクトを生成します。

Connectionオブジェクト $connは、Databaseオブジェクトがアクセスするネームスペース

への物理接続を提供します。

open()

$obj = $database->open($class_name, $oid, $concurrency, $timeout, $res)

$class_name で指定されたクラスとオブジェクトの OID を使用して、Caché オブジェクト

のインスタンスをオープンします。$concurrency 引数には -1 の既定値があります。

$timeout は ODBC クエリのタイムアウトです。

openid()

$obj = $database->openid($class_name, $id, $concurrency, $timeout)

$class_name で指定されたクラスとオブジェクトの ID を使用して、Caché オブジェクトの

インスタンスをオープンします。$concurrency 引数には -1 の既定値があります。

$timeout は ODBC クエリのタイムアウトです。

run_class_method()

$value = $database->run_class_method($class_name, $method_name, LIST)

クラス・メソッド $method_name を実行します。$method_name は、$database の接続

先となるネームスペースにある $class_name クラスのメンバです。引数は LIST として渡

されます。Caché のクラス定義によっては、一部の引数を参照で渡すこともできます。返り

値は、Caché メソッドの返り値と同じです。

3.4 オブジェクト

Intersys::PERLBIND::Objectパッケージのメソッドは、Caché オブジェクトへのアクセスを可能にしま

す。Object オブジェクトは、Intersys::PERLBIND::Database create_new() メソッドによって作成され

ます (詳細は、"データベース" を参照)。Object メソッドの使用法の詳細は、"Caché Object メソッド

の使用法" を参照してください。

Caché での Perl の使用法                                                                                                           29

オブジェクト

Page 34: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

以下は、Object のメソッド一覧です。

get()

$value = $object->get($prop_name)

Caché オブジェクト $object のプロパティ $prop_name の値を返します。

get_methods()

@methodlist = $object->get_methods(); $methodcount = $object->get_methods();

リスト・コンテキストでは、Cachéオブジェクト $objectのメソッド名を含むリストを返します。

スカラ・コンテキストでは、$object のメソッド数を返します。

get_properties()

@proplist = $object->get_properties(); $propcount = $object->get_properties();

リスト・コンテキストでは、Caché オブジェクト $objectのプロパティ名を含むリストを返しま

す。スカラ・コンテキストでは、$object のプロパティ数を返します。プライベート・プロパ

ティと多次元プロパティは返されず、Perl バインディングからはアクセスできません。

is_method()

$bool = $object->is_method($name);

$nameが $objectの有効なメソッド名の場合は 1を、それ以外の場合は 0を返します。

is_property()

$bool = $object->is_property($name);

$nameが $objectの有効なプロパティ名の場合は 1 を、それ以外の場合は 0 を返しま

す。

run_obj_method()

$value = $object->run_obj_method($method_name, LIST)

Caché オブジェクト $objectのメソッド $method_nameを実行します。引数は LIST とし

て渡されます。Caché のクラス定義によっては、一部の引数を参照で渡すこともできます。

返り値は、Caché メソッドの返り値と同じです。

set()

$object->set($prop_name, $val)

30                                                                                                           Caché での Perl の使用法

Perl クライアント・クラス・リファレンス

Page 35: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

Caché オブジェクト $object のプロパティ $prop_name を $val に設定します。

3.5 クエリ

Intersys::PERLBIND::Query パッケージのメソッドによって、クエリの作成、パラメータの設定、クエリ

の実行、および結果の取得が可能になります。Queryオブジェクトは、Intersys::PERLBIND::Database

alloc_query() メソッドによって作成されます (詳細は、"データベース" を参照)。Query メソッドの使

用法の詳細は、"クエリの使用法" を参照してください。

以下は、Query のメソッド一覧です。

3.5.1 クエリの作成

prepare()

$query->prepare($string, $sqlcode)

$string の SQL 文字列を使用してクエリを作成します。

prepare_class()

$query->prepare_class($class_name, $query_name, $sqlcode)

クラス定義にクエリを作成します。

3.5.2 パラメータの設定

set_par()

$query->set_par($idx, $val)

パラメータ $idx に値 $val を割り当てます。このメソッドは、同じパラメータに対して複数

回呼び出すことができます。その場合、以前のパラメータ値は失われます。新しい値は別

の型でもかまいません。set_par() メソッドは、パラメータの参照渡しをサポートしていません。

is_par_nullable()

$nullable = $query->is_par_nullable($idx)

パラメータ $idx が NULL 対応の場合は 1 を、そうでない場合は 0 を返します。

is_par_unbound()

$unbound = $query->is_par_unbound($idx)

Caché での Perl の使用法                                                                                                           31

クエリ

Page 36: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

パラメータ $idx が未結合の場合は 1 を、そうでない場合は 0 を返します。

num_pars()

$num = $query->num_pars()

クエリ内のパラメータ数を返します。

par_col_size()

$size = $query->par_col_size($idx)

パラメータ列のサイズを返します。

par_num_dec_digits()

$num = $query->par_num_dec_digits($idx)

パラメータの小数桁数を返します。

par_sql_type()

$type = $query->par_sql_type($idx)

パラメータの SQL 型を返します。

3.5.3 クエリの実行

execute()

$query->execute($sqlcode)

set_par() の呼び出しで定義されているパラメータを使用して、結果セットを生成します。

3.5.4 結果の取得

fetch()

@data_row = $query->fetch($sqlcode)$column_count = scalar($query->fetch($sqlcode))

リスト・コンテキストで実行した場合、このメソッドは結果セットからデータ行を取得し、それを

リストとして返します。取得するデータがない場合は、空のリストが返されます。

スカラ・コンテキストで実行した場合、このメソッドは、1 行の列数を返します。

col_name()

$name = $query->col_name($idx)

32                                                                                                           Caché での Perl の使用法

Perl クライアント・クラス・リファレンス

Page 37: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

列の名前を返します。

col_name_length()

$length = $query->col_name_length($idx)

列名の長さを返します。

col_sql_type()

$sql_type = $query->col_sql_type($idx)

列の SQL 型を返します。

num_cols()

$num_cols = $query->num_cols()

クエリ内の列数を返します。

3.6 時刻と日付

PTIME_STRUCTPtr、PDATE_STRUCTPtr、PTIMESTAMP_STRUCTPtrの各パッケージは、Caché

の %TIME データ型、%DATE データ型、%TIMESTAMPデータ型の操作に使用します。

3.6.1 %TIME

PTIME_STRUCTPtrパッケージのメソッドは、Caché %DATEデータ構造の操作に使用します。時刻

は hh:mm:ss形式で表されます。例えば、午前 0 時 5 分 30 秒過ぎは 00:05:30 と表されます。

以下は、Time のメソッド一覧です。

new()

$time = PTIME_STRUCTPtr->new()

新しい Time オブジェクトを生成します。

get_hour()

$hour = $time->get_hour()

時を返します。

Caché での Perl の使用法                                                                                                           33

時刻と日付

Page 38: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

get_minute()

$minute = $time->get_minute()

分を返します。

get_second()

$second = $time->get_second()

秒を返します。

set_hour()

$time->set_hour($hour)

時を設定します (0 ~ 23 の整数。0 は午前 0 時)。

set_minute()

$time->set_minute($minute)

分を設定します (0 ~ 59 の整数)。

set_second()

$time->set_second($second)

秒を設定します (0 ~ 59 の整数)。

toString()

$stringrep = $time->toString()

時刻を hh:mm:ss 形式の文字列に変換します。

3.6.2 %DATE

PDATE_STRUCTPtr パッケージのメソッドは、Caché %DATE データ構造の操作に使用します。日

付は yyyy-mm-dd 形式で表されます。例えば、2003 年 12 月 24 日は 2003-12-24 と表されま

す。以下は、Date のメソッド一覧です。

new()

$date = PDATE_STRUCTPtr->new()

新しい Date オブジェクトを生成します。

34                                                                                                           Caché での Perl の使用法

Perl クライアント・クラス・リファレンス

Page 39: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

get_year()

$year = $date->get_year()

年を返します。

get_month()

$month = $date->get_month()

月を返します。

get_day()

$day = $date->get_day()

日を返します。

set_year()

$date->set_year($year)

年を設定します (4 桁の整数)。

set_month()

$date->set_month($month)

月を設定します (1 ~ 12 の整数)。

set_day()

$date->set_day($day)

日を設定します (1 ~ 各月の日数までの整数)。

toString()

$stringrep = $date->toString()

日付を yyyy-mm-dd 形式の文字列に変換します。

3.6.3 %TIMESTAMP

PTIMESTAMP_STRUCTPtrパッケージのメソッドは、Caché %TIMESTAMPデータ構造の操作に使

用します。タイムスタンプは、yyyy-mm-dd<space>hh:mm:ss.fffffffff形式で表されます。例

えば、2003 年 12 月 24 日、午前 0 時 5 分 12.5 秒過ぎのタイムスタンプは以下のように表されま

す。

Caché での Perl の使用法                                                                                                           35

時刻と日付

Page 40: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

2003-12-24 00:05:12:500000000

以下は、TimeStamp のメソッド一覧です。

new()

$timestamp = PTIMESTAMP_STRUCTPtr->new()

新しい Timestamp オブジェクトを生成します。

get_year()

$year = $timestamp->get_year()

yyyy 形式で年を返します。

get_month()

$month = $timestamp->get_month()

mm 形式で月を返します。

get_day()

$day = $timestamp->get_day()

dd 形式で日を返します。

get_hour()

$hour = $timestamp->get_hour()

hh 形式で時を返します。

get_minute()

$minute = $timestamp->get_minute()

mm 形式で分を返します。

get_second()

$second = $timestamp->get_second()

ss 形式で秒を返します。

get_fraction()

$fraction = $timestamp->get_fraction()

36                                                                                                           Caché での Perl の使用法

Perl クライアント・クラス・リファレンス

Page 41: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

fffffffff 形式で秒の小数部分を返します。

set_year()

$timestamp->set_year($year)

年を設定します (4 桁の整数)。

set_month()

$timestamp->set_month($month)

月を設定します (1 ~ 12 の整数)。

set_day()

$timestamp->set_day($day)

日を設定します (1 ~ 各月の日数までの整数)。

set_hour()

$timestamp->set_hour($hour)

時を設定します (0 ~ 23 の整数。0 は午前 0 時)。

set_minute()

$timestamp->set_minute($minute)

分を設定します (0 ~ 59 の整数)。

set_second()

$timestamp->set_second($second)

秒を設定します (0 ~ 59 の整数)。

set_fraction()

$timestamp->set_fraction($fraction)

秒の小数部分を設定します (最大 9 桁の整数)。

toString()

$stringrep = $timestamp->toString()

タイムスタンプを yyyy-mm-dd hh:mm:ss.fffffffff 形式の文字列に変換します。

Caché での Perl の使用法                                                                                                           37

時刻と日付

Page 42: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

3.7 ロケールとクライアント・バージョン

Intersys::PERLBIND既定パッケージのメソッドは、Caché バージョン情報と Windows ロケール設定

へのアクセスに使用します。以下は、これらのメソッドの一覧です。

get_client_version()

$clientver = Intersys::PERLBIND::get_client_version();

Perl クライアント・マシン上で実行されている Caché のバージョンを確認します。

setlocale()

$newlocale = Intersys::PERLBIND::setlocale($category, $locale)

既定のロケールを設定し、新しいロケールのロケール文字列を返します。以下はその例で

す。

$newlocale = Intersys::PERLBIND::setlocale(0, "Russian") # 0 stands for LC_ALL

すべてのロケール・カテゴリを Russian に設定し、以下の文字列を返します。

Russian_Russia.1251

$locale 引数が空文字列の場合は、現在の既定のロケール文字列が返されます。例え

ば、以下のコードを指定したとします。

Intersys::PERLBIND::setlocale(0, "English") $mylocale = Intersys::PERLBIND::setlocale(0, ""),"\n";

$mylocale の値は、以下のようになります。

English_United States.1252

有効な $category 値を含む使用法の詳細は、MSDN ライブラリ

(http://www.microsoft.com/japan/msdn/library) で、Visual C++ ランタイム・ライブラリの

setlocale() 関数の説明を参照してください。

set_thread_locale()

Intersys::PERLBIND::set_thread_locale($lcid)

呼び出しスレッドのロケール ID (LCID) を設定します。実行時にロケールとの連係を必要

とするアプリケーションは、このメソッドを呼び出して正しい変換を確保する必要があります。

38                                                                                                           Caché での Perl の使用法

Perl クライアント・クラス・リファレンス

Page 43: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142

有効な LCID 値については、MSDN ライブラリ

(http://www.microsoft.com/japan/msdn/library) にある "ロケール ID (LCID) の一覧" を

参照してください。"LCID 一覧" で検索すると、この一覧が表示されます。現在の場所は

以下のとおりです。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/vsm-

sclcid.asp

ロケール設定の詳細は、MSDN ライブラリで、"National Language Support" の

SetThreadLocale() 関数を参照してください。

Caché での Perl の使用法                                                                                                           39

ロケールとクライアント・バージョン

Page 44: Caché での Perl の使用法 - InterSystems · CachéでのPerlの使用 法 Version5.1 2006-03-14 InterSystemsCorporation 1MemorialDrive CambridgeMA02142