#この文章の目的
InterSystems IRIS Platformの中で使用される、オブジェクト指向データベース言語であるObjectScriptの文法書(リンク集)として役立つことを目的としています。C++、Java、VB.NETなど、オブジェクト指向言語に親しまれた方が「このように翻訳すればいいのか」と理解する助けになれば幸いです。
#####ObjectScript スタートアップ:(手早くコードを試す方法)
※テスト的に打ち込む画面:コンソール
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GTER_intro
#####素早くできる、ターミナルを使ったコマンドの基本的な試し方:
ターミナルにコマンドを直接打ち込む例 WRITE "Hello, IRIS! From Terminal",!
,!
は、文字列の後ろで改行する、の意味(\nやvbCrLfと同じ)
ルーチンファイルの作り方:Studio->新規作成->ObjectScriptルーチンから(下図参照)
※コマンド行先頭は、必ずスペースを1文字以上入れる
ルーチンを名前を付けて保存(ここではHelloCache.MAC
とした)
ネームスペースの変更 ZNSPACE
、文字列は""で囲む 例:ZNSPACE "MYUSER"
(デフォルトではUSER
になっている)
ルーチンの実行はDO
コマンド、ルーチン名に^
をつける例:DO ^HelloCache
(.MACは不要)
実行画面
ルーチン(関数)として記述する方法
関数名は、スペースを「空けず」に(赤文字)記述する
ターミナルからは、関数名^ルーチン名
と記述する 例:DO HelloCache^HelloCache2
#####ObjectScriptクラスの作成方法はこれをご覧ください
https://qiita.com/torisan_/items/226c319249e5d4fdc79e
Classを作成した場合(ビルド→コンパイルをしてから使う)
ターミナルからUser.HelloCacheTestクラス内の関数を呼び出した例
DO ##class(User.HelloCacheTest).HelloCache()
#####OODBの根幹である基礎概念:Table:Field = Class:Property
####(私がOODB概念全体を通じて最も重要であると考えているモデル説明の箇所)
参考:
IRIS Data Platform 2018.2 Japaneseドキュメントポータルの位置
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls
インターシステムズ・プログラミング・ツールの索引
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=ITECHREF
###Hello, IRIS!(プロシージャ型)
HelloIRIS() Public
{
WRITE "Hello, IRIS!"
}
###Hello, IRIS!(ClassMethod型)
Class User.Main.ClassA Extends %Persistent
ClassMethod HelloIRIS() PUBLIC
{
WRITE "Hello, IRIS!"
}
}
#オブジェクト指向言語としての文法解説
##3.1.変数記述の基本
宣言(#dim)、大文字小文字の区別(ないものとあるものがあるが、基本的にはあるように記述すべき)
Class User.Main.ClassA Extends %Persistent
{
//%Persistentはデータベースへの永続的な保存ができるクラス
Property fielda As %Numeric; //テーブルにfielda列が生成される、という意味でもある
Property fieldb As %String;
ClassMethod Func1() As %Integer
{
#dim i As %Integer //変数とデータ型の記載の仕方
i = 3
QUIT i //戻り値、Rerutn i;と同じ
}
}
スペース記法(先頭を1文字空ける、字下げ記法)
###データ型
#####「一般的なデータ型クラス」
(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_proplit_available_cls
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_proplit#GOBJ_proplit_available_cls
#####数字型(%Numericなど)
整数型 %Integer
固定小数点型 %Decimal
固定小数点型 %Numeric
浮動小数点型(単精度) %Float
浮動小数点型(倍精度) %Double
小さい整数値 %SmallInt
#####文字型(%String, "")
文字列 %String
検索可能な文字列 %Text
ODBCクエリ用文字列 %EnumString
EXACTの照合が行える文字列 %ExactString
#####LIST型($LIST(list,position, end))
#dim lst
#dim sublist
Set lst = $LISTBUILD("ao","aka","ki","midori")
Set subList = $LIST(lst,2,4) //"aka","ki","midori"が引き継がれる
Write $LIST(sublist,2) //表示に"ki"が出る
#####文字列操作演算(文字列結合(_)、代入、抽出、比較、切り出し、フィルタリング)リスト型(%List)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_strings
$LENGTH(str as %String)
文字列の長さを返す
$JUSTIFY(str as %String, num as %Integer)
numだけ左にスペースを入れたstrを返す
$ZCONVERT(str as %String,convertType as %String)
strをconvertTypeの形式へ変換
$FIND(str as %String, findstr as %String)
str中にfindstrが含まれるか調べ、findstrの次の文字の位置を返す
#####Variant型(特に宣言をしない場合)
#dim vari
#####定数(Const)
Parameter MYPARAMETER = "ABC" ; //コンパイルで確定、変更不能
#####四則演算子(+-*/、代入、AND OR、剰余、べき乗、計算規則、桁指定)
※「必ず左から右に演算される」ことに注意(乗除が加減よりも優先されない)
.
オブジェクトのプロパティあるいはメソッドへのアクセス
()
配列インデックスあるいは関数の引数呼び出し
+
加算 (2項)、正値 (単項)
–
減算 (2項)、負値 (単項)
*
乗算
/
除算
\
整数除算
**
べき乗
#
剰余
_
連結
'
論理補数 (NOT)
=
等価テスト、代入
'=
非等価テスト
>
より大きい
'>
<=
より大きくない (より小さい、あるいは等しい)
<
より小さい
'<
>=
より小さくない (より大きい、あるいは等しい)
[
包含
]
追従
]]
前後関係
&
&&
論理 AND (&& は AND の“簡易版”)
!
||
論理 OR (|| は OR の“簡易版”)
@
間接演算
?
パターン・マッチ
「演算子と式」
(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_operators
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_operators
(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_intro#GCOS_intro_expressions
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_intro#GCOS_intro_expressions
記号についてのリファレンス(この項目はサンプルコードでの説明が必須)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_symbols
配列記法
(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GBAS_arrays
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GORIENT_ch_cos#GORIENT_C82567
数字型と文字列型の相互変換
コメントの書き方(//, ///など)
//
これ以降の行末までコメント
;
これ以降の行末までコメント
/**/
複数行にわたるコメント
///
クラス定義の説明に自動登録されるコメント
(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_regexp#GCOS_regexp_comments
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_syntax_comments_int
##3.2.関数記述の基本
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_intro#GCOS_intro_functions
ルーチンファイル記法
「呼び出し可能なユーザ定義コードモジュール」
(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_usercode
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_usercode
#####Method型
クラスインスタンスを必要とする関数
#####ClassMethod型
クラスインスタンスを必要としない関数
#####ストアドプロシージャ
元々「ストアドプロシージャ」という言葉は、データベースの中で特定の処理をまとめて行うために記述される関数を指す用語である
ストアドプロシージャの名前は、各ドメインで一意になるように指定すること
https://ja.wikipedia.org/wiki/ストアドプロシージャ
ClassMethod myfunc(dummy As %String) As %String [ SqlProc ]
[SqlProc]がポイント
Class User.Main.MyClassA Extends %Persistent
{
ClassMethod CallMyName()
{
Do ..MyName() //自分のクラス内のClassMethodを呼ぶ際には..で"Me"と同じ指定をする
}
ClassMethod MyName()
{
Write "Called from User.Main.MyClassA",!
}
}
#####Do記法
$CLASSMETHOD(classname, methodname, Arg1, Arg2, Arg3, ... )
methodnameを%Stringで決定できるので、ポリモーフィングに使用できる
Do $CLASSMETHOD(User.Main.MyClassA,MyName) //戻り値が不要な場合
#####Set記法
#dim res //Variant型に相当
Set res = $CLASSMETHOD(User.Main.MyClassA,MyName) //戻り値が不要な場合
・引数(値渡し、参照渡し、デフォルト)
・戻り値(QUIT)
#####関数一覧
システム関数(=内部関数)
$name(parameters)
宣言なしに使える、デフォルト値のある引数は省略可で、省略する引数の位置で,
をつける
(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS
##3.3.繰り返し記法
#####Do-While文型
#dim x
SET x=1
DO {
WRITE !,"Loop Continue",x
SET x=x+1
} WHILE x<10
WRITE !,"Loop Done"
#####For文型
(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GBAS_statements#GBAS_statements_for
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_cfor
初期値、増分、終了値での記述の仕方(間を:
で区切る)
#dim a
#dim b
#dim c
SET a=1,b=1,c=8
FOR i=a:b:c {
WRITE !,"count is ",i
}
条件でBreakする形の記述
#dim x
SET x=8
FOR { WRITE "Running loop x=",x,!
SET x=x-1
QUIT:x=3
}
WRITE "Next command after FOR code block"
##3.4.条件分岐
#####If文
#dim y
IF y=1 { WRITE "y is 1" }
ELSE { WRITE "y is not 1" }
#####While文
#####Case文
#dim daynum as %Integer
set daynum = 1
WRITE $CASE(daynum,
1:"Monday",2:"Tuesday",3:"Wednesday",
4:"Thursday",5:"Friday",
6:"Saturday",0:"Sunday",:"entry error") //Mondayが出力される
(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GBAS_statements#GBAS_statements_if
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_cif
##3.5.入出力関数
ファイル入出力
ObjectScriptルーチン内に記述したイメージ
(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=ITECHREF_file
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=ITECHREF_file
#####%Fileクラス、Open、Write、WriteLine
#dim file
Set file=##class(%File).%New("C:\data\datafile.txt")
Write file.Size
Do file.Open("WSN")
Do file.WriteLine("This is a line of text")
#####%Stream.FileCharacterクラス
#####Read、ReadLine、Write、WriteLine
#dim stream //%Stream.FileCharacterインスタンスのための宣言
#dim i
#dim intId
#dim extId
#dim numSentS
#dim sc //ステータスを戻す際の例文によく使われる変数名
Set stream=##class(%Stream.FileCharacter).%New() //ファイルインスタンスを生成
Set sc=stream.LinkToFile("c:\data\NLPAndSourceIdCompare.txt") //出力用ファイルを指定して開く
FOR i=srccnt:-1:1 {
IF $DATA(result(i)) {
SET intId = $LISTGET(result(i),1) // sourceid
SET extId = $LISTGET(result(i),2)
SET numSentS = ##class(%iKnow.Queries.SentenceAPI).GetCountBySource(domId,result(i))
Set sc = stream.WriteLine(intId_","_extId_","_numSentS) //ファイルの書き込み
}
}
Set sc = stream.%Save() //ファイルの保存
#####%CSVクラス
#####標準出力(コンソール出力)
##3.6.構造体(クラス)
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GORIENT_ch_class
#####クラス記述 Class
##class(MyApp.MyClass)
のように記述する
#####文法(ドット記法)
##class(MyApp.MyClass).PropertyName
のように、ドットで記述する
#####永続型(%Persistent)
基本となるデータ型には、ディスクストレージにデータを永続的に保存する%Persistent
と、%Serial
(クラス内にデータを埋め込む)、%Regisitered
(通常のプログラムのように、メモリ上にのみ存在し、保存されないもの)の区別がある
#####ObjectScriptルーチン
#####ラベル(ルーチン内関数名に相当)
##3.7.ObjectScriptクラス文法
上記に記載
#####Publicキーワード
#####Privateキーワード
#####Propertyキーワード(;記法に注意)
#####Methodキーワード
#####ClassMethodキーワード
#####Class Referenceの活用の仕方
##3.8.データベース入出力
テキストファイル(csvなど)をIRIS DBにインポートする手法
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GSQL_impexp#GSQL_impexp_import
#####%New関数
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GORIENT_object_object_features
Set obj = ##class(MyApp.MyClass).%New()
#####データエントリーの仕方
Set obj.MyValue = 10 //Propertyをドット記法で呼び出せる
#####%Save関数
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_persobj_saving
Set sc = obj.%Save() //データベースの%Persistentに永続的に保存する
#####データ参照の仕方
#####%OpenId関数
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_persobj#GOBJ_C80065
#####IDを指定して開く方法
Set person = ##class(Sample.Person).%OpenId(10) //DB上の"1レコード"がpersonに渡されると考える(DBはロックされる)
#####データを検索して開く方法(SQL文法)
テーブルとクラスの命名変換規則
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GSQL_tables
WRITE $SYSTEM.SQL.DefaultSchema()
自分自身のSQLスキーマを取得する方法
※唯一の特殊例として、Userネームスペースの場合、SQLUser
に自動変換されてしまう点は必ず言及する
#####ResultSetの使い方
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_queries_using
#####フィールド数、フィールド名の取得の仕方
#4 オブジェクト指向データベースの解説
#####Management Portalからのテーブル参照の方法
#####基礎概念:Table:Field = Class:Property
###(私がOODB概念全体を通じて最も重要であると考えているモデル説明の箇所)
##イベントードリブン記述
ObjectScriptクラス内に、Trigger
サブルーチンを記述することで、そのクラス(テーブル)に変更が生じた際の処理を追加できる
Trigger UpdateTrigger [ Event = UPDATE, Time = AFTER ]
{
//必要な処理を記述する
}
Event =
の後ろのキーワード例
DELETE
— SQL DELETE 操作の間に起動
INSERT
— SQL INSERT 操作の間に起動
UPDATE
— SQL UPDATE 操作の間に起動
INSERT/UPDATE
— SQL INSERT 操作または SQL UPDATE 操作の間に起動
INSERT/DELETE
— SQL の挿入操作または削除操作の間に起動
UPDATE/DELETE
— SQL の更新操作または削除操作の間に起動
INSERT/UPDATE/DELETE
— SQL INSERT 操作、SQL UPDATE 操作、または SQL DELETE 操作の間に起動
Time =
の後ろのキーワード例
BEFORE
— イベントの前に起動(デフォルト)
AFTER
— イベントの後に起動
######トリガ定義について
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=ROBJ_classdef_trigger
######ビジネスサービスの直接呼出しについて
https://docs.intersystems.com/ens20172j/csp/docbook/DocBook.UI.Page.cls?KEY=EGDV_adv#EGDV_busservice_invoke
#####Set-Get記法
#####継承
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_classes#GOBJ_classes_inheritance
#####多重継承
#####複数クラスの継承
#####オーバーロード(サポートされていない、クラス内で複数の引数記述を可能にする方法、実態としては、Option引数の設定で行っている)
#####オーバーライド
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_propmethods
#####ポリモーフィズム記法
#5 データベースアクセスの方式
※GUIから簡単にSQLコマンドを試してみる方法
IRISアイコン→Management Portal -> ([システム・エクスプローラ] → [SQL])を開き、SQL文を書いて[クエリ実行] を押す
#####1..NET ObjectBinding形式(クラスライブラリ、クラスオブジェクトとして)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GBMP_proxy
#####2.ODBC形式(InterSYstems.Data.IRISClientによる、IRISCommand、IRISParameterとIRISDataReaderの組み合わせ、SQL書式として)
Class User.Main.ClassA Extends %Persistent
{
Property fielda as %Numeric;
Property fielda as %String;
}
これを呼び出すSQLコマンドは
SELECT fielda, fieldb FROM User_Main.ClassA //User.Main -> User_Mainになっていることに注意
.NETから呼び出す場合は
Sub SubA()
Public conn As IRISConnection
Public command As IRISCommand
Public reader As IRISDataReader
conn = New IRISConnection
conn.ConnectionString = "Server=localhost; Port=51773; " + "Namespace = TESTSAMPLES; " + "Password = yourpass; " + "User ID = yourid;"
conn.Open() 'IRIS DBに接続
Public iRISConnectStr As String
str = "SELECT fielda, fieldb FROM User_Main.ClassA"
command = New IRISCommand(str, conn)
command.CommandType = CommandType.Text 'テキスト記述でSQLを渡す方法
reader = command.ExecuteReader()
reader.Read()
'以下処理を追加
End Sub
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=BSQG_prog
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=BSQG_odbc#BSQG_C10219
#####3.ActiveX形式(←初心者、Excelユーザには最も便利な形式)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=BLAX_parts#BLAX_parts_openobj
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=BLAX_api
https://qiita.com/torisan_/items/226c319249e5d4fdc79e
#####Dynamic Binding方式
#####C++バインディング
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=ITECHREF_cpp#ITECHREF_C109028
#5 応用編1
#####1.JSON形式での入出力方法
https://docs.intersystems.com/ens20171j/csp/docbook/DocBook.UI.Page.cls?KEY=GJSON
https://qiita.com/torisan_/items/9725c62d1ae7b3877519
#####2.REST形式での入出力
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GREST
#####3.eXTreme形式での入出力
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=BXNT
https://qiita.com/torisan_/items/9725c62d1ae7b3877519
#####4.FHIRインターフェースの組み方
https://www.intersystems.com/jp/learn-play/#FHIR
#####5.ExcelからActiveXを使ってアクセスする方法(Cache'系のみ)
https://qiita.com/torisan_/items/226c319249e5d4fdc79e
##NLP API
NLP=Natural Language Processing(自然言語解析)
https://docs.intersystems.com/iris20181j/csp/documatic/%25CSP.Documatic.cls?APP=1&LIBRARY=%25SYS&CLASSNAME=%25SYSTEM.iKnow
####5.マルチモデル
#####C++ Binding
C++ -> ObjectScript
ObjectScript -> C++
#####Java Binding
Java -> ObjectScript
Java ゲートウェイの作成(Javaコードと、ObjectScriptでのプロキシクラスを作成し、接続する方法について)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=AFL_javagateway
ObjectScript -> Java
#####Python Binding
Python -> ObjectScript
ObjectScript -> Python
#####.NET Binding
.NET -> ObjectScript
ObjectScript -> .NET
ObjectScript側にプロキシクラスを作成し、プロキシクラスを通じてdllを操作する
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=AFL_dotnetgateway
set gwyConn = ##class(%Net.Remote.Gateway).%New()
set status = gwyConn.%AddToCurrentClassPath(classpath)
set status = gwyConn.%Import("Person",,,,1)
set status = gwyConn.%Disconnect()
ADO Binding
ADO.NET は Microsoft .NET Framework によるデータ・アクセス・テクノロジ
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=AFL_adonet
#6 IRISディベロッパーコミュニティの活用
https://openexchange.intersystems.com/index.html#!/