SQL Anywhere には、豊富な SQL 機能があります。それらの機能には、ローごとのトリガー、文ごとのトリガー、INSTEAD OF トリガー、SQL ストアドプロシージャー、ユーザー定義関数、RECURSIVE UNION クエリ、共通テーブル式、テーブル関数、LATERAL 派生テーブル、統合全文検索、Window 集合関数、正規表現検索、XML サポート、マテリアライズドビュー、スナップショットアイソレーション、参照整合性などがあります。この項では、他の SQL データベースソフトウェアとは異なる、SQL Anywhere でサポートされている特定の機能について説明します。
SQL Anywhere には日付、時刻、タイムスタンプのデータ型があり、年、月、日、時、分、秒、小数点以下の秒が含まれます。日付フィールドへの挿入または更新、および日付フィールド間の比較については、フリーフォーマットの日付がサポートされています。
また、日付に関しては以下の演算が可能です。
日付 + 整数 指定された値の日数を日付に加えます。
日付 - 整数 指定された値の日数を日付から引きます。
日付 - 日付 2 つの日付間の日数の差を計算します。
日付 + 時刻 日付と時刻からタイムスタンプを作成します。
SQL Anywhere は、INTERVAL 日付タイプはサポートしていません。これは SQL/2008 標準の SQL 言語機能 F052 です。ただし、SQL Anywhere には、DATEADD などの日付と時刻の演算に使用できる数多くの関数があります。
SQL Anywhere は、CREATE TABLE 文および ALTER TABLE 文の PRIMARY KEY 句と FOREIGN KEY 句によってエンティティ整合性と参照整合性の両方をサポートしています。
PRIMARY KEY [ CLUSTERED ] ( column-name [ ASC | DESC ], ... ) [NOT NULL] FOREIGN KEY [role-name] [(column-name [ ASC | DESC ], ...) ] REFERENCES table-name [(column-name, ...) ] [ MATCH [ UNIQUE | SIMPLE | FULL ] ] [ ON UPDATE [ CASCADE | RESTRICT | SET DEFAULT | SET NULL ] ] [ ON DELETE [ CASCADE | RESTRICT | SET DEFAULT | SET NULL ] ] [ CHECK ON COMMIT ] [ CLUSTERED ]
PRIMARY KEY 句では、テーブルのプライマリキーを宣言します。SQL Anywhere はプライマリキーカラムにユニークなインデックスを作成して、宣言されたプライマリキーがユニークであるよう管理します。このインデックスは、次の 2 つの SQL Anywhere 拡張によってカスタマイズできます。
CLUSTERED CLUSTERED キーワードは、プライマリキーインデックスはクラスタードインデックスであり、したがって、インデックス内の連続したインデックスエントリはテーブルの物理的に隣接するローをポイントすることを示します。
ASC | DESC プライマリキーインデックスの各インデックスカラムのソートの程度 (昇順または降順) をカスタマイズできます。このカスタマイズを使用して、プライマリキーインデックスのソートの程度が、特定の SQL クエリに必要な、そのクエリの文の ORDER BY 句で指定されたソートの程度に一致するようにできます。
FOREIGN KEY 句は、2 つのテーブルの関係を定義します。その関係は、このテーブルのカラムが他のテーブルのプライマリキーの値を保有することによって確立しています。SQL Anywhere は、参照整合性制約を確保するように定義された FOREIGN KEY ごとに自動的にインデックスを構築します。制約のセマンティックおよびこのインデックスの物理特性は、次のようにカスタマイズできます。
CLUSTERED CLUSTERED キーワードは、外部キーインデックスはクラスタードインデックスであり、したがって、インデックス内の連続したインデックスエントリは外部テーブルの物理的に隣接するローをポイントすることを示します。
ASC | DESC 外部キーインデックスの各インデックスカラムのソートの程度 (昇順または降順) をカスタマイズできます。外部キーインデックスのソートの程度は、プライマリキーインデックスのソートの程度と異なる場合があります。ソートの程度のカスタマイズを使用して、外部キーインデックスのソートの程度が、アプリケーションの特定の SQL クエリに必要な、そのクエリの文の ORDER BY 句で指定されたソートの程度に一致するようにできます。
MATCH 句 SQL Anywhere は、MATCH 句をサポートしています。これは SQL/2008 標準の SQL 言語機能 F741 です。また、SQL Anywhere は、MATCH UNIQUE もサポートしています。これは、UNIQUE インデックスを追加する必要なしにプライマリテーブルと外部テーブル間の 1 対 1 の関係を確保します。
SQL Anywhere は、NULL 入力可能のカラムへのユニークインデックス (ユニークセカンダリインデックスとも呼ばれる) の作成をサポートしています。デフォルトで、各インデックスキーはユニークであるか、少なくとも 1 つのカラムで NULL を持つ必要があります。たとえば、2 つのインデックスエントリ ('a'、NULL) と ('a'、NULL) はそれぞれユニークインデックス値と見なされます。SQL Anywhere は、ユニークセカンダリインデックスをサポートしています。このインデックスでは、NULL 値が各ドメインで特別値として扱われます。これは、WITH NULLS NOT DISTINCT 句を使用して行われます。このようなインデックスでは、2 つの値のペア ('a'、NULL) と ('a'、NULL) は重複と見なされます。
SQL Anywhere は、INNER ジョイン、LEFT OUTER ジョイン、RIGHT OUTER ジョイン、FULL OUTER ジョインをサポートしています。明示的ジョイン述部に加えて、SQL Anywhere は、NATURAL ジョインとベンダー拡張 (KEY ジョインとも呼ばれる) をサポートしています。ベンダー拡張では、テーブルの外部キー関係に基づいて暗黙的ジョイン述部を指定します。
SQL Anywhere 内部では、固定長文字列型と可変長文字列型 (CHAR、NCHAR、または BINARY) は区別されません。SQL Anywhere では、後続ブランクは、このような値がデータベースに挿入されるときに文字列タイプからトランケートされません。SQL Anywhere では、NULL 値と空の文字列は区別されます。デフォルトでは、SQL Anywhere データベースは大文字と小文字を区別しない照合を使用して、大文字と小文字を区別しない文字列比較をサポートしています。SQL Anywhere では、固定長文字列タイプにブランクが埋め込まれることはありません。ブランク埋め込みセマンティックは、各文字列比較の実行中にシミュレートされます。これらのセマンティックは、他の SQL ソフトウェアの文字列比較とは微妙に異なる場合があります。
SQL Anywhere は、オプションの SQL 言語機能 T111 を部分的にサポートしています。この機能では、UPDATE 文によってジョインがあるビューを参照できます。また、UPDATE 文と UPDATE WHERE CURRENT OF 文によって、文の SET 句で複数のテーブルを参照できます。さらに、UPDATE 文の FROM 句をジョインおよび派生テーブルを含む任意のテーブル式で構成できます。
SQL Anywhere では、UPDATE、INSERT、MERGE、DELETE の各文を別の SQL 文に派生テーブルとして埋め込むこともできます。このサポートの利点の 1 つは、UPDATE 文によって変更されたローのセットを返すクエリを簡単な方法で構築できることです。
SQL Anywhere では、ストアドプロシージャーの結果セットを文の FROM 句内のテーブルとして参照できます。この機能は、一般にテーブル関数と呼ばれています。テーブル関数は、SQL/2008 標準の SQL 言語機能 T326 です。この標準では、テーブル関数は TABLE キーワードを使用して指定されます。SQL Anywhere では、TABLE キーワードを使用する必要はありません。ストアドプロシージャーは FROM 句で直接参照され、オプションで相関名と結果セットのスキーマの指定がプロシージャーによって返されます。
次の例では、ストアドプロシージャーの結果 ShowCustomerProducts をベーステーブル Products にジョインします。ストアドプロシージャーの参照には、WITH 句を使用して、プロシージャーの結果のスキーマの明示的な宣言が付随しています。
SELECT sp.ident, sp.quantity, Products.name FROM ShowCustomerProducts( 149 ) WITH ( ident INT, description CHAR(20), quantity INT ) sp JOIN Products ON sp.ident = Products.ID |
SQL Anywhere はマテリアライズドビューをサポートしています。これは、SQL クエリから直接的または間接的に参照できる、事前に計算された結果セットです。SQL Anywhere では、CREATE MATERIALIZED VIEW 文を使用して、即時保存ビューと手動保存ビューの両方を作成できます。他のデータベース製品では、異なる語を使用してこの機能を記述する場合があります。
SQL Anywhere は、SQL/2008 標準のオプションの SQL 言語機能 F431 をサポートしています。SQL Anywhere では、明示的に FORWARD ONLY を宣言されないかぎり、すべてのカーソルは双方向にスクロール可能です。アプリケーションでは、FETCH 文によって相対位置または絶対位置を使用するか、ODBC などの他のアプリケーションプログラミングインターフェイスによって同等のものを使用して、カーソルによってスクロールできます。
SQL Anywhere は、value-sensitive カーソルとローメンバーシップ sensitive カーソルをサポートしています。INSENSITIVE、KEYSET-DRIVEN、SENSITIVE カーソルなどの一般的にサポートされているカーソルタイプがサポートされます。Embedded SQL を使用しているときは、カーソル位置は FETCH 文上で自由に移動できます。カーソルは現在位置に対して前後させるか、カーソルの最初または最後からレコード数を指定して移動できます。
デフォルトで、Embedded SQL および SQL プロシージャー、ユーザー定義関数、トリガーのカーソルは更新可能です。これらのカーソルは、FOR UPDATE 句を使用して明示的に更新可能にできます。ただし、FOR UPDATE 句を単独で指定しても、カーソルの結果セットのローに対するロックは取得されません。結果セットのローが他のトランザクションによって変更されないようにするには、次のいずれかを指定します。
FOR UPDATE BY LOCK データベースサーバーは、この句によって、結果セットのフェッチされたローに対する意図的ローロックを取得します。このロックは長期間のロックであり、トランザクションがコミットまたはロールバック されるまで保持されます。
FOR UPDATE BY { VALUES | TIMESTAMP } SQL Anywhere データベースサーバーは、keyset-driven カーソルを利用して、結果セットをスクロールするときにローが変更または削除されたときにアプリケーションへ通知できるようにします。
SQL Anywhere では、クエリの SELECT リスト内のエイリアスの式を、クエリの他の部分で参照できます。他のほとんどの SQL システムと SQL/2008 標準にはこの機能はありません。たとえば、次のような SQL クエリを指定できます。
SELECT column-or-expression AS alias-name FROM table-reference WHERE alias-name = expression |
エイリアスは、SELECT ブロックの任意の場所に使用できます。エイリアスは他の SELECT リスト式にも使用できます。この場合、追加のエイリアスが定義されます。循環的なエイリアスの参照は許可されません。式に指定されたエイリアスが SELECT ブロックのネームスペースにある変数名またはカラム名と同じ場合は、エイリアス定義によってそのカラムまたは変数が遮断されます。ただし、そのような場合は、テーブルによってカラム名を明示的に修飾できます。
SQL Anywhere は、マルチバージョン同時実行性制御 (MVCC) とも呼ばれる、スナップショットアイソレーションをサポートしています。スナップショットアイソレーションをサポートする他の SQL 実装では、書き込み競合、つまり 2 つ以上のトランザクションによる同じローへの同時更新は、COMMIT 時にのみ明らかになります。この場合、通常は最初の COMMIT が優先され、競合に関与するその他のトランザクションはアボートされる必要があります。
SQL Anywhere では、スナップショットトランザクションが ANSI アイソレーションレベルでトランザクション実行と共存できるように、ローへの書き込み操作によってローの書き込みロックが取得されます。このため、SQL Anywhere での書き込み競合ではブロックが発生しますが、正確な動作は BLOCKING と BLOCKING_TIMEOUT の接続オプションによって制御できます。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |