SQLサーバアクセス

上へ

概要:このビルトインセットはSQLサーバへのアクセスメソッドを提供します。これらのビルトインを使用するにはsql.dllをロードする必要があります。ロード法についてはloadModuleを参照してください。

このビルトインセットは大きく分けて2つのアクセス方法を提供しています。1つは、sql:send/4とsql:send/5によるサーバの接続、認証、SQL文発行、データ取得、切断を一括して行う方法です。この方法は、1つのSQL文を実行時間を重要視しないで発行するときに有用です。2つ目は、sql:connect、sql:send/2、sql:get、sql:closeStatment、sql:disconnectを用いて、一連の手続きをユーザが記述する方法です。前者よりも複雑ですが高速な処理が可能です。特に多数のSQL文を連続して発行する場合に有用です。 また、後者の方法は、多くの種類のSQLサーバへの接続に対応しています。

 

述語名/引数 (sql:send *SQL *server *id *pass)
要約 SQLサーバにSQL文を発行します。
互換性 Win
引数 *SQL [in] SQL文を表す文字列。
*server [in] SQLサーバが稼動しているマシン名
*id [in] ユーザ名
*pass [in] パスワード
解説

SQL認証を行う場合は*passに文字列でパスワードを指定します。Windows認証の場合は*passにシンボルtrustを指定します。

以下の例では、新しいテーブルを作成します。

例:

(as (testSQL):(loadModule "sql.dll" *):(sql:send "create table sampletable (id char(10), name text)" "ramin" "domain\\taro" trust))

 

 


述語名/引数 (sql:send *SQL *server *id *pass *typeList *result)
(sql:send *SQL *server *id *pass *result)
要約 SQLサーバにSQL文を発行し、結果を*resultに返します。
互換性 Win
引数 引数は以下の要素を指定します。
*SQL [in] SQL文を表す文字列。
*server [in] SQLサーバが稼動しているマシン名
*id [in] ユーザ名
*pass [in] パスワード
*typeList [in] 結果のカラムごとのデータタイプを表すリスト
*result [out] 結果
解説

SQL認証を行う場合は*passに文字列でパスワードを指定します。Windows認証の場合は*passにシンボルtrustを指定します。

*typeListに指定できるシンボルは以下のとおりです。

SQL_C_CHAR マルチバイトの文字列 char, varchar, text
SQL_C_WCHAR UNICODE(UTF-16)の文字列  nchar, nvarchar, ntext
SQL_C_SSHORT 符号付整数 smallint
SQL_C_USHORT 符号なし整数
SQL_C_SLONG 符号付整数 int 
SQL_C_ULONG 符号なし整数
SQL_C_FLOAT 実数 float
SQL_C_DOUBLE 実数 real
SQL_C_BIT ビット bit
SQL_C_STINYINT 符号付整数 tinyint
SQL_C_UTINYINT 符号なし整数
SQL_C_SBIGINT bigint
SQL_C_UBIGINT
SQL_C_BINARY バイナリ binary, varbinary
SQL_C_BOOKMARK  未サポート
SQL_C_VARBOOKMARK  未サポート
SQL_C_TYPE_DATE
SQL_C_TYPE_TIME
SQL_C_TYPE_TIMESTAMP
SQL_C_NUMERIC 未サポート
SQL_C_GUID

第一形式では得られた結果の各要素を、*typeListに従い型変換します。

第二形式では得たれた結果の各要素を自動的に適当な型に変換します。第二形式では文字列やイメージは8ビットキャラクタ配列として返されます。

以下の例では、select文を発行し、結果を取得します。

例:

(as (test):(loadModule "sql.dll" *)(test2))

(as (test2):(sql:send "select * from mytable" "sqlsvr" "domain\\taro" trust (SQL_C_CHAR SQL_C_CHAR) *)(print *))

 

 


述語名/引数 (sql:setDriver *driver)
要約 ODBCドライバを指定します。
互換性 Win
解説 sql:connect でSQLサーバに接続する前にODBCドライバを指定する必要があります。

