スクリプトガイド > JMPの拡張 > データベースアクセス
公開日: 09/19/2023

データベースアクセス

この節では、JMPからデータベースにアクセスする方法について説明します。

クエリービルダーで作成したクエリーの実行

「クエリービルダー」を用いると、SQLステートメントを書かずに、データベースのデータを選択し、データを読み込むことができます。データテーブルに読み込む前に、データをプレビューすることもできます。「クエリービルダー」で作成したクエリーは、共有することができ、他のユーザがカスタマイズしたり、実行してりできます。

「クエリービルダー」で作成したクエリーは、JSLスクリプトでも実行できます。スクリプトを開かずに「クエリービルダー」で作成したクエリーを実行するには、Include()を使用します。

query = Include( "$DOCUMENTS/Airline.jmpquery" );
query << Run Foreground( );

クエリーをフォアグラウンドで実行する代わりに、Run Background()を使ってバックグラウンドで実行するか、Run()を使ってクエリーの実行に関する「クエリービルダー」の環境設定を適用することもできます。デフォルトでは、クエリーはバックグラウンドで実行されます。

クエリーで使えるメッセージの詳細については、『スクリプト構文リファレンス』のSQLのメッセージを参照してください。

Open Database関数

JMPではODBCがサポートされています。Open Database関数を使ってJSLでSQLデータベースへアクセスできます。

dt = Open Database(
	"Connect Dialog" | "DSN=...", // データソース
	"sqlStatement" | "dataTableName" | "SQLFILE=...", // SQLステートメント
	Invisible,  //テーブルの読み込み時にそのテーブルを非表示にするオプションのキーワード
	"outputTableName" // 新しいテーブルの名前
);

メモ: データベーステーブル名に$# -+/%()&|;?の文字を使用する場合は、角括弧([])で囲む必要があります。

第1引数には、読み込みたいデータソースを指定します。次のいずれかを指定してください。

"Connect Dialog"を指定すると、Select Data Sourceウィンドウ(Windows)またはChoose DSNウィンドウ(macOS)が表示されます。

"DSN="の後にデータソースの名前、および、接続に必要な情報を指定すると、そのデータソースに接続します。Windowsでは、ODBCデータソース アドミニストレーターの[ユーザー DSN]タブまたは[システム DSN]タブの名前列にデータソース名が表示されます。macOSでは、ODBC ManagerまたはiODBC Driver ManagerにDSNが表示されます。その他の文字列は、ODBCデータソースによって異なります。

たとえば、次のような手順で要約できます。

"DSN=dBASE Files;DBQ=C:/Program Files/SAS/JMP/17/Samples/Import Data;"

第2引数には、次の3つのうちいずれかを2重引用符で囲んで指定します。

1. 実行するSQLステートメント。たとえば次のように、2重引用符で囲んで、SELECTステートメントを指定してください。

"SELECT AGE, SEX, WEIGHT FROM BIGCLASS"

SQLは、データソースがサポートしているSQLに適合していなければなりません。つまり、「Big Class」という名前のテーブルは、「Big」と「Class」の間にスペースがあるため、それを考慮して引用符で囲む必要があります(スペースが許可されている場合)。引用符はデータソースによって異なりますが、通常は、二重引用符の「"」か、一重引用符の「’」および「‘」か、もしくは鉤括弧の「[]」を使います。

2. データテーブルの名前。データテーブル名だけを指定した場合、"SELECT * FROM"というSQLステートメントを実行するのと同じ処理が行われます。たとえば、第2引数を次のように指定すれば、Open Database"SELECT * FROM BIGCLASS"を実行することになります。

"BIGCLASS"

3. "SQLFILE="に続いて、実行するSQLステートメントの書かれたテキストファイルへのパス。たとえば次の引数の場合は、ディレクトリC:¥にあるファイル「mySQLFile.txt」を開き、中に書かれたSQLステートメントを実行します。

"SQLFILE=C:¥mySQLFile.txt"

オプションの引数Invisibleは、非表示のデータテーブルを作成します。なお、非表示のデータテーブルは、明示的に閉じるまでメモリ内にとどまるため、不要になったものは閉じるよう注意してください。非表示のテーブルを閉じるには、Close(dt)を実行します。ここで、dtは、データテーブル参照の変数です。

