Caché SQL に関するよく ある質問 Version 5.1 2006-03-14 InterSystems Corporation 1 Memorial Drive Cambridge MA 02142 www.intersystems.com
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 ワールドワイドカスタマサポート Tel: +1 617 621-0700 Fax: +1 617 374-9391 Email: support@intersystems.com
目次 Caché SQL に関するよくある質問... 1 一般的な質問... 1 Caché SQL に関するよくある質問 iii
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