*driver に指定する文字列は、OSの管理ツールにある、ODBCデータアドミニストレータのドライバの項目を参照してください。

ODBCドライバはデフォルトで"SQL Server"がセットされています。

例:

(sql:setDriver "MySQL ODBC 3.51 Driver")

(sql:setDriver "SQL Server")

(sql:setDirver "PostgreSQL")

 


述語名/引数 (sql:setDatabase *name)
要約 接続するデータベース名を指定します。
互換性 Win
解説 データベースによってはsql:setDatabaseでデータベース名を指定する必要がある場合があります。

例:

(as (test):
    (sql:setDriver "PostgreSQL")
    (sql:setDatabase "mydb")
    (sql:connect "kanyam" "postgres" "" *h)
    (sql:send *h "select * from test")
    (sql:get *h (SQL_C_SLONG SQL_C_WCHAR SQL_C_WCHAR SQL_C_WCHAR) *result)(print *result)
    (sql:closeStatement *h)
    (sql:disconnect *h))

この例では、Linuxマシンで動くPostgreSQLにWindowsから接続しています。


述語名/引数 (sql:connect *server *id *pass *handle)
要約 SQLサーバに接続します。
互換性 Win
解説 引数は以下の要素を指定します。
*server *SQLサーバが稼動しているマシン名
*id ユーザ名
*pass パスワード

実行が成功すると*handleにSQLサーバを表す整数値が返ります。

SQL認証を行う場合は*passに文字列でパスワードを指定します。Windows認証の場合は*passにシンボルtrustを指定します。

 

例:

(sql:connect "ramin" "mydomain\\taro" trust *h);; Windows認証

(sql:connect "ramin" "mydomain\\taro" "password" *h);; SQL認証

 


述語名/引数 (sql:disconnect *handle)
要約 SQLサーバの接続を切ります。
互換性 Win
解説 *handleにはサーバを表す整数値を指定します。

 

 


述語名/引数 (sql:send *handle *SQL)
要約 *handleが指定するSQLサーバへSQL文を発行します。
互換性 Win
解説 *handleにはサーバを表す整数値を指定します。

 

 


述語名/引数 (sql:get *handle *typeList *result)
(sql:get *handle *result)
要約 直前に実行されたSQL文の結果を取得します。
互換性 Win
引数 *handle [in] サーバを表す整数値を指定します。
*typeList [in] 結果のカラムごとのデータタイプを表すリスト
*result [out] 結果
解説

第一形式では得られた結果の各要素を、*typeListに従い型変換します。

第二形式では得たれた結果の各要素を自動的に適当な型に変換します。第二形式では文字列やイメージは8ビットキャラクタ配列として返されます。

 

 


述語名/引数 (sql:closeStatement *handle)
要約 SQL文を発行した後の状態を保持した領域を開放します。
互換性 Win
解説 *handleにはサーバを表す整数値を指定します。

sql:send/2の実行後必ずこのルールを実行する必要があります。

 

 


SQL発行の例

 

例:

データを10回挿入します。

(as (test):
        (loadModule "sql.dll" *)
        (sql:setDirver "SQL Server")
        (sql:connect "svr" "mydomain\\taro" trust *h)
        (loop *h 0))

(as (loop *h 10):(sql:disconnect *h))
(as (loop *h *n):(add *n 1 *n1)
(sprintf *sql "insert into test values('%d', '今日は')" (*n))
(sql:send *h *SQL)
(sql:closeStatement *h)
(loop *h *n1))

 

例:

select文でデータを取得します。closeStatmemntの使い方に注意してください。

(as (test):
    (loadModule "sql.dll" *)
    (sql:setDirver "SQL Server")
    (sql:connect "svr" "mydomain\\taro" trust *h)
    (sql:send *h "select * from test")
    (sql:get *h (SQL_C_CHAR SQL_C_CHAR) *re)
    (print *re)
    (sql:closeStatement *h)
    (sql:disconnect *h))