Caché へのSQL・アクセス

  Caché にはSQLアクセスというデータベースのアクセス方法が提供されています。
  SQL・アクセスとは、ごく簡単に表現すれば、次のようになります。
  ・SQLコマンドを使ってデータベースをアクセスする方法 (ODBC/JDBCも可能)
  
  SQLアクセスを行う場合、Caché 側ではデータベースをCaché Object アーキテクトを利用してオブジェクト定義する必要があります。 もし、既存のグローバル変数(階層構造)をSQLでアクセスする必要がある場合には、Cache Object アーキテクトを使用して、 対象となるグローバル変数をSQLでアクセスできるように定義(マッピング)する必要があります。既存のグローバル変数をマッピングする方法はこちら。
  
  CachéSQL92の規格に準拠しています。従って、Caché 以外のRDBMSを利用したアプリケーション・システムがSQL92の規格内で作成されている場合 (つまり、使用中のRDBMS独自の拡張構文を利用していない場合)には、アプリケーション・システムのコードを1行も変更せずにデータベースをCaché に変更することが可能です。
  
  しかし、残念ながら、多くの場合アプリケーション・システムのコードを変更する作業を免れることはできません。 一番大きな要因は、各RDBMSで「トランザクション制御(ロック制御を含む)」の実装方法が異なるからです。
  トランザクション制御(ロック制御)は、SQL92の規格書で明確に規定されていることではなく、各RDBMS製品の実装レベルでの問題となってしまうからです。
  
  また、SQL92の規格においては明確な「ロック制御のためのコマンド」が規定されていません。
  CachéSQL92の規格書に従ってSQLコマンドとして「ロック・コマンド」を提供していません。
  
  このことはCachéSQLアクセスだけを利用してトランザクション・システムを構築する場合にはデメリットと感じられるかも知れません。 しかし、CachéSQLアクセスだけを利用して巨大な病院システムが数多く稼動していることから、実質的には、Caché SQLで明示的なロック・コマンドが提供されていないことは問題視されていないと言えます。 (あるいは、ロック制御に関る部分だけ、Cach&eacute Object Script(クラスメソッドも含む)で処理しています。このように、SQLコマンドとCach&eacute Object Script を併用することが可能です。)
  
  Caché では、テーブル(クラス)定義をした時点で、内部的にロック制御のためのコマンド(LOCKコマンド)が組み込まれています。 このLOCKコマンドはタイムアウト値を伴うものですので、デッドロックが発生することも未然に防止しています。
  しかし、実際の業務アプリケーション・システムでは、複数のデータ更新を取りまとめて「トランザクション」として制御し、 トランザクション単位に排他制御をする仕組みが求められます。
  そのような場合には次のようなSQLコマンドを利用して排他制御をする仕組みが利用されています。
  SELECT $$setLOCK^LOCKrtn(ID,NAME) from User.LOCKTABLE where ID='123'
  このSELECTコマンドで指定されている「$$setLOCK^LOCKrtn(ID,NAME)」はCaché Object Script コマンドの呼び出しをしています。 そして、$$setLOCK^LOCKrtn(ID,NAME) ルーティンで、内部的に
   LOCK +^LOCKTABLE.GYOUMU1(ID,NAME)=$H
  といった処理を実行します。
  このようにCaché Object ScriptLOCKコマンドを上手く利用することによって、非常に柔軟な排他制御をアプリケーション・レベルで行うことが可能になります。
  
  なお、Caché SQLでは、1つの大きなSQLコマンドを処理するよりも、複数の小さなSQLコマンドをCaché Object Script で制御しながら処理させる方が 効率的に処理されます。従って、既存のRDBMS 向けのアプリケーション・プログラムが大きなSQLコマンドを発行しているような場合には、そのSQLコマンドを分割する必要があるかもしれません。
  
  Caché では、Caché Object Script を利用することで、SQLコマンドに処理ロジックを付加することができます。 これは、例えばOracleのPL/SQLと同じ考え方です。
  しかし、Caché の最大の特徴は、いつでもグローバル変数を利用できることにあります。つまり、中間データを格納するテーブルをCREATEする必要はありません。 この方法は、非常に高速で、非常に使い勝手の良いものです。グローバル変数の添え字は自動的に昇順に整列する、という特性を上手く利用すると、SORT 処理をする必要もなくなります。
  
  Caché 4.0.3 Caché SQLよりもCaché 4.1Caché SQL の方がより進化しています。 また、今後もSQL 処理に対する各種の内部的な制約事項を取り除いてゆくというアナウンスがされています。

戻る