ザ
ため
ザ
ため
入門
入門
MUMPS
MUMPSユーザーのための
ユーザーのための
Caché
Caché入門
入門
インターシステムズジャパン株式会社 インターシステムズジャパン株式会社 ビジネスディベロップメント ビジネスディベロップメント シニアマネージャーシニアマネージャー 佐藤 佐藤 比呂志比呂志
アジェンダ
アジェンダ
•• MUMPSMUMPSユーザーのユーザーのCachéCaché FAQFAQ C hé
C héととMUMPSMUMPSの言語的相違点の言語的相違点
•• CachéCachéととMUMPSMUMPSの言語的相違点の言語的相違点
•• CachéCachéととMUMPSMUMPSのの機能的相違点機能的相違点
CachéはMUMPSですか?
CachéはMUMPSですか?
•• そうともいえるそうともいえる •• ちがうともいえるちがうともいえる 3CachéがMUMPSなところ
CachéがMUMPSなところ
•• MUMPSMUMPSプログラムがそのまま動作するプログラムがそのまま動作する DSM DSM –– DSMDSM –– MSMMSM –– DTMDTMCachéがMUMPSでないところ
CachéがMUMPSでないところ
•• 言語仕様がモダン言語仕様がモダン •• オブジェクト指向が使えるオブジェクト指向が使える •• SQLSQLが使えるが使える •• 様々な外部インタフェースが用意されている様々な外部インタフェースが用意されている –– JavaJava 5 –– .NET.NET–– Web ServicesWeb Services
–– etcetc
Caché ObjectScriptはMUMPSですか?
Caché ObjectScriptはMUMPSですか?
•• そうともいえるそうともいえる MUMPS MUMPSのシンタックスが使えるのシンタックスが使える –– MUMPSMUMPSのシンタックスが使えるのシンタックスが使える –– MUMPSMUMPSプログラムがそのまま動作するプログラムがそのまま動作する •• そうじゃないともいえるそうじゃないともいえる –– スペースの使用制限がゆるいスペースの使用制限がゆるい –– ほかの言語の様なブロック構造が取れるほかの言語の様なブロック構造が取れるほかの言語の様なブロック構造が取れるほかの言語の様なブロック構造が取れる –– 変数のスコープが他言語に近い変数のスコープが他言語に近い –– 他言語の良い所は積極的に取り入れている他言語の良い所は積極的に取り入れているCaché言語エンジンの構造
Caché言語エンジンの構造
P-Code DSM MSM DTM Caché Object Script Caché Basic 7Caché Virtual Machine P Code
Caché ObjectScriptの大改造
Caché ObjectScriptの大改造
•• 20002000年頃大改造仕様を策定年頃大改造仕様を策定 •• ゴールゴール –– より良いブロック構造の提供より良いブロック構造の提供 –– より良いローカル変数の保護より良いローカル変数の保護 –– フロー制御コマンドの改善フロー制御コマンドの改善 –– 可読性向上のための空白の自由な使用可読性向上のための空白の自由な使用可読性向上のための空白の自由な使用可読性向上のための空白の自由な使用Caché ObjectScriptの大改造
Caché ObjectScriptの大改造
•• プライベート変数とプロシジャプライベート変数とプロシジャ
•• 新しいコマンド新しいコマンド
–– IF ELSEIF ELSE FOR WHILE DO WHILEIF ELSEIF ELSE FOR WHILE DO WHILE
•• 空白の自由な使用空白の自由な使用 •• 複数行に跨がる記述複数行に跨がる記述 9
プロシジャ
プロシジャ
; Admitを呼ぶ前、パブリック変数は: ; a =1,b=2,c=3,d=4 DO Admit(5,.d) Admit(x,y)[a,b,y]{ ;これはプロシジャです ; この時点でプロシジャに見えるのは: ; パブリック変数: a=1,b=2,y=4 ; プライベート変数: x=5 SET c=8,f=9 ; これはプライベート“c” とプライベート “f”の設定 ; 以前に定義した“c” や “f”には触っていないSET a=4 ; これはパブリック “a”の設定
DO sub ; これはプライベートサブルーチンにアクセスする ; このプロシジャの中 DO discharge ; これはパブリックサブルーチン ; 中身は同じルーチン ; 中身は同じル チン QUIT sub ; これはAdmitプロシジャのサブルーチン 変数はそのまま ; Admitプロシジャの中からだけ呼び出すことができる。 ; QUIT
プロシジャ(続き)
プロシジャ(続き)
discharge; Dischargeは同じルーチンのパブリックサブルーチン ; Iパブリック変数は全て参照できますが、プライベート変数は ; “Admit”の変数。 パブリック変数a=4,b=2,y=4が見える ; Admit の変数。 パブリック変数a 4,b 2,y 4が見える ; その他のパブリック変数同様: c=3,d=4 ; 注意:参照呼び出しなので“d”と“y” ; は同じ変数に結びつけられる QUIT 11
Newコマンド
Newコマンド
•• NewNewコマンドで同じことができる?コマンドで同じことができる? Yes Yes –– YesYes –– 変数を忘れずに毎回指定する変数を忘れずに毎回指定する •• 人間とは忘れやすい動物である人間とは忘れやすい動物である–– New (New (a,ba,b))を使えば?を使えば?
コードのフリーフォーマット
コードのフリーフォーマット
•• より見やすいコード記述のためより見やすいコード記述のためMUMPSMUMPS仕様からあえ仕様からあえ て離れる て離れる て離れる て離れる •• いくつかの制限は残るいくつかの制限は残る –– 名前は空白で区切ることはできない名前は空白で区切ることはできない –– リテラル値も空白で区切ることはできないリテラル値も空白で区切ることはできない –– コマンドとその最初の引数の間に1つの空白がコマンドとその最初の引数の間に1つの空白が 13 必要なコマンド 必要なコマンド –– 引数のないコマンドは、2つ以上の空白、または引数のないコマンドは、2つ以上の空白、または 行末が必要 行末が必要 –– 後置条件表現は、括弧で囲まなければ空白で区後置条件表現は、括弧で囲まなければ空白で区 切ることができない 切ることができない継続行とコメント
継続行とコメント
SET abc = x * y / ;これはコメントです (m + n) , ; これもコメントです (m n) , ; これもコメントです def = “hello” SET a=1 ; 従来のコメント SET b=2 // もうひとつのコメント SET c 3 /* 複数行に渡る SET c=3 /* 複数行に渡る 長いコメント です*/継続行(続き)
継続行(続き)
Admit ( id , // idは患者id bed , // bedはベッド番号 bed , // bedは ッド番号 ward ) // wardは棟番号 // 次にパブリック変数を列挙します [ hosp , // hospは病院名 doc ] // docは担当医 public { set x = ^abc( 3,id ) set hosp = $li(x 2)
15
id ) set hosp = $li(x,2) }
IF {}, ELSEIF {}, ELSE {}
IF {}, ELSEIF {}, ELSE {}
IF exprlist { code }
IF exprlist { code } ELSE { code } IF exprlist { code } ELSE { code }
IF exprlist {code } ELSEIF exprlist {code}
IF {}, ELSEIF {}, ELSE {}
IF {}, ELSEIF {}, ELSE {}
if x>3,z<5 { set a=1 do tag set b=2 do tag2 }
do tag2 } else { do tag4 }
IF b=5 {SET a=1} ELSEIF b=6 {SET a=2} ELSEIF b=7 {SET a=3} ELSE {SET a=4} GOTO x
17
FOR {}
FOR {}
FOR { SET x=3 DO tag }
FOR a=1:1:3,5,10 { SET x=3 DO tag } FOR a 1:1:3,5,10 { SET x 3 DO tag }
WHILE and DO … WHILE
WHILE and DO … WHILE
WHILE x>3,y=4 {SET a=5 DO tag} WRITE “done” DO { SET a=5 DO tag
SET x=”yes”}
WHILE y>4,y<10 WRITE “done”
19
コードブロック
{}の一般的なルール
コードブロック
{}の一般的なルール
•• コマンドコンストラクトは、コマンドコンストラクトの始コマンドコンストラクトは、コマンドコンストラクトの始 めからしか入力できない めからしか入力できない めからしか入力できない めからしか入力できない •• コードブロックはコードブロックは{{の所からしか入力できないの所からしか入力できない •• コードブロック内のコードブロック内のGOTOGOTO文は以下の場所にしかブラ文は以下の場所にしかブラ ンチしない ンチしない –– コードブロックの中コードブロックの中例
例
// 例1
IF x>3,y<4 {SET z=1 DO tag^rou} ELSE {SET z=2 DO tag2^rou2} // 例2 IF x>3,y<4 { SET z=1 DO tag^rou } ELSE { 21 } ELSE { SET z=2 DO tag2^rou2 } ; この例は例1と同じ
例(続き)
例(続き)
// 例3IF x>3 { SET a=”” FOR { SET a=$O(abc(a)) QUIT:a=”” SET x=x+abc(a) } SET y=y+x }
// この例ではy=y+xはFORループが完了した後に一度実行 // (そのif文が真と想定して)
// 例4 IF x>3 { IF x>3 {
SET a=”” FOR SET a=$O(abc(a)) QUIT:a=”” SET x=x+abc(a) SET y=y+x
例(続き)
例(続き)
// 例5
F y=1:1:10 { IF abc(y)>0 {S x=x+abc(y)} ELSE {S x=x-abc(y)} F y 1:1:10 { IF abc(y) 0 {S x x abc(y)} ELSE {S x x abc(y)} DO tag } // do tagはforループの一部で毎回繰り返し実 行される // FORループの繰り返し // 例6 23 // 例6 F y=1:1:10 {
IF abc(y)>0 {S x=x+abc(y)} ELSE {S x=x-abc(y)} DO tag
} // このコードは例5と同じ
$CASE
$CASE
•• $SELECT$SELECTをよりシンプルに、より効率的にしたものをよりシンプルに、より効率的にしたもの
SET a = $CASE(x+1*3,3:”A”,6:17+43,9:$H, 1/2:”one-half”, :”default”) DO $CASE(x+1*3, 3:goodsub, 6:bettersub^rou(a,.b), :errorsub)
新しい論理和、論理積演算子
新しい論理和、論理積演算子
$d(^a(3))#10 && ^a(3) $d(^a(3))#10 & ^a(3)
25
パラメータ付タグの暗黙
QUIT
パラメータ付タグの暗黙
QUIT
Start ; WRITE “Hello”,! WRITE Hello ,! ; 暗黙QUITはここ MySub(a) ; WRITE a,! ; 暗黙QUITはここ MyProc() { WRITE “これは私のプロシジャです ” WRITE これは私のプロシジャです。 ; プロシジャの最後にも暗黙QUITあり }CacheTempグローバル
CacheTempグローバル
•• メモリー(グローバルバッファー)が許す限り、ディスメモリー(グローバルバッファー)が許す限り、ディス クに書かない クに書かない クに書かない クに書かない •• システム再起動の際に消えるシステム再起動の際に消える •• ジャーナル対象外ジャーナル対象外 •• 作業用データとして使用することでアプリケーション作業用データとして使用することでアプリケーション 性能向上 性能向上 27 性能向 性能向プロセスプライベートグローバル
プロセスプライベートグローバル
•• ローカル変数の様に使用可能ローカル変数の様に使用可能 ^|A ^|A –– ^|A^|A •• プロセスが終了すると消えるプロセスが終了すると消える •• ローカル変数の様な容量制限がないローカル変数の様な容量制限がない –– データベースサイズの制限のみデータベースサイズの制限のみマクロ
マクロ
#define
#define StringMacroStringMacro "Hello, World!" "Hello, World!" WRITE
WRITE $$$$$$St i MSt i M WRITE
WRITE $$$$$$StringMacroStringMacro #define output1(%
#define output1(%strstr,%,%lf,%indentlf,%indent) do ) do output^%fm2class(%
output^%fm2class(%strstr,%,%lf,%indentlf,%indent,$$$display),$$$display)
29
インクルードファイル
インクルードファイル
•• 以下のマクロ定義を別ファイルとして定義以下のマクロ定義を別ファイルとして定義
/// Create a success %Status code /// Create a success %Status code #define OK
#define OK
/// Return true if the %Status /// Return true if the %Status //// %// %scsc -- %Status code %Status code
##define ISOK(%define ISOK(%scsc)) (+%(+%scsc)) /// Return true if the %Status /// Return true if the %Status //// %// %scsc -- %Status code %Status code
#include文
#include文
#include %
#include %occCacheDirectoccCacheDirect ##include %include %occExtentoccExtent ##include %include %occExtentoccExtent ##include %include %occTransactionoccTransaction ##include %include %occIncludeoccInclude ##include %include %msqlmsql ##include %include %cspIncludecspInclude
31
$LIST
$LIST
•• $PIECE$PIECEの欠点解消の欠点解消 区切り文字を断片文字列内に持てない 区切り文字を断片文字列内に持てない –– 区切り文字を断片文字列内に持てない区切り文字を断片文字列内に持てない –– 長くなると処理時間がかかる長くなると処理時間がかかる$SORTBEGIN,$SORTEND
$SORTBEGIN,$SORTEND
•• ランダム書き込みの性能向上ランダム書き込みの性能向上 インデックス構築など インデックス構築など –– インデックス構築などインデックス構築など 33$ORDER/$QUERY第3引数
••
第第33引数の変数名引数の変数名 – $ORDER(^GlobalData(ref),1,dataRow) – グローバル参照を減らすことができる – 500,000レコードをアクセスするための時間: • “従来の”方法 = 1.20秒 • この方法 = 0.65秒 • - 約2倍!共有ロックシンタックス
••
>>LOCK +^data(id)#"s" – 複数プロセスが同じ共有ロックを取得できる – 共有ロックは、排他ロックをブロックするし、排他 ロックは、共有ロックをブロックする。 – 複数プロセスがそれを使っている間は、データの 変更はできない。 – 排他 (既定)と共有ロックは、独立にカウントされ る。 – 引数なしロックは、両方のタイプをクリアする。可変引数シンタックス
•
可変の引数を受け付ける様にプロシジャは特別なシ ンタックス...を使うことができる•
唯一または最後の引数の後に…をつける。この引数 のタイプは、%ListSQLの使用
SQLの使用
•• 動的動的SQLSQL
SET
SET myquerymyquery = "SELECT TOP 5 = "SELECT TOP 5 Name,Home_CityName,Home_City FROM FROM Sample.PersonSample.Person ORDER BY Age" ORDER BY Age" SET
SET tStatementtStatement = ##class(%= ##class(%SQL.StatementSQL.Statement).%New() ).%New() SET
SET tStatustStatus = = tStatementtStatement.%Prepare(.%Prepare(myquerymyquery) ) SET
SET rsetrset = = tStatementtStatement.%Execute(.%Execute()) DO
DO rsetrset.%Display() WRITE !,"End of data".%Display() WRITE !,"End of data"
37
SQLの使用
SQLの使用
•• 埋め込み埋め込みSQLSQL
&&sqlsql(SELECT COUNT(*) INTO :(SELECT COUNT(*) INTO :myvarmyvar FROM FROM Sample.PersonSample.Person) ) Write
ビット文字列関数
••
$BIT ,$BITCOUNT, $BITFIND, $BITLOGIC$BIT ,$BITCOUNT, $BITFIND, $BITLOGIC– ビット文字列関数は、エンコードされたビットデー タを操作します 通常は ビ ト関数で処理する タを操作します。 通常は、ビット関数で処理する – $BIT関数は、アトミック処理を実施する – $BIT関数は、ビット文字列の内部圧縮を行う。
ビットマップインデックス
– 例
P T bl Person Tableビットマップインデックス
– 論理ビュー
Stateビットマップインデックス
ビットマップインデックス – 論理ビュー
ビットマップインデックス – 複合条件
複数インデックスを使用ビットスライス
– 例
•• 例えば、例えば、 1つのレコードの総請求額が1つのレコードの総請求額が0.830.83とするとする と、 と、 整数となる様、、、整数となる様、数 な 様、数 な 様、8383に調整して、に調整して、 バイナリ値調調 、、バイナリ値ナリ値ナリ値 ‘ ‘1010011’1010011’に分解する、そしてそのレコードは、以に分解する、そしてそのレコードは、以 下の条件のもと、インデックス化する。 下の条件のもと、インデックス化する。 •• 総合計ビット総合計ビット77をセットをセット •• 総合計ビット総合計ビット55をセットをセットビットスライス
– 例
顧客番号 顧客番号33はは $27$27の支払いの支払い((2進数2進数11011)11011) –– 顧客番号顧客番号33は、は、$27$27の支払いの支払い((2進数2進数11011)11011) –– 顧客番号顧客番号44は、は、$17$17の支払いの支払い((2進数2進数10001)10001) 0 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 2) S M l レコード番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ….. 1000万 …. 0 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 ... 0 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0 ... 2) Sex = Male 3) Bill bit 5 4) Bill bit 4 5) Bill bit 3 6) Bill bit 2 7) Bill bit 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 ... 1 0 0 0 1 0 0 1 0 0 0 1 0 1 1 1 …. 1 0 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 ...ビットスライス
– 例
•• 全男性の総合計請求額は?全男性の総合計請求額は? ( d2 AND d3)*16 + ( d2 AND d4)*8 + ( d2 AND d3)*16 + ( d2 AND d4)*8 +–– (cond2 AND cond3)*16 + (cond2 AND cond4)*8 + (cond2 AND cond3)*16 + (cond2 AND cond4)*8 + (cond2 AND cond5)*4 + …
(cond2 AND cond5)*4 + …
0 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 2) S M l レコード番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ….. 1000万 …. 0 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 ... 0 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0 ... 2) Sex = Male 3) Bill bit 5 4) Bill bit 4 5) Bill bit 3 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 ... 1 0 0 0 1 0 0 1 0 0 0 1 0 1 1 1 …. 1 0 1 0 1 0 0 1 0 0 0 1 0 1 1 1
Caché Object
Caché Object
set
set person=##class(person=##class(Sample.PersonSample.Person).%).%OpenIdOpenId(1(1)) write
write person.Nameperson.Name write
write person.Nameperson.Name Van
Van De De Griek,CharlotteGriek,Charlotte M. M. write
write person.FavoriteColors.Countperson.FavoriteColors.Count(()) 1
1 write
write person.FavoriteColors.GetAtperson.FavoriteColors.GetAt(1) (1) Red
Red write
write person SSNperson SSN
47
write
write person.SSNperson.SSN 571 571--1515--24792479
Cachéクラスライブラリー
Cachéクラスライブラリー
•• ファイルインタフェースクラスファイルインタフェースクラス S t fil ## l (%S t fil ## l (%LibLib Fil ChFil Ch t Stt St ) %N () ) %N () Set file=##class(%
Set file=##class(%Library.FileCharacterStreamLibrary.FileCharacterStream).%New() ).%New() Set
Set file.Filenamefile.Filename="c:="c:¥¥sample.txtsample.txt" " Do
Cachéクラスライブラリー(続き)
Cachéクラスライブラリー(続き)
•• SMTPSMTP Set s=##class(%Net.SMTP).%New() Set s.smtpserver=“smtpserver.xxx.com” set auth=##class(%Net.Authenticator).%New() set auth.UserName=“Test” set auth.Password=“Test” set s.authenticator=auth Set m=##class(%Net.MailMessage).%New() Set m.From=$Get(“[email protected]”) 49 Do m.To.Insert(“[email protected]”) Set m.Subject=“Caché Solution Page” Set crlf=$C(13,10)Do m.TextData.Write($ZCVT(“こんにちは","O","JIS")) set status=s.Send(m)
If $$$ISERR(status) Quit $System.Status.GetErrorText(status)
SQLマッピング
SQLマッピング
•• 既存グローバルをテーブル(クラス)として定義し、外既存グローバルをテーブル(クラス)として定義し、外 部から 部からODBCODBC、、JDBCJDBCを通して参照できるを通して参照できる 部から 部からODBCODBC、、JDBCJDBCを通して参照できるを通して参照できる最後にお願い
最後にお願い
•• 新しく作るルーチンは是非新しく作るルーチンは是非CachéCaché ObjectScriptObjectScriptで記述しで記述し ましょう。
ましょう。 ましょう。 ましょう。
–– MUMPSMUMPSととCOSCOSは相互に呼び出し可能は相互に呼び出し可能
•• 是非プロシジャ記述でコードを書きましょう是非プロシジャ記述でコードを書きましょう •• CachéCachéのクラスライブラリーを積極的に利用しましょうのクラスライブラリーを積極的に利用しましょう •• SQLSQLマッピングに挑戦したい人はお知らせくださいマッピングに挑戦したい人はお知らせください 51 •• SQLSQLマッピングに挑戦したい人はお知らせくださいマッピングに挑戦したい人はお知らせください •• できる限り最新バージョンのできる限り最新バージョンのCachéCachéをお使いくださいをお使いください