Caché SQL に関するよく
ある質問
Version 5.1
2006-03-14
Caché SQL に関するよくある質問 Caché Version 5.1 2006-03-14 Copyright © 2006 InterSystems Corporation. All rights reserved.
このドキュメントは、 Sun Microsystems、RenderX Inc.、 アドビ システムズ および ワールドワイド・ウェブ・コンソーシアム (www.w3c.org)のツールと情報を使用して、 Adobe Portable Document Format (PDF)で作成およびフォーマットされました。 主要ドキュメント開発ツールは、InterSystemsが構築したCaché と Javaを使用した特別目的のXML処理アプリケーションで す。
Caché 製品とロゴは InterSystems Corporation の登録商標です。
Ensemble 製品とロゴは InterSystems Corporation の登録商標です。
InterSystems という名前とロゴは InterSystems Corporation の登録商標です
このドキュメントは、インターシステムズ社(住所:One Memorial Drive, Cambridge, MA 02142)あるいはその子会社が所有す る企業秘密および秘密情報を含んでおり、インターシステムズ社の製品を稼動および維持するためにのみ提供される。こ の発行物のいかなる部分も他の目的のために使用してはならない。また、インターシステムズ社の書面による事前の同意 がない限り、本発行物を、いかなる形式、いかなる手段で、その全てまたは一部を、再発行、複製、開示、送付、検索可能 なシステムへの保存、あるいは人またはコンピュータ言語への翻訳はしてはならない。 かかるプログラムと関連ドキュメントについて書かれているインターシステムズ社の標準ライセンス契約に記載されている 範囲を除き、ここに記載された本ドキュメントとソフトウェアプルグラムの複製、使用、廃棄は禁じられている。インターシス テムズ社は、ソフトウェアライセンス契約に記載されている事項以外にかかるソフトウェアプログラムに関する説明と保証を するものではない。さらに、かかるソフトウェアに関する、あるいはかかるソフトウェアの使用から起こるいかなる損失、損害 に対するインターシステムズ社の責任は、ソフトウェアライセンス契約にある事項に制限される。 前述は、そのコンピュータソフトウェアの使用およびそれによって起こるインターシステムズ社の責任の範囲、制限に関する 一般的な概略である。完全な参照情報は、インターシステムズ社の標準ライセンス契約に記され、そのコピーは要望によっ て入手することができる。 インターシステムズ社は、本ドキュメントにある誤りに対する責任を放棄する。また、インターシステムズ社は、独自の裁量 にて事前通知なしに、本ドキュメントに記載された製品および実行に対する代替と変更を行う権利を有する。
Caché および InterSystems Caché、Caché SQL、 Caché ObjectScript および Caché Object は、インターシステムズ社の 商標です。 ここで使われている他の全てのブランドまたは製品名は、各社および各組織の商標または登録商標です。 インターシステムズ社の製品に関するサポートやご質問は、以下にお問い合わせください: InterSystems ワールドワイド カスタマサポート +1 617 621-0700 Tel: +1 617 374-9391 Fax: [email protected] Email:
目次
Caché SQL に関するよくある質問
... 1
一般的な質問
... 1
Caché SQL に関するよくある質問
一般的な質問
読み取り専用のクラスやテーブルを作成するには、どのようにすればいいでしょうか?
ユーザがテーブルを編集する必要がない場合、抽象クラスとしてクラスをマークすることができます。
そうすれば、そのクラスは読み取り専用としてコンパイルされます。
一部のユーザがテーブルを編集し、すべてのユーザがテーブルから読み取ることができるようにす
る場合は、以下を実行します。
GRANT SELECT ON * TO PUBLIC.
これは、新規のテーブルを作成するたびに実行する必要があります。
一部のユーザが、すべてのテーブルに読み取りアクセスが必要な場合は、以下を実行します。
GRANT SELECT ON * TO Select_Role
次にアクセスが必要なユーザに対して、GRANT を使用して Select_Role を与えます。これは、新規
のテーブルを作成するたびに実行する必要があります。
常に新規のテーブルが作成されている場合、この GRANT コードをストアド・プロシージャなどに入
れると、呼び出しが簡単になります。自動的にテーブルを作成しているユーザは、そのテーブルの
すべての権限を持つことに注意してください。
Caché SQL に関するよくある質問 1現在、以下のように MS SQL Server から Caché にストアド・プロシージャを移植する作業を行っ
ています (以下のコードは簡素化しています)。
CREATE PROCEDURE UpdateName @LastName varchar(35), @FirstName varchar(25), @NewKey int OUTPUT AS
INSERT INTO NameTable (LastName, FirstName) VALUES @LastName, @FirstName
SELECT @NewKey = @@Identity
この例が SQL Server で自動増分列を使用しているのと同じ方法で、独自の ID 列を使用したい
のですが、挿入後に ID 列の値を抽出する方法がわかりません。また、出力パラメータの設定方
法も教えてください。
DDL Create Procedure 文などを使用して、行うことができます。
CREATE PROCEDURE UpdateName(
INOUT pHandle %SQLProcContext, LastName VARCHAR(35),
FirstName VARCHAR(25), OUT NewKey INT)
LANGUAGE COS {
Set NewKey=""
&sql(INSERT INTO NameTable (LastName, FirstName) VALUES :LastName, :FirstName)
// %ROWID special variable contains the value of the ID column created If 'SQLCODE Set NewKey=%ROWID
If $Get(pHandle)'=$$$NULLOREF Set pHandle.SQLCode=SQLCODE,pHandle.RowCount=%ROWCOUNT QUIT } 2 Caché SQL に関するよくある質問 一般的な質問
顧客と注文の間に、親子リレーションシップを設定しています。 最新の注文と注文合計を見たい
ので、以下のクエリを使用しました。
SELECT ID, Name, MAX(Order->Date), SUM(Order->TotalAmount) FROM Sales.Customer
Date と TotalAmount は、(子の) Order テーブルの列です。これでほぼ正しく作動し適切な値が
取得できますが、1 人の顧客が複数の注文をした場合でも、1 つの注文ごとに別の顧客とみなし
てしまいます。顧客 1 人あたりの Max (最大値) や Sum (合計値) を得るには、どうすればよいで
しょうか?
あなたは実質的に親テーブルと子テーブルを結合し、SQL への Caché 拡張機能を使用して、結合
に基づいたクエリ処理を行っているので、ご使用のクエリはあなたが要求した通りの結果を返してい
ます (-> 構文を使用しないとしても、標準 SQL ではこのクエリは不正です)。あなたは顧客ごとの最
新の注文と合計数を要求していますが、このクエリでは実際には正しい答えを返すことができませ
ん。このクエリが返す結果は、最新の注文とすべての顧客に対する合計であり、これが顧客の注文
ごとに繰り返されます。あなたが得ようとするデータを求めるには、以下のようにいくつか方法があり
ます。
SELECT ID, Name, MAX(Order->Date), SUM(Order->TotalAmount) FROM Sales.Customer
GROUP BY Customer.ID
標準 SQL を使用すると、以下のようになります。
SELECT P.ID, P.Name, (SELECT MAX(C.Date) FROM Sales.Order AS C WHERE C.CustomerID = P.ID), (SELECT SUM(C.TotalAmount) FROM Sales.Order AS C WHERE C.CustomerID = P.ID) FROM Sales.Customer AS P
以下も使用できます (これも標準 SQL を使用しています)。
SELECT ID, Name, MAX(Order.Date), SUM(Order.TotalAmount) FROM Sales.Customer, Sales.Order WHERE customer.id = Order.CustomerID GROUP BY Customer.ID
Caché SQL に関するよくある質問 3 一般的な質問