オプションの引数outputTableNameは、作成される出力テーブルがあれば、その名前を指定します。Open Databaseが必ずデータテーブルを戻すわけではないことに注意してください。戻り値はヌルになることもあります。データテーブルが戻されるかどうかは、実行されるSQLステートメントの種類によります。たとえば、SELECTステートメントはデータテーブルを戻しますが、DROP TABLEステートメントはデータテーブルを戻しません。

JMPのデータテーブルを、JSLを使ってデータベースに保存するには、データテーブルの参照にSave Database( )メッセージを送ります。

dt << Save Database( "connectInfo", "TableName" );

第1引数は、Open Databaseの場合と同様に機能します。一部のデータベースでは、既存のテーブルに置き換えてテーブルを保存することができないので注意してください。そのような場合にデータベース上のテーブルを置換するには、Open Databaseコマンドで、「DROP TABLE」というSQLステートメントを実行して、そのテーブルをあらかじめ削除してください。

Open Database ( "connectinfo", "DROP TABLE TableName" );

メモ: JMP 13以降では、名前にスペースが入っているテーブルや、大文字と小文字が混在しているテーブルでも、データソースがサポートしている限り、保存することができます。スペースは、Apache HiveとApache Hadoop以外のほとんどのデータソースでサポートされています。大文字と小文字が混在している名前は、そのまま使用されますが、SQLではほとんどの場合大文字と小文字の区別がありません。

次のスクリプトは、SQLクエリーでデータベースを開き、それを新しい名前でデータベースに保存し、その後、新しいテーブルを削除します。

dt = Open Database(
	"Connect Dialog",
	"SELECT age, sex, weight FROM \!"Bigclass$\!"",
	"My Big Class"
);
dt << Save Database( "Connect Dialog", "MY_BIG_CLASS" );
Open Database( "Connect Dialog", "DROP TABLE BIGCLASS.MY_BIG_CLASS" );

メモ: ODBCデータベースからデータを読み込む際、ユーザIDとパスワード情報を含んだテーブル変数が追加される可能性があります。これを防ぐためには、pref(ODBC Hide Connection String(1))によって環境設定を設定します。または、[ファイル]メニュー(Windows)または[JMP]メニュー(macOS)を選択し、[環境設定]>[テーブル][ODBC接続文字列を非表示にする]を選択します。『JMPの使用法』のデータテーブルの環境設定を参照してください。

データベース接続の確立とSQLの実行

以下の関数を使用すると、データベースに対して、より複雑な処理を行えます。

db = Create Database Connection( "パスワードを使用した接続文字列" );
Execute SQL( db, "SQL statement", <invisible>, <"New Table Title"> );
Close Database Connection( db );

これら3つの関数を使用すれば、接続を開き、Execute SQLを数回呼び出した後、接続を閉じることができます。Create Database Connectionは、Execute SQLClose Database Connectionで使用できるハンドルを戻します。

送信されたSQL文によって、データベースのテーブルから、JMPのデータテーブルが作成される場合と、作成されない場合があります。「SELECT」は通常、JMPのデータテーブルを作成します。しかし、「INSERT INTO」は、データベース内のテーブルを変更するものなので、JMPのデータテーブルは作成されません。

次のプログラムは、データベースへの接続を開きます。

dbc = Create Database Connection(
	"DSN=dBASE Files;DBQ=$SAMPLE_IMPORT_DATA/;"
);

次のプログラムは、上記の接続を使って、SQLステートメントを実行します。

dt = Execute SQL( dbc,
	"SELECT HEIGHT, WEIGHT FROM Bigclass", "NewTable"
);

次のプログラムは、処理が完了したら、ODBC接続を閉じます。

Close Database Connection( dbc );

テーブルを選択しないで、データベース接続だけを確立したほうがよい場合もあるかもしれません。スクリプトにより、すでに確立されている接続を使用してDatabase Openウィンドウを開くことが可能です。このようなスクリプトは暗号化しておくことをお勧めします。以下はその例です。

dbc = Create Database Connection(
	"DSN=dBASE Files;DBQ=$SAMPLE_IMPORT_DATA/;UID=MyDatabase;pwd=MyPassword");
Main Menu( " Open Table" );

メモ: 接続文字列を引数に指定してExecute SQL()を実行した場合、作成されたデータテーブルの中に可読なテキストのパスワードが含まれてしまいます。それを避けるために、「クエリービルダー」でSQLクエリーを作成し、そのクエリーをJSLで実行する方法を推奨します。そうすると、パスワードがデータテーブルに含まれません。

より詳細な情報が必要な場合や、質問があるときは、JMPユーザーコミュニティで答えを見つけましょう (community.jmp.com).