218

dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

Embed Size (px)

Citation preview

Page 1: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect
Page 2: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

はじめに

このたびは、dbMAGICをお買い上げいただき、まことにありがとうございます。

dbMAGICは、システム開発の専門的なユーザ( システムアナリスト、システム設計者、プログラマーの方々など)を対

象とした、データベースアプリケーション開発のためのツールです。

この「dbMAGIC Ver.8.2 SQLガイド」では、dbMAGICでの SQL系データベースアプリケーション開発について説明し

ています。dbMAGICをご使用になる時にお手元に置いてご活用ください。

1999年 2月 5日 マジックソフトウェア・ジャパン株式会社

ご注意

(1) 本マニュアルの内容の一部または全部を無断で転載することは固くお断りします。

(2) 本マニュアルの内容は、将来予告なしに変更することがあります。

(3) 本マニュアルの内容については万全を期して作成しましたが、万一誤り、お気付きの点などがございました

ら、ご連絡くださいますようお願い致します。

(4) 運用した結果の影響につきましては、(3)項にかかわらず責任を負いかねますのでご了承ください。

Windowsおよび WindowsNTは、米国Microsoft Corporationの登録商標です。

Javaは、米国 Sun Microsystems,Inc.の商標です。

dbMAGICはマジックソフトウェア・ジャパン株式会社の商標です。

一般に会社名、製品名は会社の商標または登録商標です。

Copyright 1999

ii SQLガイド

dbMAGIC Ver.8.2

Page 3: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

目次

第 1章 概要 1–1

1.1 対象読者 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 1–2

1.2 本ガイドの構成 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 1–2

1.3 本ガイドで得られる知識 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 1–3

1.4 例 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 1–3

1.5 SQLの構造と特徴 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :1–3

1.6 データベースアプリケーション開発の基本 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 1–7

1.7 SQLデータベース管理者 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :1–8

第 2章 データ型 2–1

2.1 ANSI/ISOのデータ型 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :2–2

2.2 拡張データ型 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 2–2

2.3 データ型と制限 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 2–3

2.4 データ型の相違 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 2–3

2.5 定数 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 2–4

2.6 RDBMSの主要データ型 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :2–5

2.7 まとめ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 2–5

第 3章 データベースへの接続 3–1

3.1 SQLサーバとデータベース : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :3–2

3.2 SQLユーザインタフェース : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :3–2

3.3 接続文字列 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 3–3

第 4章 データベースオブジェクトの作成 4–1

4.1 データベースの作成 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 4–2

4.2 データベースのパラメータの変更 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 4–2

4.3 データ定義言語(DDL) : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 4–2

4.4 ビュー : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 4–4

第 5章 カラムの取得とソート 5–1

5.1 テーブルのすべてのカラムの取得 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 5–2

5.2 テーブルのカラムを指定して取り出し : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 5–3

5.3 重複行の取り出しのカット : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 5–4

5.4 結果のソート - ORDER BY句 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 5–5

第 6章 行の選択 - WHERE句 6–1

6.1 WHERE句による行の選択 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 6–2

第 7章 高度な SELECTステートメント 7–1

7.1 式 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 7–2

7.2 複数のテーブルに対するクエリ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 7–4

7.3 グループ関数 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 7–5

SQLガイド

dbMAGIC Ver.8.2

iii

Page 4: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

7.4 GROUP BY句 -グループ化して結果を出力 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 7–6

7.5 HAVING句 -グループ検索条件 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :7–7

7.6 ネストされた SELECTステートメント : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 7–9

7.7 データ変換 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :7–10

7.8 SQLでのプログラミング : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :7–11

第 8章 データの変更—挿入、削除、更新 8–1

8.1 INSERT : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :8–2

8.2 DELETE : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 8–3

8.3 UPDATE : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 8–4

第 9章 データの整合性 9–1

9.1 データの整合性を維持するための制約 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 9–2

9.2 参照整合性 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 9–2

9.3 データベースで使用できる制約 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 9–3

9.4 ストアドプロシージャとトリガ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 9–3

第 10章 トランザクション 10–1

10.1トランザクションのメカニズム : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :10–2

10.2 分離レベル : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :10–3

10.3 ロックレベル : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :10–4

10.4 ロックの実行 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :10–5

10.5 ロック有効時間 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :10–5

第 11章 システムテーブルとセキュリティ 11–1

11.1 システムテーブル : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :11–2

11.2 システムテーブルと機能 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :11–2

11.3 システムテーブルの使用方法 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :11–3

11.4 MS-SQL Serverのシステムプロシージャ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :11–4

11.5 セキュリティ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :11–4

11.6 オペレーティングシステムのユーザ名 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :11–5

11.7 システム権限の付与と取消 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :11–5

第 12章 オプティマイザ 12–1

12.1 オプティマイザの動作の仕組み : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :12–2

12.2 アクセスパス : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :12–2

12.3 統計情報の更新 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :12–3

12.4 オプティマイザで使われるアクセスパスの指定 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :12–4

12.5 オプティマイザの動作とアクセスパスのチェック : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :12–4

12.6 例 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :12–6

第 13章 dbMAGICと SQL 13–1

13.1 何故 SQLを使用するのか? : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :13–2

13.2 dbMAGICの SQLサポート機能 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :13–2

13.3 dbMAGICと SQLの用語 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :13–3

13.4データベースゲートウェイの命名規則 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :13–3

13.5 dbMAGICと API、そのバージョン : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :13–4

13.6 dbMAGICのリポジトリと機能 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :13–4

iv SQLガイド

dbMAGIC Ver.8.2

Page 5: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第 14章 クライアント/サーバアーキテクチャ 14–1

14.1 dbMAGICのクライアント/サーバアーキテクチャ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :14–2

14.2 RDBMSの(オープン)クライアント/サーバアーキテクチャ : : : : : : : : : : : : : : : : : : : : : : : : :14–3

14.3 異種クライアント/サーバ環境の例 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :14–4

14.4 いつ何を使うか : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :14–4

第 15章 RDBMS環境の設定 15–1

15.1 RDBMS環境変数の設定 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :15–2

15.2データベースへの接続 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :15–2

15.3データベースアクセス権限の付与 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :15–3

第 16章 dbMAGIC環境の設定と定義 16–1

16.1 SQL用MAGICゲートウェイ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :16–2

16.2[設定/動作環境]ダイアログ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :16–4

16.3[設定/ DBMS]テーブル : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :16–4

16.4[設定/データベース]テーブル : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :16–6

16.5 マルチデータベース : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :16–10

第 17章 dbMAGICのリポジトリ 17–1

17.1[テーブル]リポジトリ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :17–2

17.2[カラム]テーブルと[カラム特性]ダイアログ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :17–5

17.3[インデックス]テーブルと[インデックス特性]ダイアログボックス : : : : : : : : : : : : : : : : : : :17–8

17.4 定義取得 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :17–10

17.5 テーブルの修正 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :17–13

第 18章 データ型の割当 18–1

18.1 dbMAGICのデフォルトのデータ型の割当 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :18–2

18.2 テーブル定義取得と割当 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :18–2

18.3 SQLのデータ型の強制指定 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :18–3

18.4 日付型と時刻型の割当 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :18–4

18.5 Oracle: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :18–6

18.6 Microsoft SQL Server : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :18–7

18.7 ODBC : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :18–8

18.8データ定義規則 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :18–9

第 19章 dbMAGICと SQLの動作 19–1

19.1 一意性の識別 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–2

19.2 ユニークインデックスとノンユニークインデックス : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–3

19.3 dbMAGICプログラムの例 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–4

19.4 通常のリンク([リンク]コマンド) : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–4

19.5 リンクジョイン([結合リンク]コマンド) : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–5

19.6 範囲 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–8

19.7 SQL WHERE句 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–8

19.8 片方向と双方向 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–11

19.9 インクリメンタルサーチ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–12

19.10RDBMSでのソート : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–12

19.11ソートに使われるセグメントの指定 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–12

19.12ソート実行時の動作 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–12

19.13ソート処理を行うときの注意 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–13

SQLガイド

dbMAGIC Ver.8.2

v

Page 6: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第 20章 プログラムのデバッグ 20–1

20.1 dbMAGICゲートウェイのログ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :20–2

20.2 RDBMSのツール : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :20–3

20.3 dbMAGICプロファイラ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :20–3

20.4 フローモニタ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :20–3

第 21章 ロックとトランザクション 21–1

21.1 マルチユーザに関するパラメータ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–2

21.2 アクセスモードと共有モード : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–2

21.3 dbMAGICのロック方式 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–3

21.4トランザクションレベル : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–5

21.5 エラー復旧 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–7

21.6 タスクまたはプログラムのコール時のロック : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–8

21.7 物理ロックと論理ロック : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–8

21.8 分離レベルとオプティマイザのヒント : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–10

21.9 ROLLBACK関数 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–10

21.10INTRANS関数 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–11

第 22章 埋め込み SQL 22–1

22.1 埋め込み SQLの使用 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :22–2

22.2 埋め込み SQLの構成要素 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :22–4

22.3 SELECTステートメントの動作 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :22–7

22.4 埋め込み SQLを使用する際の制限 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :22–8

22.5 エラーハンドリング : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :22–9

第 23章 dbMAGICと SQLによるパフォーマンス 23–1

23.1 インデックスの定義と使用方法 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :23–2

23.2 範囲の定義 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :23–4

23.3トランザクション : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :23–5

23.4 ソート : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :23–5

23.5 埋め込み SQL : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :23–6

23.6ビュー : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :23–6

23.7 ストアドプロシージャとトリガ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :23–7

23.8 クライアント/サーバ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :23–7

第 24章 dbMAGICバージョン 8への移行と移植 24–1

24.1 dbMAGICバージョン 8の新機能 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 24–2

24.2 dbMAGIC 6、7から dbMAGIC 8への移行 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :24–2

24.3 ISAM→ RDBMS : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :24–3

24.4 RDBMS→ ISAM : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :24–5

24.5 RDBMS←→ RDBMS : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :24–5

24.6 同じアプリケーションを RDBMSと ISAMで使用する場合 : : : : : : : : : : : : : : : : : : : : : : : : : :24–5

第 25章 技術情報 25–1

25.1[SQLコマンド]ダイアログ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :25–2

25.2 一般的な技術事項 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :25–3

25.3 Oracle: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :25–4

25.4 MS-SQL Server: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :25–6

25.5 ODBC : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :25–9

vi SQLガイド

dbMAGIC Ver.8.2

Page 7: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

25.6 旧バージョンと dbMAGICバージョン 8でのフラグの扱い : : : : : : : : : : : : : : : : : : : : : : : : : :25–10

付録 A SQLコマンドの基本構文 A–1

A.1 基本構文 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : A–2

付録 B データベースのデータの例 B–1

B.1 製品 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : B–2

B.2 仕入先 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : B–2

B.3 在庫 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : B–2

B.4 営業所 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : B–2

B.5 部門 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : B–2

B.6 社員情報 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : B–3

SQLガイド

dbMAGIC Ver.8.2

vii

Page 8: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

機種別キー操作の違い

本マニュアルで使用している特殊キーの表記と実際使用しているコンピュータのキーの表記とは若干異なる場合があり

ます。下記の一覧表を参照してください。

表記 PC-9801 DOS/V� �

F1� �

–� �

F10� �

f�1 – f�10 F1 – F10� �

Caps Lock� �

CAPS Caps Lock� �

Shift� �

SHIFT Shift� �

Ctrl� �

CTRL Ctrl� �

PgUp� �

ROOL UP PageUp� �

PgDn� �

ROOL DOWN PageDown� �

Ins� �

INS Insert� �

Del� �

DEL Delete� �

Back Space� �

BS Back Space� �

Tab� �

TAB Tab� �

� �

,� �

Enter� �

� �

� �

Enter� �

Alt� �

GRP Alt� �

Home� �

HOME CLR Home� �

End� �

HELP End

viii SQLガイド

dbMAGIC Ver.8.2

Page 9: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第1章 概要章目次

1.1 対象読者 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 1–2

1.2 本ガイドの構成 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 1–2

1.3 本ガイドで得られる知識 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 1–3

1.4 例 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 1–3

1.5 SQLの構造と特徴 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 1–3

1.6 データベースアプリケーション開発の基本 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 1–71.7 SQLデータベース管理者 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 1–8

Page 10: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第1章 概要

dbMAGICを使用することで、SQL系のリレーショナルデータベースアプリケーションの作成が可能になり

ます。この「SQLガイド」では、その方法を説明します。また、dbMAGICと SQLとの間のインタフェース

のほか、システムの設定、最適化に関する技術情報も紹介しております。

dbMAGICを使用することで、移植可能な高性能の SQLデータベースアプリケーションを作成することがで

きます。そういったアプリケーションの開発や保守を行う場合、このガイドを参照してください。現在、3GL

や 4GL、SQL用の第 4世代ツールも多く出荷され、移植可能で高性能の SQLデータベースアプリケーショ

ンの作成も便利になっています。

dbMAGICは、各種の SQLデータベースに対応しています。ただし、dbMAGICと SQLデータベースとのイ

ンタフェースは、データベースの種類によって多少異なります。対応している SQLデータベースのうち、こ

のガイドでは、Oracle、MS-SQLの 2種類のデータベースについて解説しております。使用するデータベー

スに応じて、該当のセクションを参照してください。いずれのセクションでも、dbMAGICとデータベース

環境とのインタフェースについて触れられています。

dbMAGICはオープンなシステムです。このため、各種のオペレーティングシステムやファイル管理システ

ム、リレーショナルデータベース管理システム(RDBMS)に対応したアプリケーションの開発が可能です。

1.1 対象読者

この「SQLガイド」は技術マニュアルで、読者として相応の知識のある dbMAGIC開発者を想定しています。

また、SQL系データベースもインストールされており、その操作にも習熟していることが必要です。SQLと

RDBMSについても理解していることが条件になります。

1.2 本ガイドの構成

「SQLガイド」は、2部構成になっています。

第 1章から第 12章までが前半部分で、ここでは SQLの言語や特徴、技術情報について紹介しております。

具体的には、次のような内容になっています。

■ SQLの概要の紹介

■ SELECT文の使用方法

■ データベース構造

■ データの更新

■ トランザクション

■ RDBMSのメカニズム(セキュリティ、オプティマイザ)

第 13章から 25章までが後半部分で、ここでは、dbMAGICと SQLとの間のインタフェースについて解説し

ております。内容は、次の通りです。

■ SQLを使った場合のメリットとデメリット

■ 問題が発生したときの対策

1–2 概要 SQLガイド

dbMAGIC Ver.8.2

Page 11: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

11.3 本ガイドで得られる知識

このガイドでは、次のような事項について知識が得られます。

■ SQLデータ操作言語(DML)とデータ定義言語(DDL)の基本が身に付きます。

■ 既存の ISAM対応の dbMAGICアプリケーションを SQL対応の dbMAGICアプリケーションに変換で

きるようになります。

■ SQLを使用してファイルを操作する場合のメリットとデメリットが理解できます。

■ 種類の異なるファイルマネージャを使用して必要な処理を行うことができるようになります。

■ オプティマイザに関する基本知識が得られます。

■ データベースアクセスツールの使い方が理解できます。

1.4 例

このガイドでは、随所に例を紹介しております。例で使用しているデータは、付録 Bに一覧で掲載しており

ます。

1.5 SQLの構造と特徴

SQLは、構造化照会言語(Structured Query Language)の略語です。SQLを使うことで、データベースに格

納されているデータを取り出したり操作したりすることができます。SQLは、リレーショナルデータベース

と呼ばれるデータベースであれば、どんなデータベースにも対応しています。リレーショナルデータベース

では、テーブルとテーブルを相互に関連付けることができ、こういったテーブルにデータを組織立てて格納

できます。一方、テーブルとテーブルを関連付けデータベースをフラットファイルデータベースと呼んでお

り、この種のデータベースでは、関連のないファイルにデータが置かれることになります。

データベースの管理が可能なコンピュータプログラムを、データベース管理システム(DBMS)と呼んでき

ます。また、リレーショナルデータベースの管理が行えるプログラムは、リレーショナルデータベース管理

システム(RDBMS)と呼ばれます。

SQLエンジン

SQLは、いわば、エンドユーザ(およびアプリケーションプログラム)とデータベースの間に位置します。

つまり、SQLを使用してデータベースのデータを取り出したい場合、エンドユーザは、SQLを介してデー

タベースにリクエストを送ることになります。リクエストには、データの取り出しのほか、データベースの

データの更新や変更、定義といったリクエストもありますが、いずれも SQLエンジンによって処理されま

す。この場合、リクエストは SQLエンジンにより検証が行われ、その後、データベースに送られます。ま

た、SQLエンジンには、リクエストの最適化の機能もあります。

SQLのリクエストが RDBMSに送られると、そのリクエストで指定されているデータが取り出され、エンド

ユーザに送られます。この処理をデータベースクエリなどと呼んでおり、また、この機能から構造化照会言

語という名前が付けられています。なお、SQLは、単なるクエリツールではなく、RDBMSに搭載されてい

る機能の制御もすべて可能になっています。

SQLガイド

dbMAGIC Ver.8.2

1.3本ガイドで得られる知識 1–3

Page 12: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

SQLで操作できるDBMSの機能

データ定義

SQLを使用して、データ構造を定義することができます。また、データとデータとの関係も定義できます。

データの取り出し

SQLを使うことで、データベースに格納されているデータをアプリケーション上で取り出すことができます。

データの操作

SQLを使うことで、データベースに格納されているデータをアプリケーション上で操作できます。操作とし

ては、新規のデータの追加、既存のデータの削除、既存のデータの変更が可能です。

アクセス制御

ユーザに権利を付与することで、データに対するユーザのアクセスを制限できます。権利には、表示(読込)

専用と修正可能の 2つがあります。

データの共有

SQLはマルチユーザシステムで、そのため複数のユーザからの同時アクセスが可能です。

データの整合性

SQLでは、整合性制約を定義でき、この定義はデータベースに格納されます。この定義により、データ操作

の種類にかかわらず、また、処理が SQL対話型処理であろうと、アプリケーションプログラムによる処理で

あろうと、データの破壊を防止することができます。

データの整合性は、また、トランザクションを使用して維持することもできます。このトランザクションは、

SET TRANSACTION、COMMIT、ROLLBACKなどの制御ステートメントを使用して定義できます。

SQL言語には、全部で 13種類のステートメントが用意されています。

以下は、その一覧です。ステートメントはいずれも、データベースに対して何らかの処理を行うように要求

する機能を持っています。こういった要求としては、たとえば、新規テーブルの作成、データの取り出し、

新規データの挿入などがあります。

1–4 概要 SQLガイド

dbMAGIC Ver.8.2

Page 13: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

1SQLステートメント 内容

データ操作

SELECT このステートメントを使用して、データベースに格納されているデータを取り

出すことができます。

INSERT このステートメントを使用して、データベースに新規の行(レコード)を追加す

ることができます。

DELETE このステートメントを使用して、データベースに格納されている(レコード)を

削除できます。

UPDATE データベースに格納されている既存のデータを変更できます。

データ定義

CREATE TABLE データベースに新規のテーブルを追加できます。

DROP TABLE* データベースのテーブルを削除できます。

ALTER TABLE* 既存のテーブルの構造を変更できます。

CREATE VIEW 新規のビューをデータベースに追加できます。

DROP VIEW* データベースに定義されているビューを削除できます。

CREATE INDEX* カラムにインデックスを定義できます。

DROP INDEX* カラムのインデックスを削除できます。

CREATE SYNONYM* テーブル名にエイリアスを定義できます。

DROP SYNONYM* テーブル名に定義されているエイリアスを削除できます。

COMMENT* テーブルまたはカラムにコメントを定義できます。

LABEL* テーブルまたはカラムにタイトルを定義できます。

アクセス制御

GRANT ユーザに対してアクセス権限を付与できます。

REVOKE ユーザのアクセス権限を削除できます。

トランザクション制御

COMMIT 現在のトランザクションを終了(コミット)できます。

ROLLBACK 現在のトランザクションを取り消すことができます。

プログラミング関連

DECLARE クエリに使うカーソルを定義できます。

EXPLAIN* クエリのデータアクセスプランの定義に使います。

OPEN カーソルをオープンして、クエリの結果を取り出すときに使います。

FETCH クエリの結果のうち、その 1つの行を取り出せます。

CLOSE カーソルを閉じるときに使います。

PREPARE* SQLステートメントの動的実行を行う場合、その準備に使います。

EXECUTE* SQLステートメントの動的実行が可能です。

DESCRIBE* プリペアドクエリの定義に使用できます。*

* このステートメントは ANSI/ISOの標準ステートメントではありませんが、主要 SQL製品には用意されていることが少なくありま

せん。

上記の SQLステートメントの基本的な構文は同じです。つまり、それぞれ、動詞と単一もしくは複数の句で

構成されます。また、それぞれ、独自の機能があります。

SQLガイド

dbMAGIC Ver.8.2

1.5 SQLの構造と特徴 1–5

Page 14: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

リレーショナルデータベースと SQLの基本要素

テーブル

テーブルは 2次元の表で、表のセルそれぞれにデータが格納されます。RDBMSの場合、テーブルは一意の

名前で識別されます。また、ISAMファイルシステムでは、テーブルとファイルの内容を比較することができ

ます。テーブルでは、データは、カラム(列またはフィールド)と行(レコード)を使用して配置されます。

テーブルの行にはデータが横方向に並びますが、この 1行分のデータをレコードといいます。行を構成する

データの種類と数は、同一のテーブルですべて同じです。SQLステートメントは、テーブルの単一の行また

は複数の行に対して機能します。なお、ISAMファイルマネージャの場合、ステートメントで処理できるの

は 1行に限られます。

カラム

テーブルの行は、複数のカラム(列、フィールド)で構成されています。ISAMファイルマネージャでは、カ

ラムはフィールドと呼ばれます。テーブルでは、特定のカラムに置かれるデータはすべて、その属性(デー

タ型)とサイズが同じです。たとえば、顧客のデータが格納されているテーブルの場合、テーブルは、顧客

番号のカラム(6桁の数値の列)、顧客名(30桁の文字列の列)などの列で構成されます。

NULL値

テーブルのデータのうち、格納されるべきデータが見つからなかったときや、データが認識不可能だったと

き、そのデータは NULL になります。SQLデータベースではすべて、NULL 値がサポートされています。ま

た、ISAMでも、NULL 値は空白とは区別されます。NULL は、値が不明であることを示しており、NULL

値には特別な扱いが必要です。たとえば、数値カラムに対して数値計算を行うとき、そのカラムに単一もし

くは複数の NULL 値が入っていた場合、計算結果は、NULLとなります。また、テーブルのレコードのうち、

文字列カラムの値が空白のレコードをすべて取り出すとします。ここで、その文字列カラムのいずれかの行

の値が空白ではなく、NULL 値のときには、取り出される文字列カラムの値が空白のレコードだけです。値

が NULL 値のレコードは取り出されません。

ビュー

ビューは、仮想データベースオブジェクトです。データは物理的には内部構造体(テーブルまたはファイル)

に格納されますが、そういったデータを論理的に取り出して仮想テーブルとして表示できます。これをビュー

と呼んでおり、このビューは、データを見るのに便利です。

ビューには、複数のテーブルのデータを抽出して表示することもできます。ビューの定義は、SELECTステー

トメントで行うことができ、その機能を持った SELECTステートメントは名前を付けて保存しておくこと

もできます。したがって、ビューは、特殊な SELECTステートメントとも考えられますが、通常は、実際の

データのないテーブルと考えた方がいいようです。これは、ビューは一般にテーブルとして扱うことが多く、

カラムも SELECTステートメントで作成したカラムが表示されるためです。

カーソル

カーソルは、SQLステートメントを指すシンボルです。言い換えれば、SQLステートメントがカーソルの

本体ということになります。カーソルをオープンすると、カーソルの本体(SQLステートメント)が実行さ

れ、結果セットが生成されます。アプリケーションでは、カーソルを使用してデータを取り出すことができ

ます。この場合、データは、結果セットの行を 1つずつフェッチするという方法で取り出します。

1–6 概要 SQLガイド

dbMAGIC Ver.8.2

Page 15: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

11.6 データベースアプリケーション開発の基本

データベースアプリケーションは、通常、2つの言語を使用して開発を行います。2つの言語とは、データ定

義言語(DDL)とデータ操作言語(DML)をいいます。これは、開発ツールが言語ベースであるかどうか、

手続き型であるかどうか、また、オブジェクト指向であるかどうかとは無関係です。

■ SQLデータ定義言語(DDL) … データの定義を行うときに使う言語をいいます。

■ SQLデータ操作言語(DML)… データの取り出しに関する処理を行うときに使う言語です。複数のレ

コードをグループ化して取り出すこともできますし、レコードを 1つ

ずつ取り出すこともできます。また、取り出したデータを操作するこ

とも可能です。

SQLデータ定義言語(DDL)

DDLは、データベーステーブルの構造の定義や変更のための処理コマンドの集合で、たとえば、CREATE

TABLEや ALTER TABLEは、この DDLのコマンドです。DDLのコマンドとしては、このほか、CREATE

VIEWなど、テーブルに対して細かい操作を行えるものもあります。CREATE VIEWでは、実際のテーブル

のウィンドウ(ビュー)を作成することができます。

SQLデータ操作言語(DML)

DML は、データの変更に関する処理コマンドの集合です。DDLのコマンドではテーブルの構造の定義と変

更が可能なのに対して、DML のコマンドでは、テーブルに格納されているデータについて操作を行うこと

ができます。たとえば、DML のコマンドを使用して、データベースのデータを照会したり更新したりできま

す。SQLの場合、DML のコマンドの構文は、一般に簡単で全体的にも統一されています。

注意:� �

このガイドでは例を示して説明していますが、例では、変数はカッコでくくっています。実際に SQLス

テートメントを入力するときには、このカッコの部分を実際の変数に置き換えてください。� �

データベースの照会

データベースのデータは、仮想テーブルの形で返ります。この仮想テーブルは、複数の行で構成されます。

また、行は照会(DML のコマンド)の条件にしたがって並べられます。指定する条件は各コマンドで異な

り、次のようになります。

■ SELECT … カラム(列)のリストを指定します。

■ FROM … テーブルのリストを指定します。ここで指定したテーブルから、データが取り出される

ことになります。

■ WHERE … どういったデータを取り出すか、その条件を指定します。指定した条件に合致するデー

タ(レコード)が選択されます。

■ GROUP BY … カラムのリストを指定します。指定したカラムをもとに、内容が似ている行がグループ

化され、そのグループが 1行で出力されます(サマリークエリとも言います)。

■ HAVING … 条件を指定します。 GROUP BYで出力されたグループのうち、この条件に合致するグ

ループだけがクエリの結果として出力されます。

■ ORDER BY … カラムのリストを指定します。ここで指定したカラムを基準にして、クエリの結果が

ソートされます。ORDER BYを使わないときには、結果はソートされません。

SQLガイド

dbMAGIC Ver.8.2

1.6データベースアプリケーション開発の基本 1–7

Page 16: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

データベースの更新

リレーショナルデータベースでは、一度に 1つのテーブルに対してだけデータの更新が可能です。データの

更新には、次のコマンドを使います。

■ INSERT INTO … テーブルに単一もしくは複数の行(レコード)を追加できます。

■ UPDATE … テーブルのデータを変更できます。

■ SET … カラム設定ステートメントです。更新対象のカラムを指定できます。また、更新の

方法を指定することもできます。

■ WHERE … 条件のリストです。更新対象となる行(レコード)を限定できます。

■ DELETE FROM … テーブルの行(レコード)を削除できます。

■ WHERE … 条件のリストです。削除対象となる行(レコード)を限定できます。

1.7 SQLデータベース管理者

データベースでは、物理ディスクへのデータベースのインストール、ファイルのバックアップや復旧、シス

テムへのアクセスの管理といった作業が必要になりますが、こういった作業を担当するのがデータベース管

理者です。そのほか、要望に応じて、データの提供をオプティマイズ(最適化)するのもデータベース管理

者の仕事になります。

データのオプティマイズには、インデックスを使うのも有効です。データベースのデータは、インデックス

なしでも表示したり取り出したりできますが、インデックスを使うことで処理が高速になります。インデッ

クスは、通常、開発段階で設定されますが、インデックスの最終的な設定や調整はデータベース管理者が行

います。

データベース管理者には、一般に RDBMSに関して非常に詳しい知識が必要になります。また、データベー

スの設計変更は、データベース管理者にだけ許されます。一方、ISAMデータベースの場合には、それほど

厳しい条件はなく、ファイルの作成と変更ができるユーザであれば、システムマネージャを務めることがで

きます。

1–8 概要 SQLガイド

dbMAGIC Ver.8.2

Page 17: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第2章 データ型章目次2.1 ANSI/ISOのデータ型 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 2–2

2.2 拡張データ型 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 2–2

2.3 データ型と制限 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 2–3

2.4 データ型の相違 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 2–3

2.5 定数 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 2–4

2.6 RDBMSの主要データ型 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 2–5

2.7 まとめ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 2–5

Page 18: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第2章 データ型

ANSI/ISOの SQL標準規格では、各種のデータ型が定義されています、データは、こういったデータ型を使

用して SQLデータベースに格納でき、また、SQL言語で操作できます。ただし、SQL標準規格で定義されて

いるデータ型は最低限のもので、出荷されている SQL製品では、ほとんどの場合、このほかにも各種のデー

タ型が用意されています。また、似たようなデータ型が提供されていることもあります。以下、ANSI/ISOの

SQL標準規格で定められているデータ型を照会します。

2.1 ANSI/ISOのデータ型

■ 固定長文字列 … テキストデータの場合、このデータ型で格納します。たとえば、個人や企業の名前、

住所、摘要などは、このデータ型を使います。

■ 整数 … 数、量、年齢などは、このデータ型を使います。たとえば、顧客番号、社員番号、受

注番号などの識別番号は、このデータ型で格納します。

■ 小数 … 小数があり、正確に計算しなければならない数値は、このデータ型を使います。たと

えば、率、パーセント、通貨などには、このデータ型を使います。

■ 浮動小数点数値… 重量や距離など、数値が大きく、計算はおおよそでいい場合、このデータ型にしま

す。通常、小数数値より桁数が多く、四捨五入もそれほど正確でなくてもかまわない

場合、このデータ型を使います。

データ型 内容

CHAR (長さ) 固定長文字列

CHARACTER (長さ)

INTEGER 整数

INT

SMALLINT スモール整数

NUMERIC (precision,scale) 小数

DECIMAL (precision,scale)

DEC (precision,scale)

FLOAT (precision) 浮動小数点数値(8ビット)

REAL 浮動小数点数値 (4ビット)

DOUBLE PRECISION 倍精度の浮動小数点数値 (16ビット)

2.2 拡張データ型

市販されている SQL製品(SQLデータベース)では、そのほとんどに ANSI/ISOの標準データ型以外のデー

タ型が用意されています。こういったデータ型を拡張データ型などと呼んでいます。以下は、拡張データ型

の例です。

■ 可変長文字列 … VARCHARと呼ばれるデータ型で、ほとんどの SQL製品でサポートされ

ています。このデータ型の場合、実際に入力されている(または、入力

する)文字列のサイズが項目のサイズになります。ただし、サイズに上限

はあります。ANSI/ISO標準では、固定長文字列だけが定められています。

このデータ型の場合、項目のサイズは決まっており、文字列の右側には空

白(スペース)が入れられます。

2–2 データ型 SQLガイド

dbMAGIC Ver.8.2

Page 19: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

2

■ 通貨 … MONEYまたは CURRENCYなどと呼ばれるデータ型で、このデータ型

がサポートされている SQL製品も少なくありません。このデータ型では、

値は通常、小数または浮動小数点数値で格納されます。このデータ型を使

うことで、通貨の値を必要な桁数や形式で表示できます。

■ 日付と時刻 … SQL製品では、細かいところは違いがありますが、通常、日付と時刻も

扱えるようになっています。また、日付と時刻のほか、タイプスタンプ、

時間の長さ、日付/時刻の計算も行えるのが普通です。

■ 論理データ … 論理値(TRUE、FALSE)がサポートされています。

■ロングテキスト … SQLデータベースの中には、サイズの大きいテキスト、たとえば、2ギガ

バイトといった大きいテキストを格納できるデータ型が用意されているこ

ともあります。ただし、こういったデータ型の項目に対しては、照会や検

索はできないのが普通です。

■ 非構造化バイトストリーム… Oracleなどでは、可変長の非構造化バイトストリームの格納や取り出し

が可能なデータ型が用意されています。このデータ型の項目には、圧縮

ビデオイメージや実行可能コード、その他の非構造化データを格納でき

ます。こういったデータとしては、Microsoft SQLの IMAGEや Oracleの

LONGRAWなどがあります。

■アジア文字 … 漢字などのアジア文字は、文字数が多いため 16ビット(2バイト)で表

現されます。ただし、アジア文字の検索やソートはできません。

付録Aに、主要SQLデータベースでサポートされているデータ型の一覧がありますので参考にしてください。

2.3 データ型と制限

データ型にはそれぞれ、使用上の制限があります。たとえば、SQLデータベースではいずれも、日付は有効

な値しか格納できません。

例:

■ Oracle … DATE

■ MS-SQL Server… DATETIME

上記のどちらの場合も、日付の値として 0は無効です。DATEには、通常、日付のほか時刻も含まれます。

2.4 データ型の相違

データ型は各種 SQLデータベースにより異なりますが、これが、SQLベースのアプリケーションを作成す

るときの障害となります。各 SQLデータベース間でデータ型の違いがわずかであっても、実際に、SQLス

テートメントでデータ型を使う場合には、その相違は見過ごせないものになります。たとえば、同じ SQLク

エリでも、データベース管理システムが異なる場合、その SQLクエリで返る結果は異なります。

SQLデータベースは、移植性に優れているといわれますが、これは一般的なレベルで移植性があるというこ

とにすぎません。つまり、特定の SQLデータベース用のアプリケーションは、別の SQLデータベース用の

アプリケーションに移植できますが、データ型と SQLステートメントの部分は調整しなければなりません。

したがって、SQLベースのアプリケーションの完璧な移植性というのは、現在のところ目標でありますが、

現実的ではありません。

SQLガイド

dbMAGIC Ver.8.2

2.3データ型と制限 2–3

Page 20: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

2.5 定数

SQLステートメントでは、定数を使うことができます。定数は、行(レコード)の項目に格納することもで

きますし、項目に格納されている値と比較を行う場合に使うこともできます。また、SELECTステートメン

トで何らかの値を選択するときに使用できます。定数としては、数値、文字、日付のいずれかが使えます。

また、複数の SQLコンテキストで使うこともできます。

定数の挿入と比較は、どこでも可能です。ただし、定数が文字または日付の場合、その値を一重引用符で囲

まなければなりません。これで、定数である文字または日付が、項目名や予約語と識別されることになりま

す。なお、定数が数値の場合、一重引用符で囲む必要はありません。これは、項目名やテーブル名は必ず、

文字で始まるためです。たとえば、次のようになります。

INSERT INTO SALESREP (EMPL_NUM, NAME, QUOTA, HIRE_DATE, SALES)

VALUES (115, ’Dennis Irving’, 175000.00, ’21-JUN-90’, 0.00)

INSERTステートメントでは、挿入したい値を VALUES句を使用して指定します。また、定数は、式を使用

して指定することもできます。以下は、SELECTステートメントで式を使用して定数を指定している例です。

SELECT CITY

FROM OFFICES

WHERE TARGET (1.1 * SALES) + 10000.00

ANSI/ISOの SQL標準では、数値定数と文字定数、リテラルのフォーマットが定義されています。この定義

は、ほとんどの SQLデータベース製品で有効です。

数値定数

数値定数としては、整数定数と小数(10進数)定数があります(厳密数値リテラルなどとも呼ばれます)。

どちらも、SQLステートメントでは、通常の整数または小数と同じように指定できます。したがって、プラ

ス記号、マイナス記号を付けることもできます。

2–4 データ型 SQLガイド

dbMAGIC Ver.8.2

Page 21: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

2

2.6 RDBMSの主要データ型

データ型1 Oracle 2 MS-SQL Server

固定長文字列 CHAR(n) CHAR(n)

可変長文字列 VARCHAR2(n) VARCHAR(n)

ロングテキスト LONG TEXT

整数 NUMBER(p) TINYINT

SMALLINT

INT

小数 NUMBER(p,s)

通貨 MONEY

浮動小数点 FLOAT

日付/時刻 DATE 3 DATETIME

論理データ BIT

BINARY(n)

VARBINARY(n)

IMAGE

バイトストリーム RAW LONG

RAW

SYSNAME

USER TYPE NAME

その他

1  大半の SQLデータベースでは、独自のデータ型のほか、ANSI/ISOで定められているデータ型も使用できます。2  Oracleでは、数値はすべて、独自の内部フォーマットで格納されます。プレシジョンは、40桁です。3  Oracleの DATEデータ型は、実質上はタイプスタンプです。Oracleでは、Oracleの関数を使用してタイムスタンプの中の日付と時刻の部分を分割できます。

2.7 まとめ

ANSI/ISOの SQL標準では、Character(文字)、Integer(整数)、SmallInt(スモールインテジャ)、Numeric

(数値)、Decimal(小数)、Float(浮動小数点)、Real(実数)、Double Precision(倍精度)の各データ型が

定められています。一方、データベースにも通常、拡張データ型が用意されています。こういった拡張デー

タ型としては、Varchar(可変長文字列)、Money(通貨)、Date(日付)、Boolean(論理)、Long(ロング)、

Raw(ロー)などがあります。拡張データ型は、ユーザの要求に応える形で用意されていますが、逆に、異

なるデータベース間の移植という点では不利になります。

SQLガイド

dbMAGIC Ver.8.2

2.7まとめ 2–5

Page 22: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

2–6 データ型 SQLガイド

dbMAGIC Ver.8.2

Page 23: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第3章 データベースへの接続章目次3.1 SQLサーバとデータベース : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 3–2

3.2 SQLユーザインタフェース : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 3–2

3.3 接続文字列 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 3–3

Page 24: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第3章 データベースへの接続

RDBMSは、サーバとデータベースで構成されます。ユーザからデータベースに対しては、接続文字列を使

用して接続できます。

3.1 SQLサーバとデータベース

SQLコマンドは、SQLサーバに送られ、処理されます。SQLサーバ上では RDBMSソフトウエアが動作し

ており、ここでデータの同時並行処理が実行されます。

SQLサーバはデータベース管理を行うソフトウェアです。一方、クライアントは、サーバに対してデータを

要求するためのアプリケーションです。サーバが起動すると、メモリ領域が割り当てられると同時に、サー

バのバックグラウンドプロセスが開始されます。

データベースシステムでは、ほとんどの場合、サーバ上に複数のデータベースを置いておくことができます。

なお、データベースシステムのうちOracleは、ほかのデータベースシステムとは用語の使い方が多少変わっ

ています。つまり、Oracleサーバでは、インスタンスを複数起動させることができ、このインスタンスがそ

れぞれ、ほかの SQLサーバのデータベースに相当します。これは、インスタンスにそれぞれ、データベース

が置かれる形式になっているためです。このため、Oracleでは、データベースはインスタンスと呼ばれるこ

ともあります。また、単一のサーバマシンに Oracleのインスタンスを複数起動することもできます。インス

タンスは、SIDで識別されます。

3.2 SQLユーザインタフェース

RDBMSにはそれぞれ、対話型のユーザインタフェースが用意されています。ユーザは、このユーザインタ

フェースに対して接続することになり、接続後、ユーザは SQLステートメントを実行することができます。

この場合、実行する SQLステートメントは、接続先となる RDBMSに対応してなければなりません。ユー

ザは、この対話型ユーザインタフェースを介して SQLスクリプトファイルを実行することもできます。ま

た、ストアドプロシージャの作成も可能です。

対話型ユーザインタフェースは、データベースシステムによって異なり、それぞれ次のようになっています。

■ MS SQL Server… ISQL/W

■ Oracle … SQL*Plus

上記の対話型ユーザインタフェースのほか、Cなどの第 3世代言語を使用して SQLコマンドを実行すること

もできます。

3–2 データベースへの接続 SQLガイド

dbMAGIC Ver.8.2

Page 25: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

3

3.3 接続文字列

SQLデータベースに対して SQLコマンドを実行したい場合、まず、ユーザは SQLサーバに接続することが

必要です。この接続は、接続文字列をデータベースに対して送信することで行えます。接続文字列には、デー

タベースサーバのパラメータとしてサービス名を指定しなければなりません。

接続文字列の構造は、データベースによって異なります。

例:

■ Oracle… (ローカル)

指定しません。

(リモート)

サービス名

以上のようにして SQLサーバへの接続が完了すれば、ユーザは、使用するデータベースを選択することがで

きるようになります。なお、ほとんどの RDBMSでは、GUIインタフェースを使用して接続ができるように

なっています。ただし、通常、接続コマンドラインによる接続も実行できます。

SQLガイド

dbMAGIC Ver.8.2

3.3接続文字列 3–3

Page 26: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

3–4 データベースへの接続 SQLガイド

dbMAGIC Ver.8.2

Page 27: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第4章 データベースオブジェクトの作成章目次4.1 データベースの作成 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 4–2

4.2 データベースのパラメータの変更 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 4–2

4.3 データ定義言語(DDL) : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :4–2

4.4 ビュー : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 4–4

Page 28: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第4章 データベースオブジェクトの作成

SQLの場合、ユーザは、普通はデータベースの作成にはあまり関係しなくても済みます。これは、SQLで

は、対話型のユーザインタフェースがすでに用意されているためで、ユーザは、このユーザインタフェース

を介してデータベースなどを扱うことができます。

ただし、ユーザにとっても、売り上げ予測表など、主に個人用途のテーブルを作成して利用したいこともあ

ります。また、マルチユーザ環境では、テーブルやデータベースを作成し、ほかのユーザと共有したい場面

も出てきます。そのほか、データベースを個人的に使いたい場合、専用のデータベースを作成し、専用のア

プリケーションで使用したいこともあります。こういったときには、ユーザがそれぞれ、データベースを作

成するという必要性も起こります。

4.1 データベースの作成

データベースは、一般に、データモデルに関係する要素で構成されています。つまり、データベースとは、

テーブル、ビュー、インデックス、その他、データベースに関係するオブジェクトで構成されているものを

いいます。データベースは、このように複数の要素の集まりですが、データベースを作成する場合、まず、

データベース自体を作成することが必要です。

データベースは、オペレーティングシステムでは操作することはできません。理由は、データベースのレコー

ドは RDBMSにより管理され、逆に、このレコードによりデータベースの存在が RDBMSによって確認され

るためです。また、レコードはディスクに置かれて管理されるため、オペレーティングシステムには認識さ

れることはありません。

データベースオブジェクトの物理位置は直接チェックすることはできませんが、物理位置を指定することは

できます。また、オブジェクトのパラメータを指定することもできます。さらに、データベースオブジェク

トの格納位置の範囲を指定することも可能です。データベースオブジェクトの物理位置に関連する用語とし

ては、テーブルスペース、データベーススペース、セグメント、デバイスなどがあります。

SQLでは、データベースは、CREATE DATABASEコマンドを使用して作成できます。このコマンドでは、

位置(格納場所)などのパラメータ(オプション)を指定することもできます。たとえば、次のようになり

ます。

MS-SQL Server  

CREATE DATABASE dbname ON device1=16 LOG ON logdev 1=10

4.2 データベースのパラメータの変更

データベースの作成時にはパラメータを指定することができますが、その後、指定したパラメータを変更し

たいことも出てきます。そういった場合、ALTER DATABASEコマンドを使用してデータベースのパラメー

タを変更することができます。これで、データベースの機能は拡張や変更が可能になります。

4.3 データ定義言語(DDL)

SQLステートメントのうち、データベースの構造自体を操作できるステートメントを DDL 言語(DDL ス

テートメント)と呼んでいます。

DDL ステートメントでは、次のようなことが可能です。

■ 新規のテーブルやビューの定義と作成

■ 既存テーブルやビューの名前の変更

4–2 データベースオブジェクトの作成 SQLガイド

dbMAGIC Ver.8.2

Page 29: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

4

■ テーブルやビューの削除

■ 既存のテーブルやビューの定義の変更

■ データベースのセキュリティの制御

■ インデックスの作成と削除

■ データの格納場所の変更

主な DDL ステートメントとしては、CREATE、DROP、ALTER、RENAMEがあります。以下、機能を簡単

に紹介します。

■ CREATE… データベースオブジェクトの定義と作成が可能です。

構文:

CREATE [TABLE,INDEX]名前 (カラム定義)

「カラム定義」には、カラム名(項目名)とデータ型を対で指定します。データ型の右に

NOT NULL オプションを付加しておくと、NULL の入力が禁止されます。デフォルトは、

NOT NULLになっています。

例:

CREATE TABLE custs (custno INTEGER, custname CHAR(30), hiredate DATETIME)

CREATEを使用してテーブルを作成する場合、カラム名(項目名)とデータ型の対は、コ

ンマで区切って複数指定できます。カラム定義に指定する要素は、まとめると次のようにな

ります。

・カラム名(項目名)

・データ型 -文字列、日付、数値など

・長さ

なお、データベースによっては、独自のデータ型があることもあります。ただし、ANSI標

準のデータ型は、通常、どのデータベースでもサポートされています。

RDBMSによっては、SELECTステートメントの結果(項目)を使用して新規のテーブルを

作成できることもあります。この場合、作成されたテーブルのフィールド(項目)構成は、

SELECTステートメントの実行先のテーブルと同じになります。

CREATE [UNIQUE] [CLUSTERED] INDEXインデックス名 ONテーブル名 (カラム名 [,カ

ラム名])

CREATEステートメントではインデックスを作成することもできますが、その場合、複数

のカラムに対して単一のインデックスを定義することができます。複数のカラムに対してイ

ンデックスを作成したときには、物理データは、インデックスが設定されたカラムの順に

したがって格納されます。この方法は、とくに一意なインデックスを頻繁に使うときに有効

です。

■ DROP … 既存のデータベースオブジェクトを削除できます。

構文:

DROP TABLE (テーブル名)

テーブルが不要になったり、テーブルをもう一度作り直したいときには、DROP TABLEス

テートメントでテーブルを削除できます。DROP TABLEでテーブルを削除すると、そのテー

ブルに関連するインデックスもすべて削除されます。

SQLガイド

dbMAGIC Ver.8.2

4.3データ定義言語(DDL) 4–3

Page 30: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

■ ALTER … データベースオブジェクトの定義の変更が可能です。

構文:

ALTER TABLE (テーブル名) ADD カラム名カラム定義

場合によっては、アプリケーションで使用しているテーブルの項目を追加したり、内容を

変更したいときもあります。そんなときには、ALTER TABLE ステートメントが使えます。

ALTER TABLE ステートメントでは、次のような処理が可能です。

・項目の追加

・既存の項目の定義の変更

■ RENAME… オブジェクトの名前の変更が可能です。

構文:

RENAME TABLE既存のテーブル名新規のテーブル名

データベースの中のオブジェクトの名前を変更したいときもあります。オブジェクトの名前

は RENAMEっを使用して変更できます。このステートメントでは、テーブル、カラム、ス

トアドプロシージャトリガの名前を変更できます。

RENAMEは、RDBMSの種類によっては使えないこともあります。たとえば、Microsoft SQL

の場合、オブジェクトの名前は、RENAMEステートメントではなくストアドプロシージャ

(sp rename)を使用して変更しなければなりません。

注意:� �

DDL ステートメントを実行すると、ほとんどの場合、データディクショナリにロック

がかけられます。ただし、DDL ステートメントで変更されるのはテーブルの定義だけ

で、行の内容は変更されません。� �

4.4 ビュー

テーブルと併せて、ビューを作成しておくと、テーブルのデータの閲覧に便利です。ビューは、DML ステー

トメントのうち、テーブル名の代わりにビュー名が指定できるステートメントであれば、作成が可能です。

また、ビューを使うことで、セキュリティの確保や DML ステートメントの簡略化、処理速度の向上も見込

めます。

なお、ビューにはいくつか制限もあります。たとえば、複数のテーブルをもとに作成したビューでは、デー

タを挿入することはできませんし、データの更新や削除も不可能です。また、SELECTステートメントでカ

ラム名のほかに式を使用してカラムを指定し、その SELECTステートメントでビューを作成した場合、作成

されたビューでは、内容の更新はできません。

注意:� �

既存のビューに対して SELECTステートメントを実行した場合、必ずしも、その SELECTステートメン

トによるデータが表示されるとは限りません。つまり、テーブルの代わりにビューを指定して SELECT

ステートメントを実行すると、その SELECTステートメントに、ビューの SELECTステートメントが追

加されて実行されます。このため、実行した SELECTステートメントの結果は、予測とは異なります。� �

4–4 データベースオブジェクトの作成 SQLガイド

dbMAGIC Ver.8.2

Page 31: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第5章 カラムの取得とソート章目次5.1 テーブルのすべてのカラムの取得 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 5–2

5.2 テーブルのカラムを指定して取り出し : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 5–3

5.3 重複行の取り出しのカット : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 5–4

5.4 結果のソート - ORDER BY句 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :5–5

Page 32: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第5章 カラムの取得とソート

データベースのデータは、SELECTステートメントを使用して取り出すことができます。データは、テーブ

ルの形式で返ります。SELECTステートメントでは、データベースのカラムの名前を使用して項目を指定で

き、指定した項目のデータが返ります。また、SELECTステートメントで指定するデータベースをベーステー

ブルと呼ぶこともあります。SELECTステートメントでは、テーブルは FROM句で指定します。

SELECTステートメントの構文は、次のようになります。

SELECT FROM [WHERE] [GROUP BY] [HAVING] [ORDER BY]

また、オプションなしの基本構文は、次の通りです。

SELECT FROM

5.1 テーブルのすべてのカラムの取得

SELECTステートメントでは、ベーステーブル(SELECTステートメントの実行対象のデータベース)の

カラムをすべて取得し、データを取り出すこともできます。また、データベースのカラムの順番にかかわら

ず、SELECTステートメントで順番を指定してカラムを取り出すこともできます。SELECTステートメント

でベーステーブルのカラムをすべて取り出したい場合、次のいずれかの方法が使えます。

■ SELECTステートメントで、データを取り出したいカラムの名前をすべて指定します。カラム名とカ

ラム名の間は、コンマで区切ります。なお、データは、SELECTステートメントで指定したカラムの

順番のとおりに取り出されます。

■ カラム名の指定箇所にアスタリスク(*)を記述し、FROM句にテーブル名を指定します。この場合、

データは、ベーステーブルのカラムの順番に取り出されます。

構文:

SELECTカラム名 [, カラム名 . . .]

FROMテーブル名

または、

SELECT *

FROMテーブル名

例:

会社の各部門に関する情報が格納されているテーブルがあり、そのテーブルのカラムのデータをすべ

て取り出したい場合、次のようにします。ここでテーブルの名前は「部門情報」、カラムは全部で 3つ

で、それぞれ、「部門名」、「場所(所在地)」、「部門番号」だったとします。

1. SELECTステートメントで、取り出したいデータが格納されているカラム名を指定します。また、

FROM句に、テーブル名を指定します。

SELECT部門名, 場所, 部門番号 FROM部門情報

上記のステートメントでは、テーブル「部門情報」の「部門名」、「場所」、「部門番号」の 3つの

項目のデータが返ります。データは、SELECTステートメントで指定したカラムの順番で取り出

されます。たとえば、次のようになります。

5–2 カラムの取得とソート SQLガイド

dbMAGIC Ver.8.2

Page 33: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

5

部門名 所在地 部門番号

経理 ロサンジェルス 10

マーケティング サンフランシスコ 20

営業 ノーフォーク 30

販売 ニューヨーク 40

リサーチ バークレー 50

2. または、SELECTステートメントにアスタリスク(*)を指定します。

SELECT *

FROM部門情報

上記の場合、データは、ベーステーブルのカラムの順番で取り出されます。ベーステーブルのカ

ラムの順番が、「部門番号」「部門名」、「場所」、たとえば、次のようになります。

部門番号 部門名 所在地

10 経理 ロサンジェルス

20 マーケティング サンフランシスコ

30 営業 ノーフォーク

40 販売 ニューヨーク

50 リサーチ バークレー

5.2 テーブルのカラムを指定して取り出し

SELECTステートメントでは、ベーステーブルのカラムの中からカラムを指定して、データを取り出すこと

もできます。

構文:

SELECTカラム名 [, カラム名. . .]

FROMテーブル名

例:

たとえば、「社員情報」というテーブルの「名前」と「職種」と 2つのカラムのデータを取り出したい場合、

次のようになります。

SELECT名前, 職種

FROM社員情報

上記の SELECTステートメントでは、次のようなテーブルが返ります。テーブルには、社員の名前と職種が

表示されます。なお、テーブル「社員情報」には、このほかにもカラムがあります。

SQLガイド

dbMAGIC Ver.8.2

5.2テーブルのカラムを指定して取り出し 5–3

Page 34: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

社員名 職種

アレン 営業

ジョージ 営業

ターンブル 営業

マークソン 事務

ジョーダン アナリスト

ウオーカー 社長

メイジャー マネージャ

クレイン アナリスト

バートン マネージャ

エイデン マネージャ

アントン 事務

カーライル 事務

ボンフィーリオ アナリスト

オニール マネージャ

5.3 重複行の取り出しのカット

SELECTステートメントで指定したカラムが 1つの場合(また、条件を指定しない場合)、取り出された行

のデータが同じことが少なくありません。これは、カラムのデータが同じであっても、すべてのレコードが

取り出されるためです。

例:

たとえば、SELECTステートメントで、「社員情報」というテーブルの「職種」というカラムを指定したと

します。

SELECT職種

FROM社員情報

上記の SELECTステートメントでは、テーブル「社員情報」のカラム「職種」のデータが取り出され、次の

テーブルが返ります。この場合、すべてのレコードが抽出されます。

職種

営業

営業

営業

事務

アナリスト

社長

マネージャ

アナリスト

マネージャ

マネージャ

事務

事務

アナリスト

マネージャ

上記のように、SELECTステートメントで指定したカラムが 1つの場合、重複行(データが同じレコード)が

取り出されますが、重複行を割愛したい場合、DISTINCTキーワードを使います。この DISTINCTキーワー

ドを指定しておくと、同じデータのレコードは一つだけ取り出されます。

5–4 カラムの取得とソート SQLガイド

dbMAGIC Ver.8.2

Page 35: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

5

構文:

SELECT DISTINCTカラム名 [, カラム名 . . .]

FROMテーブル名

例:

以下は、DISTINCTキーワードの使用例で、ここでは、カラム「職種」のデータを取り出します。

SELECT DISTINCT 職種

FROM 社員情報

この場合、重複行は割愛され、したがって、職種は一つだけ表示されます。

職種

アナリスト

事務

マネージャ

社長

営業

5.4 結果のソート - ORDER BY句

SELECTステートメントで ORDER BY句を使うことで、取り出されたレコードをソートして表示すること

ができます。ソート順も指定できます。ORDER BY句を使わない場合、レコードはソートされることはあり

ません。

SELECT FROM [WHERE] [GROUP BY] [HAVING] [ORDER BY]

ORDER BY句では、ORDER BYというキーワードの後にカラム名を指定することができます。カラムは、

コンマで区切って複数指定できます。レコードは、ここで指定したカラムのデータを基準にソートされて出

力されます。また、カラム名のほか、カラムを指す番号を指定することもできます。

構文:

SELECTカラム名 [, カラム名 . . .]

FROMテーブル名

ORDER BYカラム名

例:

たとえば、まず、地区を基準にしてソートし、さらに同一の地区の中で市をソートして、売上を表示したい

とします。ソートは地区、市ともアルファベット順とします。上記の場合、まず、SELECTステートメント

に取り出したいカラムの名前を指定します。続いて、FROMを使用してテーブルを指定し、最後に、ORDER

BYでソートの基準となるカラムを指定します。ここでは、地区と市を基準にソートしたいため、この 2つ

を指定します。

SELECT 市, 地区, 売上

FROM 営業所マスタ

ORDER BY 地区, 市

結果は、次のようになります。

SQLガイド

dbMAGIC Ver.8.2

5.4結果のソート - ORDER BY句 5–5

Page 36: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

市 地区 売上

アトランタ Eastern 367,911

シカゴ Eastern 735,042

ニューヨーク Eastern 692,637

デンバー Western 186,042

ロサンジェルス Western 835,915

SQLでは、デフォルトではデータは昇順でソートされます。降順にしたい場合、次のようにします。

構文:

SELECTカラム名 [, カラム名 . . .]

FROMテーブル名 ORDER BYカラム名

[DESC][カラム名 [DESC] . . .]

例:

以下は、市、地区、売上の 3つのカラムを指定し、売上を基準にレコードを降順でソートして表示する場合

の例です。この場合、レコードは売上の大きい順(降順)で並びます。

SELECT 市, 地区, 売上

FROM 営業所マスタ

ORDER BY 売上 DESC

結果:

市 地区 売上

ロサンジェルス Western 835,915

シカゴ Eastern 735,042

ニューヨーク Eastern 692,637

アトランタ Eastern 367,911

デンバー Western 186,042

例:

たとえば、ベーステーブルのカラムのうち、「基本給」と「成果給」という 2つのカラムの値を合計し、そ

の合計値を「基本給 +成果給」というカラムに表示したかったとします。

この場合、SELECTステートメントは下のようになります。このステートメントでは、社員の名前と、社員

の基本給と成果給の合計額が出力されます。また、ORDER BY句で「2」と「降順(=DESC)」を指定しい

ますので、レコードは、「基本給 +成果給」を基準に降順で出力されます。

SELECT社員名, 基本給 + 成果給

FROM 社員マスタ

ORDER BY 2 DESC

5–6 カラムの取得とソート SQLガイド

dbMAGIC Ver.8.2

Page 37: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

5

結果:

社員名 基本給+成果給

ターンブル 9100

ジョージ 7400

アレン 6300

ウオーカー 5500

オニール 4850

メイジャー 4750

エイデン 4700

ジョーダン 4250

バートン 4200

ボンフィーリオ 4175

クレイン 3900

アントン 3500

カーライル 3375

マークソン 3000

なお、データ型が’LONG’ または TEXTの場合、レコードのソートはできません。したがって、このデータ

型は、ORDER BY句で指定することはできません。

また、ORDER BY句で指定するカラムは、必ずしも、SELECTステートメントの取得リスト(カラム名の

リスト)で指定しているカラムでなくてもかまいません。

SQLガイド

dbMAGIC Ver.8.2

5.4結果のソート - ORDER BY句 5–7

Page 38: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

5–8 カラムの取得とソート SQLガイド

dbMAGIC Ver.8.2

Page 39: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第6章 行の選択 - WHERE句章目次6.1 WHERE句による行の選択 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 6–2

Page 40: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第6章 行の選択 - WHERE句

通常、ベーステーブルの行は、その全部を取り出す必要はそれほどありません。一定の条件を満たすレコー

ドだけを取り出します。このように、一定の条件を使用して、その条件に該当するレコードを取り出したい

場合、WHERE句を使います。

6.1 WHERE句による行の選択

WHERE句は、SELECTステートメントなど、取り出す行を限定できる SQLステートメントで使用します。

書式は、次の通りです。

SELECT FROM [WHERE] [GROUP BY] [HAVING] [ORDER BY]

WHERE句を使う場合、WHEREというキーワードを記述し、その右に条件を指定します。この条件にした

がって、行(レコード)が取り出されることになります。つまり、条件はフィルタの役目を果たします。

■ WHERE句を使った場合、指定した条件を満たす行が取り出され、照会(クエリ)の結果として返り

ます。

■ 指定した条件を満たさない行は無視され、照会(クエリ)の結果から排除されます。

WHERE句はオプションで、必ずしも指定する必要はありません。SELECTステートメントにWHERE句を

指定しなかったときには、ベーステーブルのすべてのレコードが結果として返ります。したがって、ベース

テーブルが大きい場合、返ってくるレコードの数も多くなります。

SELECT名前, 売上

FROM営業部

WHEREマネージャ = 104

WHERE句による行の取り出し

����������� �

�� �������������� �

���� ���� ��

������ ��

������� ����

������ ��

������� �

���������

��

������� !�"#$��%

������� !&#�"!%

'������� (��#""&%

����

�������� True

�������� False

�������� Unknown

図 6.1: WHERE句による行の選択

検索条件

SQLでは、各種各様の検索条件を使用して、他種類のクエリを効率よく行うことができます。SQLの場合、

基本的な条件として次のようなものがあります。

・ 比較テスト(=、<>、<=、<、>、>=)… 式を使用して 2つの値を比較し、その結果を条件として検

索を行うことができます。

6–2 行の選択 - WHERE句 SQLガイド

dbMAGIC Ver.8.2

Page 41: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

6

・ 範囲テスト(BETWEEN)… 値が一定の範囲に収まるかどうかをチェックし、その結果を条件として検

索を実行できます。

・ メンバーシップテスト( IN)… 複数の値を指定しておき、項目の値が、その複数の値のいずれかと一致

する場合、レコードが取り出されます。

・パターンマッチテスト(LIKE)… パターンを指定し、項目の値(文字列)が、そのパターンに一致す

るかどうかをチェックできます。このチェックで、値が指定したパターンと一致した場合、レ

コードが取り出されます。

・ NULL値テスト( IS NULL)… 項目の値が NULLかどうかをチェックでき、その結果をもとにレコード

の取り出しが可能です。

・ 複合検索(AND、OR、NOT)… AND、OR、NOTの各論理演算子を使った条件です。この方法では、

複雑な条件を作成できます。

構文:

SELECT カラム名 [, カラム名 . .]

FROM テーブル名

WHERE 条件 [条件, 条件 . . .]

比較テストによる行の取り出し

比較テストでは、比較を行う式を指定し、その式を満足するレコードを取り出すことができます。比較テス

トでは、=、<>、<=、<、>、>=の 6種類の演算子を使用できます。

=を使った比較テスト

構文:

SELECT カラム名 [, カラム名 . . .]

FROM テーブル名

WHERE カラム名 = 値(式)

例:

「社員情報」というテーブルがあり、その中の「部門 10(部門番号が 10の部門)」に属する社員すべてにつ

いて、その社員番号、名前、職種、給料を取り出したい場合、次のようになります。

SELECT 社員番号, 名前, 職種, 給料

FROM社 員情報

WHERE 部門番号 = 10

結果:

社員番号 名前 職種 給料

3123 ウオーカー 社長 5500

3115 カーライル 事務 3375

3970 オニール マネージャ 4850

<>を使った比較テスト

構文:

SELECT カラム名 [, カラム名 . . .]

FROM テーブル名

WHERE カラム名 <> 値(式)

SQLガイド

dbMAGIC Ver.8.2

6.1 WHERE句による行の選択 6–3

Page 42: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

例:

「社員情報」というテーブルの社員のうち、マネージャでない社員の名前と職種、給料を取り出したい場合、

次のようになります。

SELECT 名前, 職種, 給料

FROM 社員情報

WHERE 職種 <> ’マネージャ’

結果:

名前 職種 給料

アレン 営業 2300

ジョージ 営業 2400

ターンブル 営業 2050

マークソン 事務 3000

ジョーダン アナリスト 4250

ウオーカー 社長 5500

クレイン アナリスト 3900

アントン 事務 3500

カーライル 事務 3375

ボンフィーリオ アナリスト 4175

比較される値が文字列の場合、大文字と小文字が区別されます。また、一重引用符で囲まなければなりませ

ん。,たとえば、上記の例では、下のように小文字を使った場合、

WHERE 職種 <> ’マネージャ’

この場合、結果としては、「マネージャ」のレコードが 4つ表示されます(大文字と小文字が区別されるた

めです)。大文字と小文字が区別されて認識されるかどうは、データベースによっても異なります。たとえ

ば、MS-SQL Serverでは、大文字と小文字が区別されます。

範囲テストによる行の取り出し

範囲テストによる取り出しでは、範囲を指定し、その範囲に該当する値を持ったレコードを取り出すことが

できます。

構文:

SELECT カラム名 [, カラム名 . . .]

FROM テーブル名

WHERE カラム名 BETWEEN式 AND式

例:

1985年 3月 1日から 1989年 12月 31日までの間に入社した社員について、その名前、職種、入社日を取り

出したい場合、次のようにします。なお、ここでは、条件として指定した項目(名前、職種、入社日)のデー

タ型はそれぞれ、文字、文字、日付としています。

SELECT 名前, 職種, 入社日

FROM 社員情報

WHERE 入社日 BETWEEN ’1985年 3月 1日’

AND ’1989年 12月 31日’

6–4 行の選択 - WHERE句 SQLガイド

dbMAGIC Ver.8.2

Page 43: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

6

結果:

名前 職種 入社日

アレン 営業 1985年 4月 15日

ジョーダン アナリスト 1989年 5月 3日

ウオーカー 社長 1985年 3月 13日

メイジャー マネージャ 1985年 3月 13日

バートン マネージャ 1987年 12月 2日

エイデン マネージャ 1989年 8月 4日

メンバーシップテストによる行の取り出し

メンバーシップテストによる行の取り出しでは、複数の値を指定し、その中のいずれかの値を持ったレコー

ドを取り出すことができます。

構文:

SELECT カラム名 [, カラム名 . . .]

FROM テーブル名

WHERE カラム名 IN (値, 値 . . .)

例:

テーブル「社員情報」のレコードのうち、職種が営業またはアナリストである社員のレコードを取り出した

い場合、次のようにします。

SELECT 名前, 職種

FROM 社員情報

WHERE 職種 IN (’営業’, ’アナリスト’)

結果:

名前 職種

アレン 営業

ジョージ 営業

ターンブル 営業

ジョーダン アナリスト

クレイン アナリスト

ボンフィーリオ アナリスト

また、メンバーシップテストによる行の取り出しでは、NOTキーワードを使うことで、指定した複数の値以

外の値のレコードを取り出すこともできます。

構文:

SELECT カラム名 [, カラム名 . . .]

FROM テーブル名

WHERE カラム名 NOT IN (値, 値 . . .)

例:

テーブル「社員情報」のレコードのうち、職種が営業またはアナリストでない社員のレコードを取り出した

い場合、次のようになります。

SELECT 名前, 職種

FROM社 員情報

WHERE 職種 NOT IN (’営業’, ’アナリスト’)

SQLガイド

dbMAGIC Ver.8.2

6.1 WHERE句による行の選択 6–5

Page 44: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

結果:

名前 職種

マークソン 事務

ウオーカー 社長

メイジャー マネージャ

バートン マネージャ

エイデン マネージャ

アントン 事務

カーライル 事務

オニール マネージャ

パターンマッチテストによる行の取り出し

カラムに格納されている値が正確には分からない場合、パターンを指定し、そのパターンに合致する値が格

納されているレコードを取り出すことができます。この方法をパターンマッチテストによる取り出しと呼び、

LIKE キーワードを使います。

構文:

SELECT カラム名 [, カラム名 . . .]

FROM テーブル名

WHERE カラム名 LIKEパターン

パターンは文字列で、次のワイルドカード文字を使用できます。

■パーセント記号(%)… このワイルドカード文字は、任意の数(0から nまで)の文字を表します。

■ 下線( ) … このワイルドカード文字は、1文字を表します。パターンには、ワイルドカー

ドのほか実際の文字を指定でき、この文字は、そのまま認識されます。

例:

テーブル「社員情報」のレコードのうち、名前が「B」で始まる社員について、その名前、職種、部門番号

を取り出したい場合、次のようになります。

SELECT 名前, 職種, 部門番号

FROM社 員情報

WHERE 名前 LIKE ’B%’

結果:

名前 職種 部門番号

バートン マネージャ 20

ボンフィーリオ アナリスト 50

例:

テーブル「社員情報」のレコードのうち、姓が 6文字以上の社員について、その名前、職種、部門番号を取

り出したい場合、次のようになります。

SELECT名前, 職種, 部門番号

FROM社員情報

WHERE名前 LIKE ’_ _ _ _ _ _ %’

上記の 6つの下線( )は、姓の最初の 6文字を表します。最後のパーセント記号(%)は、任意の数(0か

ら nまで)の文字を表し、したがって、このパターンは 6文字以上の文字列を示すことになります。

6–6 行の選択 - WHERE句 SQLガイド

dbMAGIC Ver.8.2

Page 45: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

6

結果:

名前 職種 部門番号

ジョージ 営業 40

ターンブル 営業 40

マークソン 事務 50

ジョーダン アナリスト 50

ウオーカー 社長 10

バートン マネージャ 20

カーライル 事務 10

ボンフィーリオ アナリスト 50

NULL値テストによる行の取り出し

項目に値が入っていない行を取り出したい場合、NULL 値テストによる行を取り出しを使います。

構文:

SELECT カラム名 [, カラム名 . . .]

FROM テーブル名

WHERE カラム名 IS NULL

例:

テーブル「社員情報」のレコードのうち、手数料を受け取っていない社員のレコードを抽出し、その名前と

給料を表示したい場合、次のようになります。

SELECT 名前, 給料

FROM 社員情報 WHEREカラム IS NULL

結果:

名前 給料

マークソン 3000

ジョーダン 4250

ウオーカー 5500

メイジャー 4750

クレイン 3900

バートン 4200

エイデン 4700

アントン 3500

カーライル 3375

ボンフィーリオ 4175

オニール 4850

NULL 値テストによる行の取り出しでは、「 IS NOT NULL」を使うことで、NULL 値が入っていないレコー

ドをすべて取り出すこともできます。

構文:

SELECT カラム名 [, カラム名 . . .]

FROM テーブル名

WHERE カラム名 IS NOT NULL

SQLガイド

dbMAGIC Ver.8.2

6.1 WHERE句による行の選択 6–7

Page 46: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

例:

テーブル「社員情報」のレコードのうち、手数料を受け取った社員のレコードをすべて抽出し、その名前と

給料、手数料の額を表示したい場合、次のようになります。

SELECT 名前, 給料, 手数料

FROM 社員情報

WHERE 手数料 IS NOT NULL

結果:

名前 給料 手数料

アレン 4300 2000

ジョージ 4400 3000

ターンブル 4050 5050

複合検索による行の取り出し

レコードは、複数の条件を使用して取り出すこともできます。この場合の条件を複合検索条件(または、複

合論理式)と呼んでいます。複合検索条件による行の取り出しでは、条件は AND、OR、NOTの各論理演算

子を使用して結合します。

各条件ではそれぞれ、式を複数指定することもできます。また、各条件による結果がすべて結合されてい、

最終的にレコードが抽出されます。なお、比較演算子と論理演算子は、その優先順が決まっており、その優

先順にしたがって結果が出力されます。

比較演算子

=、!=、>、> =、IN、LIKE、IS NULL、BETWEEN

論理演算子

NOT、AND、OR

構文:

SELECT カラム名 [, カラム名 . . .]

FROM テーブル名

WHERE式

AND [NOT] (式)

OR [NOT] (式)

例:

テーブル「社員情報」のレコードのうち、職種がマネージャで、かつ、給料が$4,300以上の社員のレコード、

および職種が営業の社員のレコードを抽出し、その社員の名前、職種、入社日、給料を表示したい場合、ス

テートメントは次のようになります。

SELECT 名前, 職種, 入社日, 給料

FROM 社員情報

WHERE (給料 >= 4300

AND 職種 = ’マネージャ’)

OR 職種 = ’営業’

6–8 行の選択 - WHERE句 SQLガイド

dbMAGIC Ver.8.2

Page 47: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

6

結果:

名前 職種 入社日 給料

アレン 営業 1985年 4月 15日 4300

ジョージ 営業 1994年 1月 1日 4400

ターンブル 営業 15-Jun-93 4050

メイジャー マネージャ 1985年 3月 13日 4750

エイデン マネージャ 1989年 8月 4日 4700

オニール マネージャ 1994年 5月 15日 4850

例:

テーブル「社員情報」のレコードのうち、職種がマネージャまたは営業で、かつ、給料が$4,300以上の社員

のレコードを抽出し、その社員の名前、職種、入社日、給料を表示したい場合、ステートメントは次のよう

になります。

SELECT 名前, 職種, 入社日, 給料

FROM社 員情報

WHERE 社員情報 >= 4300

AND (職種 = ’マネージャ’

OR 職種 = ’営業’)

結果:

名前 職種 入社日 給料

アレン 営業 1985年 4月 15日 4300

ジョージ 営業 1994年 1月 1日 4400

メイジャー マネージャ 1985年 3月 13日 4750

エイデン マネージャ 1989年 8月 4日 4700

オニール マネージャ 1994年 5月 15日 4850

SQLガイド

dbMAGIC Ver.8.2

6.1 WHERE句による行の選択 6–9

Page 48: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

6–10 行の選択 - WHERE句 SQLガイド

dbMAGIC Ver.8.2

Page 49: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第7章 高度なSELECTステートメント章目次7.1 式 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 7–2

7.2 複数のテーブルに対するクエリ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 7–4

7.3 グループ関数 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 7–5

7.4 GROUP BY句 -グループ化して結果を出力 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :7–6

7.5 HAVING句 -グループ検索条件 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 7–7

7.6 ネストされた SELECTステートメント : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 7–9

7.7 データ変換 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :7–10

7.8 SQLでのプログラミング : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 7–11

Page 50: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第7章 高度なSELECTステートメント

これまで、基本的な SELECTステートメントを説明しましたが、SELECTステートメントではさらに複雑な

クエリも可能です。

7.1 式

SELECTステートメントの選択リストでは、式を使うこともできます。この式を使用して、表示するカラム

を操作できます。たとえば、複数のカラムの値を結合して結果に表示することもできますし、複数のカラム

の値を比較して結果を出力することもできます。場合によっては、式に関数を定義することもできます。こ

の方法は、標準の構文ではありませんが、相応の結果を出すこともできます。式に指定できる関数は、デー

タベースシステムによって異なりますが、関数の使い方はほぼ同じです。

以下、よく使われる式と関数について説明します。ここで説明する主な内容は、次の通りです。

■ 算術式 … この種の式では、数学的な計算を行うことができます。

■ NULL操作関数 … この種の関数では、NULL 値を操作して結果を出力することができます。

■ 結合関数 … 複数のカラムを結合して結果テーブルに表示できます。

なお、使用できる関数はデータベースによって異なります。このため、使用前にあらかじめ関数や使い方を

見ておくことが必要です。

算術式

SELECTステートメントでは算術式を指定できます。算術式を使うことで、複数のカラムの値を計算し、そ

の結果を出力することができます。

例:

テーブル「社員マスタ」のレコードのうち、職種が営業で、かつ、成果給が基本給の 50%を超える社員のレ

コードを取り出し、その社員の名前、基本給、成果給、給与合計(基本給+成果給)を表示したい場合、次

のようになります。

SELECT 名前, 基本給, 成果給, 基本給 + 成果給

FROM 社員マスタ

WHERE 職種 = ’営業’

AND 成果給 >.50*基本給

結果:(算術式がデータベースでサポートされていなければなりません。)

名前 基本給 成果給 基本給 +成果給

ジョージ 4400 3000 7400

ターンブル 4050 5050 9100

式または関数で参照されるカラムに NULL 値が入っていた場合、結果には NULL 値が返ります。

7–2 高度な SELECTステートメント SQLガイド

dbMAGIC Ver.8.2

Page 51: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

7

例:

テーブル「社員マスタ」のレコードのうち、部門番号 40の部門に属する社員のレコードを取り出し、その

社員の名前、基本給、成果給、給与合計(基本給+成果給)を表示したい場合、次のようになります。

SELECT 名前, 基本給, 成果給, 基本給 + 成果給

FROM 社員マスタ

WHERE 部門番号 = 40

結果:

名前 基本給 成果給 基本給 +成果給

アレン 4300 2000 6300

ジョージ 4400 3000 7400

ターンブル 4050 5050 9100

オニール 4850

NULL関数

カラムの値として NULLが許可されており、また、実際にカラムに NULL 値が入っている場合、その NULL

値を別の値に置き換えて計算を行ったり、レポートを出力したいこともあります。たとえば、統計計算で

NULL 値の代わりに「0」や「1」を使いたいこともあります。また、レポートでは、NULL 値があった場合、

通常は空白が表示されますが、この空白をアスタリスクにしたり「該当なし」といった文字を表示したいこ

ともあります。こういったときには、ISNULL(Oracle 6では NVL)関数を使います。この関数では、カラ

ムに値が入っていたときにはその値を、値が入っていなかった(NULL だった)場合、式を使用して値を出

力できます。

NULLIF関数

NULLIF (式 1, 式 2)

NULLIF 関数では、式 1と式 2が評価され、その結果が等しかったときには、NULLが返ります。等しくない

場合、式 1が使われます。NULLIF 関数については、詳しくは、RDBMSのマニュアルを参照してください。

ISNULL関数

ISNULL (式, 値)

カラムの値が NULL だった場合、「値」に指定した値が使われます。

たとえば、次の場合、

ISNULL (国, ’なし’)

カラム「国」に値が入っていたときには国の名前が、値が NULL だったときには ’ なし ’ という文字列が返

ります。

SQLガイド

dbMAGIC Ver.8.2

7.1式 7–3

Page 52: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

例:

テーブル「社員マスタ」のレコードのうち、部門番号 40の部門に属する社員のレコードを取り出し、その

社員の名前、基本給、成果給、給与合計(基本給+成果給)を表示したい場合、次のようになります。この

ステートメントでは、カラム「成果給」の値が NULL だったときには、値として「0」が使われます。

SELECT 名前, 基本給, 成果給, 基本給 + ISNULL(成果給,0)

FROM 社員マスタ

WHERE 部門番号 = 40

結果:

名前 基本給 成果給 基本給 + ISNULL(成果給,0)

アレン 4300 2000 6300

ジョージ 4400 3000 7400

ターンブル 4050 5050 9100

オニール 4850 4850

結合関数

ベーステーブルの項目のうち、複数の項目を結合して結果を表示したいこともあります。こういったときに

は、結合関数を使います。結合関数では、データ型が文字の項目と文字定数の結合が可能です。

例:

テーブル「部門情報」の項目のうち、「部門名」と「場所(所在地)」の 2項目の値を結合して出力したい場

合、次のようにします。

SELECT 部門名 jj ’ - jj ’ 場所

FROM 部門情報

結果:

部門名 jj ’ - ’ jj場所

経理 -ロサンジェルス

マーケティング -サンフランシスコ

総務 -ノーフォーク

営業 -ニューヨーク

リサーチ -バークレー

7.2 複数のテーブルに対するクエリ

一度に複数のテーブルに対してクエリを実行し、その結果を取り出したいことも少なくありません。とくに、

リレーショナルデータベースの場合、物理的に別のテーブルであっても、論理的にデータを接続して取り出

せるため、この機能は便利です。たとえば、受注データは、通常、ヘッダテーブルと受注テーブルに置かれ

ているため、複数のテーブルに対するクエリが必要になることも普通です。

例:

製品の一覧のテーブル(「製品」)と、製品別の在庫データが格納されているテーブル(「在庫」)があったと

します。SQLでは、こういったとき、「製品」と「在庫」の 2つのテーブルに対してクエリを実行し、結果

を取り出すことができます。結果は、2つのテーブルのデータが結合されて出力されます。

7–4 高度な SELECTステートメント SQLガイド

dbMAGIC Ver.8.2

Page 53: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

7

複数のテーブルに対してクエリを実行する場合、各テーブルのカラムを指定しなければなりません。以下、

例を使用して説明しますが、ここでは、カラム「製品名」に製品の名称が格納されているものとします。

SELECT 製品名, 数量

また、クエリの実行先のテーブルは、「製品」と「在庫」ですので、テーブルの指定部は下のようになります。

FROM 製品, 在庫

続いて、2つのテーブルを結合します。ここでは、「製品 ID」というカラムを使用して結合します。

WHERE 製品.製品 ID = 在庫.製品 ID

上記のように、テーブルは、通常、「テーブル名.カラム名」という形式で結合できますが、データベースに

よっては多少異なることもあります。

注意:� �

WHERE句を使わなかったときには、テーブル「製品」の行がそれぞれ、テーブル「在庫」のすべての

行に対して結合されるという関係になります。� �

処理 -クエリの実行後、まず、下のように「製品名」と「数量」の 2つのカラムが結合されます。

製品 ID� 製品 ID� SID� 製品名 数量

1 1 10 ボルト 10

2 2 10 ナット 20

2 2 20 ナット 16

3 3 30 ネジ 20

* このデータは結果には出力されません。

SELECTステートメントでは、必要なだけカラムを指定できます。また、カラムの順番も必要に応じて変更

できます。以下は、SELECTステートメント全体です。

SELECT 製品名, 数量

FROM 製品, 在庫

WHERE 製品.製品 ID = 在庫.製品 ID

上記の SELECTステートメントでは、「製品名」、「数量」の順で結果が表示されます。

結果:

製品名 数量

ボルト 10

ナット 20

ナット 16

ネジ 20

7.3 グループ関数

SQLステートメントによるクエリでは、通常、行ごとに結果が返りますが、グループ関数を使うことで、複

数の行をグループ化し、そのグループに対して処理を行い、その結果を取り出すことができます。グループ

関数は、統計関数と呼ばれることもあります。

グループ関数としては、AVG、COUNT、MAX、MIN、SUMがあります。

SQLガイド

dbMAGIC Ver.8.2

7.3グループ関数 7–5

Page 54: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

構文:

SELECT カラム名,

関数 (カラム [, カラム])

FROM テーブル名

GROUP BY カラム名

例:

テーブル「社員マスタ」について、職種が営業である社員の給料の平均額、最高額、さらに、全員の給料の

合計を取り出したい場合、ステートメントは次のように記述します。

SELECT 平均給料, 最高給料, 給料合計

FROM 社員マスタ

WHERE 職種 = ’営業’

結果:

平均給料 最高給料 給料合計

4250 4400 12750

COUNT(*) この関数を使用して、行の数を取り出すことができます。

COUNT(カラム名) 同じく行数のカウントが可能ですが、この関数では、「カラム名」にカラムを指定し、そ

のカラムに実際にデータが格納されている行(NULL 以外の値が入っている行)の数をカウントで

きます。

例:

下の例では、テーブル「社員マスタ」の行(レコード)の数と、テーブルの行のうち、カラム「成果給」に

NULL 以外のデータが入っている行の数が出力されます。

SELECT COUNT(*), COUNT(DISTINCT成果給)

FROM 社員マスタ

結果:

COUNT(*) COUNT(成果給)

14 3

7.4 GROUP BY句 -グループ化して結果を出力

SELECT() FROM() <WHERE> <GROUP BY> <HAVING> <ORDER BY>

SELECTステートメントで、GROUP BY句を使うことで、カラムの値を基準にレコードをグループ化し、結

果を出力できます。GROUP BY句では、テーブルのレコードをカラムの値を使用して複数のグループに分け

ることができます。また、カラムは、複数指定することもできます。

■ GROUP BY句で指定したカラムが 1つの場合、そのカラムの値として同じ値を持った行が 1つのグ

ループとしてまとめられます。この場合、グループの数は、そのカラムに対して DISTINCTを実行し

たときに返る値と同じになります。

■ GROUP BY句で指定したカラムが複数の場合、まず、最初のカラムの値を基準に行がグループにまと

められ、続いて、そのグループに属する行が次のカラムの値を基準にグループにまとめられます。

7–6 高度な SELECTステートメント SQLガイド

dbMAGIC Ver.8.2

Page 55: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

7

グループ関数は、GROUP BY句で指定したカラムに対してのみ機能するように指定しなければなりません。

GROUP BY句で指定したカラムを SELECTステートメントで指定しなかったとき、または、別のカラムを

指定したときには、RDBMS側では、出力すべき行が認識されなくなります。

グループ関数を使わず、GROUP BY句で指定したカラム以外のカラムを SELECTステートメントで指定し

たときには、構文エラーが発生します。この場合、各グループについて 1行だけ行が取り出されます。

例:

テーブル「社員マスタ」について、各部門の部門番号と、各部門に属する社員の数を取り出したい場合、次

のように記述します。

SELECT 部門番号, COUNT(*)

FROM 社員マスタ

GROUP BY 部門番号

結果:

部門番号 COUNT(*)

10 3

20 2

40 4

50 5

例:

テーブル「社員マスタ」について、部門と職種を基準にレコードをグループ化し、各部門に属する社員の職

種と数を取り出したい場合、次のようにします。

SELECT 部門番号, 職種, COUNT(*)

FROM 社員マスタ

GROUP BY 部門番号, 職種

結果:

部門番号 職種 COUNT(*)

10 社長 1

10 マネージャ 1

10 事務 1

20 マネージャ 1

20 事務 1

40 マネージャ 1

40 営業 3

50 マネージャ 1

50 アナリスト 3

50 事務 1

7.5 HAVING句 -グループ検索条件

WHERE句では、クエリで返るレコードの条件を指定できますが、これと同じく、HAVING 句を使用して条

件を指定し、取り出す行を選択したり除外したりできます。HAVING 句は、サマリ(集計)関数と同じよう

な働きをし、通常、サブクエリ(2次照会)で使用します。

SELECT() FROM() <WHERE> <GROUP BY> <HAVING> <ORDER BY>

SQLガイド

dbMAGIC Ver.8.2

7.5 HAVING句 -グループ検索条件 7–7

Page 56: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

HAVING 句の書式は、WHERE句とほぼ同じです。つまり、キーワード HAVING を記述し、その右に条件を

指定します。この条件にしたがって、レコードがグループ化されます。

構文:

SELECT カラム名, 関数

FROM テーブル名

GROUP BY カラム名

HAVING 条件

例:

テーブル「社員マスタ」について、職種のうち、複数の社員が担当している職種を取り出し、各職種につい

て社員の平均年収を取り出したい場合、次のようにします。

SELECT 職種, 12*平均給料

FROM 社員マスタ

GROUP BY職種

HAVING COUNT(*) >2

結果:

職種 12*平均給料

アナリスト 49,300

事務 39,500

マネージャ 55,500

営業 51,000

テーブル「社員マスタ」の場合、職種をグループ化して取り出すと、全部で 5つ職種グループが返ります。

具体的には、アナリスト(3名)、事務(3名)、マネージャ(4名)、営業(3名)、社長(1名)となりま

す。上の SELECTステートメントでは、社員が複数いる職種だけをグループとして取り出しており、した

がって、社長という職種は割愛されます。このように、GROUP BYと HAVING を使うことで、条件に合致

するグループだけを取り出すことができます。また、上記では、月給の平均額に 12を掛けて平均年収を計算

していますが、このように、グループ関数による処理とともに計算を行うこともできます。

HAVING 句は、WHERE句とともに使うこともできます。WHERE句を使うことで、まず、任意の条件に合

致する行を選択し、その後、GROUP BYで行をグループにまとめることができます。さらに、HAVING 句

を使用して、さらに行を絞り込むことが可能です。

構文:

SELECT カラム名, 関数

FROM テーブル名

WHERE カラム名 = 式

GROUP BY カラム名

HAVING 条件

7–8 高度な SELECTステートメント SQLガイド

dbMAGIC Ver.8.2

Page 57: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

7

例:

テーブル「社員マスタ」について、部門のうち、その部門に属する社員の月給の合計額が$10,000を超える部

門を取り出したかったとします。ただし、職種が事務の社員のレコードは除外します。この場合、SELECT

ステートメントは次のようになります。

SELECT 部門番号,給与合計

FROM 社員マスタ

WHERE 職種 <>’事務’

GROUP BY 部門番号

HAVING 給与合計>10000

ORDER BY 2

結果:

部門番号 給与合計

10 10250

50 17025

40 17600

7.6 ネストされたSELECTステートメント

ネストされた SELECTステートメント(サブクエリともいいます)を使うことで、最初のクエリの結果をも

とに別のクエリを実行できます。ネストされた SELECTステートメントは、最初のクエリで返った値とサブ

クエリで返る値を比較したいときなどに必要になります。

たとえば、「受注」テーブルで、顧客の名前ではなく顧客番号で受注が記録されている場合、「ブラウン」と

いう名前の顧客から受けた注文をすべて取り出したいときには、ネストされた SELECTステートメントを

記述しなければなりません。つまり、まず、「顧客」テーブルから「ブラウン」の顧客番号を取り出し、その

後、「受注」テーブルから受注レコードを取り出すという手順が必要になります。

ネストされた SELECTステートメントは、処理速度が遅くなることから、できれば使わない方がいいのです

が、それでも必要なこともあります。なお、SQLでは、ネストレベルはいくつでも使用できます。

例:

たとえば、会社で最年長の社員を検索する場合、SELECTステートメントは次のようにネストにします。

なお、この検索は、インデックス順次 DBMSと RDBMSで処理が異なります。

インデックス順次 DBMS  

この検索は、2種類の方法を使用して可能です。まず、順次ファイルをスキャして最も大きい年齢を

検索し、その年齢の社員を順次、取り出すという方法があります。もう一つの方法は、ファイルを年

齢を使用して降順でソートし、最長年齢の社員を順次、取り出すという方法です。

RDBMS  

RDBMSの場合、インデックス順次DBMSと異なり、データの検索方法は指定できません。できるの

は、複数のレコードをグループとして扱うことだけです。このため、ネストされた SELECTステー

トメントを使用して、まず、最初のグループを取り出し、そのグループをもとに次のクエリを実行す

るという手順を使わなければなりません。

SELECT 名前, 年齢

FROM 社員情報

WHERE 年齢 = (SELECT 最長年齢 )

FROM 社員情報)

SQLガイド

dbMAGIC Ver.8.2

7.6ネストされた SELECTステートメント 7–9

Page 58: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

結果:

名前 年齢

メイジャー 43

オニール 43

上記の例では、43歳の社員が 2名いたため、この 2名が取り出されます。ここで、2名ではなく 1名だけを

取り出したいときには、さらに詳しい条件が必要になります。たとえば、誕生日を条件とすることで、1名

だけを取り出すことができます。

サブクエリ(ネストのクエリ)は、値が返る条件であれば、どんな条件の中でも使用できます。その場合、

条件で、単一の値が必要なときには、サブクエリでも単一の値が返るように記述しなければなりません。な

お、IN 関数や NOT IN関数は、本来、複数の値が返る関数であり、このためサブクエリで複数の値が返るこ

とがありますので注意が必要です。

7.7 データ変換

関数や比較式を使う場合、データ型の不一致という問題が起こることがあります。たとえば、データ型が文

字のカラムがあり、そのカラムに「1」が格納されているレコードをすべて取り出したい場合、「1」は数値

ではなく文字として扱い、比較しなければなりません。また、異なるカラムの値を比較してレコードを取り

出したい場合、一方のカラムのデータ型が数値で、もう一方のカラムのデータ型が文字ということもありま

す。こういったときにも、比較には注意が必要になります。

データ型が異なるカラムの値を比較する場合、データ型の変換が必要になります。この変換には、SQLの

データ変換関数が使えます。データ型変換関数としては、たとえば、ANSIの標準関数である CASTがあり

ます。この関数の書式は、「CAST (値 ASデータ型)」で、ここで「値」はカラム、「データ型」はデータ型を

表します。つまり、「カラム」の値が「データ型」のデータ型に変換されます。

例:

たとえば、「製品」と「在庫」という 2つのテーブルがあり、どちらにも「製品 ID」というカラムがあった

とします。また、どちらの「製品 ID」カラムもデータ型は文字だったとします。ここで、製品のうち、「在

庫」テーブルの「数量」カラムの値(データ型は数値)が、製品 IDの値に 10を掛けた値に等しい製品の名

前を取り出すとします。この場合、SELECTステートメントは、次のようになります。

SELECT 製品名

FROM 製品, 在庫

WHERE 在庫.製品 ID = 製品.製品 ID

AND 数量 = 10*CAST (在庫.製品 ID AS integer)

結果:

製品名 数量

ボルト 10

ナット 20

RDBMSでは、一般に、比較対象となる 2つのカラムのデータ型が異なる場合、デフォルトの変換関数を使

用して自動的に変換が行われます。このため、場合によっては、結果が異常になることもあります。

例:

入社日が 1994年 5月 1日よりも前の社員をすべて取り出したい場合、次のようになります。

SELECT *

FROM 社員情報

WHERE 入社日 <’1-MAY-1994’

RDBMSの場合、上記のステートメントの’1-MAY-1994’ は自動的に日付データに変換され、比較が行われ

ます。

7–10 高度な SELECTステートメント SQLガイド

dbMAGIC Ver.8.2

Page 59: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

7

結果:

社員

番号

名前 職種 マネージャ 入社日 給料 手数料 年齢 部門番号

3567 アレン 営業 3970 15-Apr-85 4300 2000 33 40

3891 ジョージ 営業 3970 1-Jan-94 4400 3000 32 40

3092 ターンブル 営業 3970 15-Jun-93 4050 5050 40 40

3667 マークソン 事務 3373 17-Oct-90 3000 27 50

3559 ジョーダン アナリスト 3408 3-May-89 4250 30 50

3123 ウオーカー 社長 13-Mar-85 5500 40 10

3472 メイジャー マネージャ 3123 2-Feb-93 4750 43 10

3373 クレイン マネージャ 3123 2-Dec-87 3900 41 50

3162 バートン 事務 3162 4-Aug-89 4200 35 20

3408 エイデン 事務 31620 22-Jan-92 4700 33 50

3582 アントン アナリスト 3408 15-Mar-93 3500 42 20

3115 カーライル 27-Jul-91 3375 22 10

3012 ボンフィーリオ 4175 42 50

なお、RDBMSによっては、カラムのデータ型が文字に変換されることもあり、その場合、結果が不適当に

なることもあります。以下は、不適当な結果が返った例です。

例:

社員

番号

名前 職種 マネージャ 入社日 給料 手数料 年齢 部門番号

3567 アレン 営業 3970 15-Apr-85 4300 2000 33 40

3891 ジョージ 営業 3970 1-Jan-94 4400 3000 32 40

3092 ターンブル 営業 3970 15-Jun-93 4050 5050 40 40

3667 マークソン 事務 3373 17-Oct-90 3000 27 50

3123 ウオーカー 社長 13-Mar-85 5500 40 10

3472 メイジャー マネージャ 3123 13-Mar-85 4750 43 10

3115 カーライル 事務 31620 15-Mar-93 3375 22 10

3970 オニール マネージャ 3123 15-May-94 4850 43 40

以上のように、RDBMSでデフォルトの変換が実行されると、結果が異常になることもあります。このため、

データ型が異なるカラム同士で比較を行う場合、または、データ型が異なる定数とカラムで比較を行う場合

には、セグメントでデータ型を変換するのが適当です。

7.8 SQLでのプログラミング

結果セットから行を取り出す場合、カーソルを定義しておくことが必要です。SQLでは、結果が返ったSELECT

ステートメント自体がカーソルとなります。カーソルの定義と行の取り出しの手順は、次のようになります。

1. カーソルを定義します。

2. カーソルをオープンします。

3. カーソルから行をフェッチします。

4. カーソルを閉じます。

結果セットの行は、上記のステップ 3で取り出されます。行が複数ある場合、順次、取り出されます。なお、

後方フェッチは実行されません。

SQLガイド

dbMAGIC Ver.8.2

7.8 SQLでのプログラミング 7–11

Page 60: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

7–12 高度な SELECTステートメント SQLガイド

dbMAGIC Ver.8.2

Page 61: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第8章 データの変更—挿入、削除、更新章目次8.1 INSERT : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :8–2

8.2 DELETE : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 8–3

8.3 UPDATE : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 8–4

Page 62: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第8章 データの変更—挿入、削除、更新

SQLには強力なデータ操作言語(DML)が搭載されています。この言語を使うことで、データベースのデー

タの取り出しのほか、変更も可能です。主なデータ操作関数としては、INSERT、DELETE、UPDATEがあ

ります。

8.1 INSERT

INSERTステートメントを使用して、テーブルに新規の行を追加することができます。INSERTステートメ

ントの使い方としては、次の 2種類があります。

■ 1行の挿入。値も指定できます。

■ 複数行の挿入。ほかのテーブルの既存の行を任意のテーブルに挿入できます。

行の挿入先となるテーブルは、INTO句を使用して指定します。また、その右にカラムを複数、コンマで区切っ

て指定することもできます。指定したカラムには、VALUES句を使用して値を指定できます。この VALUES

句で指定した値が、INTO句のカラムに格納されます。

カラムの指定は省略することもでき、その場合、VALUES句で指定した値が、その順番でテーブルのカラム

に順に入れられます。また、カラムに NULL の格納が許可されている場合、そのカラムに NULL を入れるこ

ともできます。さらに、テーブルの特定のカラムに値を入れたくないときには、そのカラムの名前を省略し

ます。

INSERTステートメントを使用して 1行を挿入する場合、構文は次のようになります。

構文:

INSERT INTOテーブル名 [(カラム 1, カラム 2, . . .)]

VALUES (値 1, 値 2, . . .)

例:

たとえば、営業社員が入社し、そのデータを「社員情報」テーブルに入力したかったとします。入力するデー

タは、次の通りです。

名前 ジャック・ヘンリー

年齢 36

社員番号 3205

マネージャ オニール

給料 4000

コミッション 新規入社のためなし

部門 営業

ステップ 1:

上記の場合、まず、次のようにして INSERTステートメントを使用して「ジャック・ヘンリー」のデータを

「社員情報」データベースに入力します。

INSERT INTO社員情報

(社員番号, 名前, 職種, マネージャ, 入社日,

給料, コミッション, 年齢, 部門番号)

VALUES (3205,ヘンリー, ’営業’, 3970,

’28-Jul-94’, 4000, NULL, 36, 40)

結果:レコードが 1行追加されます。

8–2 データの変更—挿入、削除、更新 SQLガイド

dbMAGIC Ver.8.2

Page 63: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

8

ステップ 2:

続いて、ヘンリーのデータが正常に入力されたかどうかチェックします。

SELECT *

FROM 社員情報

WHERE 社員番号 = 3205

結果:

社員番号 名前 職種 マネージャ 入社日 給料 コミッション 年齢 部門番号

3205 ヘンリー 営業 3970 28-Jul-94 4000 36 40

また、INSERTステートメントを使用して複数の行を挿入したい場合、構文は次のようになります。

構文:

INSERT INTOテーブル名 [(カラム 1,カラム 2, . . .)]

例:

たとえば、「総在庫」というテーブルに「製品番号」と「合計」というカラムがあるとします。

この「総在庫」テーブルに、「在庫」テーブルに記録されている在庫の合計を製品別に入れたい場合、INSERT

ステートメントは次のようになります。

INSERT INTO 総在庫 (製品番号, 合計)

SELECT 製品番号, SUM(数量)

FROM 在庫 GROUP BY製品番号

結果:「総在庫」テーブルに、4つの行(製品は 4種類です)が挿入されます。

8.2 DELETE

DELETEステートメントを使用して、テーブルの行を指定し、その行を削除できます。

構文:

DELETE FROM テーブル名

[WHERE 条件]

FROM句には、テーブルの名前を指定します。このテーブルの行が削除されます。WHERE句では、テーブ

ルの中の削除対象の行を指定します。

注意:� �

DELETEステートメントではWHERE句を省略することもできますが、省略した場合、指定したテーブ

ルのすべての行が削除されます。� �

例:

「社員情報」テーブルの行(レコード)のうち、退職した社員の行を削除する場合、次のようにします。

ステップ 1:

まず、SELECTステートメントを使用して、削除するレコードを確かめます。

SELECT * FROM社員情報 WHERE社員番号 = 3205

結果:

社員番号 名前 職種 マネージャ 入社日 給料 コミッション 年齢 部門番号

3205 ヘンリー 営業 3970 28-Jul-94 4000 36 40

SQLガイド

dbMAGIC Ver.8.2

8.2 DELETE 8–3

Page 64: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

ステップ 2:

レコードを削除します。

DELETE FROM社員情報

WHERE 社員番号 = 3205

結果:レコードが 1行削除されます。

ステップ 3:

レコードが削除されたかどうかチェックします。

SELECT *

FROM 社員情報

WHERE 社員番号 = 3205

結果:

社員番号 名前 職種 マネージャ 入社日 給料 コミッション 年齢 部門番号

データは見つかりません。

8.3 UPDATE

UPDATEステートメントを使用して、テーブルのレコードのカラムを指定し、そのカラムの値を変更でき

ます。

構文:

UPDATE テーブル名

SET カラム 1 = 値 1, カラム 2 = 値 2 . . .

[WHERE 条件]

UPDATEステートメントでは、WHERE句を使用して行を選択することもできます。SET句では、値を変更

するカラムと、変更後の値を指定します。

以下は、WHERE句を使用して「社員情報」テーブルの特定社員のレコードを指定し、そのレコードの「給

料」カラムの値を変更するときの例です。

例:

ステップ 1:

社員番号が 3123の社員の給料を 3%引き上げます。

UPDATE 社員情報

SET 給料= 1.03 * 給料

WHERE 社員番号 = 3123

8–4 データの変更—挿入、削除、更新 SQLガイド

dbMAGIC Ver.8.2

Page 65: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

8

結果:

指定したレコードの「給料」カラムの値が変更されます。

ステップ 2:

値が変更されたかどうかチェックします。

SELECT *

FROM 社員情報

WHERE 社員番号 = 3123

結果:

社員番号 名前 職種 マネージャ 入社日 給料 コミッション 年齢 部門番号

3123 ウオーカー 社長 13-Mar-85 5665 40 10

以下は、WHERE句を使用して複数の行を指定し、カラムの値を変更するときの例です。なお、WHERE句

を記述しなかったときには、指定したテーブルのすべてのレコードに対して変更が実行されます。

例:

ステップ 1:

職種を示す名前として「営業」が使われていますが、この名前を「営業担当」に変えたい場合、次のように

します。

UPDATE 社員情報

SET 職種= 営業担当’

WHERE 職種 = ’営業’

結果:

3つのレコードの「職種」カラム値が「営業」から「営業担当」に変更されます。

ステップ 2:

テーブルの値が変更されたかどうかチェックします。

SELECT *

FROM 社員情報

WHERE 職種 LIKE ’S\%(職\%)’

結果:

社員番号 名前 職種 マネージャ 入社日 給料 コミッション 年齢 部門番号

3567 アレン 営業担当 3970 15-Apr-85 4300 2000 33 40

3891 ジョージ 営業担当 3970 01-Jan-94 4400 3000 32 40

3092 ターンブル 営業担当 3970 15-Jun-93 4050 5050 36 40

SQLガイド

dbMAGIC Ver.8.2

8.3 UPDATE 8–5

Page 66: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

8–6 データの変更—挿入、削除、更新 SQLガイド

dbMAGIC Ver.8.2

Page 67: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第9章 データの整合性章目次9.1 データの整合性を維持するための制約 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 9–2

9.2 参照整合性 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 9–2

9.3 データベースで使用できる制約 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 9–3

9.4 ストアドプロシージャとトリガ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 9–3

Page 68: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第9章 データの整合性

データの整合性とは、データベース中でデータが正常で完全な形で格納されている状態をいいます。

9.1 データの整合性を維持するための制約

DBMSには、通常、データの整合性を維持するための制約機能が搭載されています。この制約機能により、

データベースに格納されるデータの一貫性と精度が保証されます。たとえば、データベースにデータを挿入

する場合、そのデータをチェックしてから実際に挿入するといったことが可能になります。このほか、各種

の制約機能が用意されています。以下、順に説明します。

単一のテーブルに関する制約機能

必須データ … データベースのカラムのうち、任意のカラムの値が有効かどうかをチェックする

機能です。チェックは、すべての行について実行されます。

検証チェック … データベースのカラムに複数の値(値セット)のいずれかが入る場合、カラムの

値が、その複数値の中のいずれかかどうかをチェックする機能です。値セットは、

ドメインと呼ばれることもあります。

エンティティ整合性 … テーブルの主インデックスの値が、ユニークな値であるかどうかをチェックする

機能です。チェックは、すべての行について実行されます。

複数のテーブルに関する制約機能

参照整合性 … リレーショナルデータベースの場合、子テーブルに外部キーを設定し、親テーブルに

フォリンキーに対応する主キーを設定することで行と行とのリンクが可能ですが、こ

のリンクが正常であることを参照整合性と呼びます。

ビジネスルール … ビジネスツールをもとにデータベースに対する更新を制御できます。データベースの

更新は実社会のトランザクションに基づいて行われますが、このトランザクションを

管理する規則をビジネスルールといいます。

一貫性 … 実社会のトランザクションに伴い、通常、データベースに対する更新も数多く実行さ

れます。更新は複数のテーブルに関連しており、このため、各テーブルのデータは、

それぞれ相互に一貫性を保って保存されていなければなりません。

現在の ANSI標準では、上記のような制約機能は、テーブルの作成や変更の際に定義できるようにすること

が求められています。

9.2 参照整合性

テーブルのカラムのうち、特定の行を識別できるようなカラム(つまり、ユニークなデータが格納されてい

るカラム)をテーブルの主インデックスと呼んでいます(主インデックスは、ユニークインデックスともい

われます)。テーブルの主インデックスは、別のテーブルから参照が可能ですが、別のテーブルのカラムの

うち、参照に使われるカラムを外部インデックスと呼びます。主インデックスと外部インデックスと間の参

照関係を維持することを参照整合性の維持といいます。参照整合性の維持は、とくに、RDBMSで必要にな

ります。市販されている RDBMSでは、程度の差はありますが、参照整合性の維持機能が搭載されてます。

9–2 データの整合性 SQLガイド

dbMAGIC Ver.8.2

Page 69: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

9

実際、RDBMSの場合、参照整合性の維持機能に対する要望は次第に大きくなってきており、それに併せて、

維持機能の定義言語も開発が進んでいます。現在では、インデックスと参照に関する定義は、テーブルの作

成時に同時に行うことができ、この方法は、宣言型参照整合性(の維持)などと呼ばれています。

9.3 データベースで使用できる制約

データベースではそれぞれ、制約機能がサポートされています。制約機能は、通常、テーブルの宣言と併せ

て定義できます。また、宣言型参照整合性の形で指定できることもあります。以下、制約機能に関する定義

について説明します。

主インデックス … 特定の行(レコード)の識別が可能なカラムで、通常、このカラムを使用して

行にアクセスすることになります。主インデックスは、複数設定することもで

きます。

重複不可インデックス … 主インデックスと同じく、特定の行の識別が可能なカラムです。重複不可イン

デックスは、複数設定することもできます。

外部インデックス … テーブルのカラムのうち、そのテーブルの行と別のテーブルの行との間のリン

クに使われるカラムです。外部インデックスは、通常、別のテーブルの主イン

デックスと関連しています。

以上の制約機能は、いずれも、テーブルの全カラム、または指定したカラムに対して入力できる値を限定す

るという方法で実現されます。また、現在の ANSI標準では、この制約機能の定義は、テーブルの作成また

は変更の際に行えることが要求されています。

デフォルト値 … INSERTステートメントでカラムを指定しなかった場合、カラムにデフォルト値が自動的

に入れられる機能です。

例:

テーブル「TEST1」の作成

(FLD1 char(1) default ’1’not null unique

FLD2 integer primary key)

テーブル「TEST2」の作成

(FLD1 char (1) default ’2’ null check (FLD1’1’)

FLD2 integer foreign key references TEST1.FLD2)

9.4 ストアドプロシージャとトリガ

ストアドプロシージャ

宣言型参照整合性がまだ開発されていなかった頃、ビジネスルールに対する要望が強まりましたが、そんな

状況の中で考え出されたのがデータベーストリガ技術です。データベーストリガ技術の一つとして、ストア

ドプロシージャがあります。このストアドプロシージャは、上で紹介した制約機能を実現する上で有効です。

また、ストアドプロシージャを使うことで、データ構造だけでは管理できないビジネスルールを使用できる

ようになりますし、ネットワークトラフィックの軽減にも有効です。

ストアドプロシージャは、その形式は複数の SQLステートメントの集合で、別の SQLステートメントから

呼び出すことができます。そのほか、dbMAGICなど、SQL以外のコマンド言語を使用して呼び出すことも

できます。ストアドプロシージャは、通常、データベースで使われるビジネスルールを強化したい場合に使

います。また、手続き言語を使用して、ストアドプロシージャの機能を補完することもできます。

SQLガイド

dbMAGIC Ver.8.2

9.3データベースで使用できる制約 9–3

Page 70: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

ストアドプロシージャは、プロシージャまたは関数の形でデータベース内に保存されます。データベースに

よって、ストアドプロシージャの扱いは異なります。たとえば、データベースによっては、ストアドプロシー

ジャはコンパイル済みコードとして保存されます。ストアドプロシージャの作成に使う言語は、標準は決まっ

ていませんが、基本規則はほぼ同じです。データベースに対して SQLコマンドを使用してアクセスが可能な

ソフトウエアであれば、ストアドプロシージャにもアクセスが可能です。

以下は、データベースシステムがそれぞれ、Oracle、MS-SQLの場合のストアドプロシージャの記述例です。

Oracleの場合:

Create or replace procedure sp1

(p1 char in, p2 integer out)

as

begin

update table1 set fld1 = fld1(7 where fld1 = p1;

select fld2 into p2 where fld1 = p1;

end sp1;

MS-SQL Serverの場合:

Create procedure sp1 @ p1 char(5)

as

begin

insert into table1 values (’a’,@p1)

select fld2 from table2 where fld1=@p1

end

ストアドプロシージャの実行

MS-SQL Serverなどの RDBMSでは、ストアドプロシージャは、SELECTステートメントと同じようにして

実行できます。ストアドプロシージャの中で SELECTステートメントを使い、その SELECTステートメン

トで複数の行が返った場合、各行をフェッチできます。これは、SELECTステートメントのカーソルがある

ためです。Oracleでは、ストアドプロシージャを実行すると、通常は単一の行が返ります。ただし、複数の

行が返るようにすることもできます。

例:

Oracleの場合

execute sp1(p1,p2)

MS-SQL Serverの場合

sp1(’hello’)

結果:

Fld1/hello

トリガ

データベーストリガとは、データベースイベント( INSERT、UPDATE、DELETEなどのステートメントに

よる処理)を実行できる処理をいい、SQLステートメントのほか、ストアドプロシージャを実行させること

もできます。

9–4 データの整合性 SQLガイド

dbMAGIC Ver.8.2

Page 71: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

9

データベーストリガは、とくに、データベースのいずれかの場所でデータの更新を実行すると、そのほかの場

所でも更新が引き起こされるような処理に有効です。たとえば、トリガは、次のような処理に利用できます。

■ 既存の受注テーブルに新規の行を追加する処理。この場合、受注テーブルの受注合計の値が更新され

ます。

■ 在庫テーブルの行を削除する処理。この場合、通常、在庫数量のチェックが行われ、在庫数量が一定の

レベルを下回ると、レポートが出力されます。

構文:

Create trigger trig1 table1

on table1 for update

as

begin

update table2 set table1.fld2=

table1.fld2+updated.fld2

where

table1.fld1=updated.fld1

注意:� �

トリガの記述方法は、RDBMSによって異なります。トランザクションの種類によっては、通常のアプ

リケーションの手法よりもデータベーストリガやストアドプロシージャを使った方が効率よく処理でき

ることがあります。トランザクションについては、このあと詳しく解説します。� �

SQLガイド

dbMAGIC Ver.8.2

9.4ストアドプロシージャとトリガ 9–5

Page 72: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

9–6 データの整合性 SQLガイド

dbMAGIC Ver.8.2

Page 73: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第10章 トランザクション章目次10.1 トランザクションのメカニズム : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :10–2

10.2 分離レベル : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :10–3

10.3 ロックレベル : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :10–4

10.4 ロックの実行 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :10–5

10.5 ロック有効時間 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :10–5

Page 74: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第10章 トランザクション

トランザクションは、データベースに関する何らかの処理で、単一もしくは複数の SQLステートメントで構

成されます。トランザクションを構成する SQLステートメントは、通常、相互に密接に関連していますが、

実際には別個に独立して機能します。トランザクションを構成する SQLステートメントは、トランザクショ

ンの中の論理単位と考えることもできます。トランザクション内の SQLステートメントは、それぞれ、その

トランザクションのタスクの一部を担当し、こういった SQLステートメントが集まって単一のトランザク

ションが成り立ちます。単一のトランザクションは、このように独立した論理単位としてまとめられている

ため、DBMS側で一度に実行されます。つまり、DBMS側から見ると、トランザクションを構成する SQL

ステートメントは、その処理の流れが一貫していることが必要になります。

アプリケーションで、データベース中の複数のテーブルに対して更新を行う場合、トランザクションはデー

タベースの整合性に注意して定義しなければなりません。

10.1 トランザクションのメカニズム

トランザクションでは、ROLLBACKステートメントとCOMMITステートメントを使用できます。ROLLBACK

ステートメントを使うことで、トランザクション処理が正常に終了しなかった場合、データの状態をトラン

ザクションが開始される前の状態に戻すことができます。また、COMMITステートメントを使うことで、そ

れまで実行されたトランザクション処理利の内容を確定(保存)することができます。

SQLとリレーショナルデータベースでは、その機能上、単一の更新は単一のテーブルに対してのみ有効です。

また、複数の更新ステートメントの順次実行はできないため、2つの更新ステートメントを使う場合、その

2つのステートメントを同時に実行しなければなりません。また、2つの更新ステートメントは、更新が成

功したときにはコミット(COMMIT ステートメント)を、失敗したときにはロールバック(ROLLBACKス

テートメント)を行う必要があります。

単一のトランザクションで更新を複数回、実行する場合、そのトランザクションは COMMIT ステートメ

ントで確定するか、ROLLBACK ステートメントでロールバックしなければなりません。トランザクション

の宣言後、そのトランザクションで実行されたステートメントはすべて、COMMIT ステートメントまたは

ROLLBACK ステートメントで終了することになります。

2フェーズコミット

複数のデータベースがネットワーク上の複数のノード(ワークステーションまたはサーバ)に置かれており、

その複数のデータベースのテーブルに対して更新を行った場合、問題が起こることがあります。この問題は、

2フェーズコミット(2PC)プロトコルで解決できます。現在、2フェーズコミットプロトコルは、その機能

や内容は異なりますが、各種の RDBMSでサポートされています。

更新対象のテーブルが複数で、しかも異なるネットワーク上に置かれており、また、別々のサーバで管理さ

れている場合、通常、トランザクションの終了手法として 2フェーズコミットが使われます。

2フェーズコミットでは、その名前の通り、コミットが 2度にわたって行われます。この場合、まず、最初の

COMMIT ステートメントがすべてのサーバに対して送出されます。この後、送出された COMMIT ステート

メントの処理が完了すると、次の COMMITステートメントが送出されます。ここで、ネットワークに異常が

発生したときには、処理に関連するレコードがロックされます。現在では、ほとんどの RDBMSで 2フェー

ズコミットがサポートされています。ただし、2フェーズコミットは、その RDBMSのデータベースやサー

バでのみ有効になっています。

10–2 トランザクション SQLガイド

dbMAGIC Ver.8.2

Page 75: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

10

データレプリケーション

データレプリケーションは、2フェーズコミットに代わる手法です。2フェーズコミットと同じく、データ

ベースが複数ある場合に行います。この方法は、リソースへの負担も少ないため、かなり普及しています。

通常、リモートのテーブルがいくつかあるものの、同時更新が必要ないときに、このレプリケーションを使

います。

レプリケーション手法は、主に、テーブルの更新があまり必要なく、また、ネットワークのアーキテクチャの

性質上、異なるノードにそれぞれデータのコピーを置いておかなければならない時に行います。こういった

場合、通常、トランザクションでコピーを更新することになります。トランザクションでコピーを更新して

いる際にネットワークエラーが発生することがありますが、データを常に最新の状態にしておく必要がない

ときには、その後、機を見てコピーの更新を行えば済みます。つまり、ネットワークエラーが発生したから

といってロールバックを行う必要はありません。ネットワークエラーが解消した後で、手動でコピーを更新

すればいいことになります。なお、レプリケーションの方法は、データベースシステムによって異なります。

レプリケーションの方法にはいろいろありますが、基本的には、次のような条件を勘案して、適当な方法を

選ぶことになります。

■ 2つのテーブルのデータがどちらも同じでなればならないかどうか。

■ クエリは、いずれかのテーブルに対してだけ実行されるか、または 2つのテーブルに対して実行され

るかどうか。

■ テーブルの同期(データの同一化)の頻度。

■ 更新時にコンフリクトが発生したときの処理。

■ データベース全体を複製しなければならないか、または、一部で十分かどうか。

ロック

データの整合性は、レコードをロックすることで維持されます。また、このロックにより、ユーザは内容が正

確なデータの閲覧が可能になるとともに、最大限の同時並行処理も実現されます。ロックされているレコー

ドは、ユーザにとっては表示はできますが、データの変更はできません。また、ロックには、排他ロックと共

有ロックがあります。排他ロックとは、その時点でアクセスしていないユーザは、ロックされているレコー

ドを見ることもできないロックをいいます。一方、共有ロックでは、アクセスしているユーザ以外のユーザ

は、変更はできないものの表示は可能です。

トランザクションもそうですが、ロックも RDBMS側で実行されます。SQLデータベースは本来、マルチ

ユーザ環境で動作し、そのため、ロック機能に柔軟性がない場合、ユーザのアクセスが必要以上に制限され

てしまいます。こういったことから、RDBMSにはいずれも、ロックレベルを操作できる機能が搭載されて

います。

ISAMでは、レコードはユーザが更新を開始すると同時にロックされ、その後、ユーザがレコードを離れる

とロックが解除されます。RDBMSでは、トランザクションの開始とともにレコードがロックされ、コミッ

トまたはロールバックが実行された時点でロックが解除されます。

10.2 分離レベル

分離レベル(アイソレーションレベル)を使用して、同時並行トランザクションの実行中(複数のトランザ

クションの同時実行中)に許可される処理を指定できます。SQLでは、次の 3種類の分離レベルを指定でき

ます。

SQLガイド

dbMAGIC Ver.8.2

10.2分離レベル 10–3

Page 76: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

■ダーティリード … この分離レベルでは、トランザクションの実行中、検出されたレコードが別

のトランザクションによって変更されていた場合でも、また、未コミットの

場合でも、そのレコードが読み込まれます。したがって、同時並行処理はス

ムーズに実行されますが、データの一貫性という点では不利になります。

■ ノンリピータブルリード … この分離レベルでは、トランザクションの実行中、テーブルの同じレコー

ドが 2回読み込まれるようになります。2度目の読込は、複数のトランザク

ションによる読込処理の間に、いずれかのトランザクションにより行のレ

コードが変更またはコミットされたときに実行されます。ノンリピータブル

リードの場合、データの一貫性は保たれますが、同時並行処理には不利にな

ります。

■ファントム … この分離レベルでは、トランザクションの実行中、一定範囲のデータが 2回

読み込まれるようになります。2度目の読込は、複数のトランザクションに

よって一定範囲のデータが読み込まれている場合、いずれかのトランザク

ションにより新規の行が挿入され、その処理がコミットされたときに実行さ

れます。

以下は、分離レベルと、そのレベルで許可される処理をまとめたものです。

分離レベル ダーティリード許可 ノンリピータブルリード許可 ファントム許可

ダーティリード(0) 有効 有効 有効

ノンリピータブルリード(1) 無効 有効 有効

ファントム(2) 無効 無効 有効

シリアライズ(3) 無効 無効 無効

分離レベルの設定

ほとんどの RDBMSでは、分離レベルはデフォルトでは「1」に設定されています。このデフォルトの分離レ

ベルは、ユーザが変更することができます。分離レベルの変更は、セッション中に行えますし、SELECTス

テートメントのレベルで指定することもできます。たとえば、MS-SQL Serverの場合、次のようにすると、

Set isolation level = 0

分離レベルは、「ダーティリード」になります。

10.3 ロックレベル

RDBMSでは、一般にビュー構造がロックされます。このロックは自動的に行われ(デフォルトのロックで、

非明示ロックなどと呼ばれます)、そのため、ユーザによるデータの変更を防ぐことができます。このデフォ

ルトのロックは上書きすることができます(このロックは明示ロックと呼ばれます)。

非明示ロックは、SQLステートメントが実行されると自動的に実行されます。たとえば、INSERTステート

メント、UPDATEステートメント、DELETEステートメントが実行されると、非明示ロックが自動的に実行

されます。このロックにより、トランザクションの実行中、データの一貫性と整合性が維持されます。

Oracleなどの RDBMSでは、レコードレベルでロックが実行されます。また、MS-SQLでは、ページレベル

でロックが実行され、このため、同じページに属しているレコードはすべてロックされます。

レコードレベル、ページレベルのどちらの場合も、非明示ロックが実行されると、テーブルレベルでロック

がかけられます。このテーブルレベルのロックにより、ほかのトランザクションによるテーブルのロックを

防ぐことができます。この場合のロックには、排他ロックと共有ロックがあります。

10–4 トランザクション SQLガイド

dbMAGIC Ver.8.2

Page 77: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

10

高いロックレベル

RDBMSによっては、特定のレベルでロックが多数実行されている場合、自動的に高いレベル(たとえば、

テーブルレベルのロック)にロックレベルが引き上げられることもあります。このようにロックのレベルが

引き上げられると、実行されるロックの数が減ります。ただし、ロックの対象となる要素の数は増えます。

10.4 ロックの実行

明示ロックは、非明示ロックと同じレベルで実行できます。たとえば、RDBMSが Oracleの場合、更新処理

を実行すると、非明示ロックは排他ロックになります。この場合、明示ロックを使うことでロックを共有ロッ

クにすることもできます。

たとえば、RDBMSが Oracleで、

select * from table where ... for update

というステートメントを実行した場合、非明示ロックは共有ロックとなります。この後、レコードは、ロッ

クが解除されるまで更新できなくなります。

10.5 ロック有効時間

データのロックは、トランザクションの実行中のいずれかの時点で実行されます。その後、ロックは、コミッ

トまたはロールバックが実行されるまで有効な状態が続きます。したがって、ロックは、トランザクション

の実行中は解除されることはありません。

例:

begin transaction;

update table set fld1=1 where fld2=2

update table set fld1=3 where fld2=4

both records are locked with an exclusive lock

commit * both records are released

SQLガイド

dbMAGIC Ver.8.2

10.4ロックの実行 10–5

Page 78: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

10–6 トランザクション SQLガイド

dbMAGIC Ver.8.2

Page 79: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第11章 システムテーブルとセキュリティ章目次11.1 システムテーブル : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :11–2

11.2 システムテーブルと機能 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :11–2

11.3 システムテーブルの使用方法 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :11–3

11.4 MS-SQL Serverのシステムプロシージャ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 11–4

11.5 セキュリティ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :11–4

11.6 オペレーティングシステムのユーザ名 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :11–5

11.7 システム権限の付与と取消 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :11–5

Page 80: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第11章 システムテーブルとセキュリティ

データベースにはそれぞれデータ辞書があり、このデータ辞書の中にはシステムテーブルとデータベース

ビューが置かれています。システムテーブルやデータベースビューは、いずれも読込専用になっています。シ

ステムテーブルは複数あり、たとえば、セキュリティ情報が格納されているものもいくつかあります。RDBMS

では、ユーザの種類を定義したり、必要に応じてユーザに権利を付与することができますが、そのセキュリ

ティ情報は、こういったシステムテーブルに保存されます。

11.1 システムテーブル

データ辞書は、データベースの作成時に自動的に作成されます。また、CREATE TABLEなど、テーブルに

関する処理が実行されると自動的に内容が更新されます。このデータ辞書の定義により、データベースの処

理も変わってきます。データ辞書には、ベーステーブルのデータに関する情報も記録されています。ベース

テーブルのデータに関する情報は、RDBMS自体が動作するのに必要で、そのため、RDBMSにより必要な

場合にデータ辞書の書込や変更が実行されます。

データベースの動作中、RDBMSによりデータ辞書の内容が読み込まれ、オブジェクトが実際に存在するか

どうかや、オブジェクトにアクセスするユーザに所定のアクセス権が与えられているかどうかがチェックさ

れます。データ辞書のシステムテーブルのデータは、通常、ユーザが変更できないようにしておかなければ

なりません。ただし、監査(オーディット)が有効なときには、監査テーブルのデータは変更可能にしてお

いてかまいません。

データ辞書のデータベースビューには、多くの場合、パブリックシノニムが用意されており、操作が便利に

なっています。データ辞書の構造は、RDBMSによって異なります。

データ辞書のデータベースビューは、データベースの全ユーザが参照用として使用できます。ビューに対し

ては、ユーザは、SELECTステートメントを使用してアクセスできます。データ辞書は、そのデータ辞書に

関連するデータベースがオープンしているときには、いつでもアクセスが可能です。

11.2 システムテーブルと機能

Oracleのデータ辞書

Oracleのデータ辞書は、複数のビューで構成されています。通常のビューは 3つで、内容はいずれもほぼ同

じですが、名前が異なります。3つのビューは、次の通りです。

■ USER… ユーザのプロファイル(ユーザ情報)が記録されています。

■ ALL … 個々のユーザのアクセス権に関する情報が記録されています。

■ DBA … 全ユーザのアクセス権に関する情報が記録されています。

上記の 3つのビューは、いずれもカラムの構成はほぼ同じですが、厳密には次の点が異なります。

■ 「USER」ビューには、通常、「OWNER」カラムがありません。

■ 「DBA」ビューには、場合によってはカラムが追加され、ここに必要な情報が格納されることがあり

ます。

11–2 システムテーブルとセキュリティ SQLガイド

dbMAGIC Ver.8.2

Page 81: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

11「USER」ビューでは、次のような処理が可能です。

■ データベースに関するユーザの個人情報を取得できます。

■ 特定のユーザについて、レコードを表示できます。

■ パブリックシノニム(簡略化した別名)を置いておくことができます。

MS-SQL Serverのデータ辞書

MS-SQL Serverの場合も、Oracleと同じくシステムテーブルが使われます。ただし、構造と名前が異なり

ます。

上記の 4つの RDBMSでは、システムテーブルの名前は「sys +オブジェクト名」の形式で付けられます。こ

こで「オブジェクト名」は、テーブル、ビュー、インデックス、オブジェクトなどを表します。

MS-SQL Serverでは、オブジェクトにはそれぞれ IDがあり、この IDを使用してオブジェクトが認識されま

す。また、他のテーブルとのリンクにも使われます。

11.3 システムテーブルの使用方法

システムを使用して、データベースの構造やデータベースオブジェクトに関する情報を取り出すことができ

ます。入手できる主な情報は、次の通りです。

■ ビューの作成に使われる SELECTステートメントの内容。

■ テーブルのカラムのデータ型とサイズ。

■ ストアドプロシージャ、トリガの内容。

たとえば、テーブルの名前が分かっており、そのテーブルのインデックスに関する情報を見たい場合、次の

SELECTステートメントを実行します。

MS-SQL Serverの場合:

Select a.name from sysindexes a ,sysobjects b

where a.id=b.id and b.name=’テーブル名’

上記の SELECTステートメントでは、2つのシステムテーブル(sysindexesと sysobjects)が結合され、テー

ブル「sysindexes」のインデックス名が検索されます。WHERE句では、インデックスの IDを指定していま

す。’ テーブル名’ は、名前の分かっているテーブルです。

Oracleの場合:

Select Index_name from user_indexes

where テーブル名=’テーブル名’

上記のステートメントでは、「テーブル名」という名前のテーブルのインデックスがすべて取り出されます。

注意:� �

システムテーブルの情報は、dbMAGICの「テーブル定義取得」処理を使用して取り出すこともできま

す。また、定義を dbMAGICに取り込むこともできます。� �

SQLガイド

dbMAGIC Ver.8.2

11.3システムテーブルの使用方法 11–3

Page 82: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

11.4 MS-SQL Serverのシステムプロシージャ

MS-SQL Serverでは、システムテーブルのほかにシステムプロシージャが用意され、このプロシージャを使

用して簡単にシステムテーブルの情報を取り出すことができます。システムプロシージャは、インストール

時に自動的にマスターデータベースの中に作成されます。また、システム管理者(sa)が所有者になります。

システムプロシージャはいずれも、その名前は「sp」で始まります。

システムプロシージャは、マスターデータベースだけでなく、どのデータベースからでも実行できます。た

だし、マスターデータベース以外のデータベースから実行したときには、システムテーブルに対する正当な

権利のない照会は許可されません。また、その情報が、システムプロシージャが実行されたデータベースに

記録されます。

マスターデータベースには、システムプロシージャのほか、システムプロシージャの実行許可に関する定義

も記録されています。たとえば、システムプロシージャによっては、データベースオーナー(dbo)だけしか

実行できないものもあり、その情報がマスターデータベースに格納されています。また、それ以外のシステ

ムプロシージャはユーザが実行できますが、ただし、実行は、マスターデータベースで「EXECUTE」とい

う権限が付与されているユーザに限って可能になります。

たとえば、「sp help」というシステムプロシージャを実行すると、データベースのオブジェクトがすべて返

ります。

データベースオブジェクトは SQLコマンドを使用して取り出すこともでき、その場合、ステートメントは次

のようになります。

SELECT カラム名

FROM sysobjects

11.5 セキュリティ

RDBMSは、本来、マルチユーザシステムであり、そのためセキュリティ機能が用意されています。このセ

キュリティ機能を使うことで、データベースへのアクセスや使用の制限が可能です。データベースのセキュ

リ機能としては、システムセキュリティとデータセキュリティの 2種類があります。

システムセキュリティ

システムセキュリティとは、データベースに対するアクセスと使用をシステムレベルでチェックできる機能

をいいます。システムセキュリティでは、次のような事項についてチェックが可能です。

■ ユーザ名とパスワード

■ ユーザ認証(データベースへの接続時に実行)

■ ユーザのオブジェクトの格納に必要なディスクスペース

■ ユーザのリソース

■ ユーザが実行するシステム処理

データセキュリティ

データセキュリティとは、データベースに対するアクセスと使用をオブジェクトレベルでチェックできる機

能をいいます。データセキュリティでは、次のような事項についてチェックが可能です。

■ オブジェクトについてユーザに与えられているアクセス権

■ オブジェクトについてユーザに与えられている処理の種類

11–4 システムテーブルとセキュリティ SQLガイド

dbMAGIC Ver.8.2

Page 83: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

11データベースのオブジェクトはいずれも、「データベース.オーナー.テーブル名」という書式の名前で識別

されます。また、オブジェクトに対しては、ユーザに所定の権限が付与されているときに限ってアクセスが

可能になります。データベースにはそれぞれ、ユーザ名のリストが保存されており、ユーザは、そのリスト

にある有効なユーザ名を入力しなければデータベースには接続できません。また、ユーザ名だけではセキュ

リティの程度が低いため、ユーザ名はパスワードとセットになっています。

データベースビューは、そのビューに関連するオブジェクトにアクセス可能なユーザを指定することで、ビュー

の表示を制限できます。また、この方法で、テーブルのセキュリティを確保できます。ビューとは仮想テー

ブルで、データベースオブジェクト(テーブル)のカラムの中から必要なものを指定して作成できます。こ

のビューは、ユーザが表示することができます。また、ビューでは、カラムの値を限定し、その範囲の値だ

けを表示することもできるため、見せたくないデータは非表示にしておくという使い方も可能です。

11.6 オペレーティングシステムのユーザ名

Oracleの場合、データベースのユーザ名のほか、オペレーティングシステム(OS)のユーザ名を使用してセ

キュリティチェックを行うこともできます。

OracleのOSアカウント

Oracleでは、OSのユーザアカウントを使用してユーザ認証を行うこともできます(ただし、OS側でユーザア

カウントの使用が可能でなければなりません)。OSのユーザアカウントを使いたい場合、[OPS ACCOUNT]

パラメータを次のように設定します。

OS_AUTHENT_PREFIX.users

上記において、「OS AUTHENT PREFIX」は接頭辞を表し、この接頭辞が OSのユーザの前に付加されます。

ユーザによりデータベースに対して接続が試みられると、この接頭辞付きのユーザ名とデータベースに保存

されているユーザ名が比較されます。

例:

OS_AUTHENT_PREFIX=OPS$

Operating System account: Magic

上記の場合、「OPS$MAGIC」という名前のデータベースユーザが検索され、そのデータベースユーザが見つ

かると、そのユーザに接続が許可されます。なお、Oracleでは、OSのユーザ名を使う場合、接頭辞が必要

です。つまり、上のように「OPS$MAGIC」という書式になります。

11.7 システム権限の付与と取消

GRANTと REVOKEの各コマンドを使うことで、それぞれ、ユーザに権限を付与したり取り消したりでき

ます。権限は、データベースの各処理について別個に付与することができます。

システム権限

GRANT Y=REVOKEfALL Y=ステートメントリスト g

TO Y=FROM fPUBLIC Y=名前リスト g

上記で、「ステートメントリスト」には、CREATE TABLE、VIEW、RULEなどを指定できます。

SQLガイド

dbMAGIC Ver.8.2

11.6オペレーティングシステムのユーザ名 11–5

Page 84: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

オブジェクト権限

GRANT Y=REVOKEfALL Y=許可リスト g

ON fテーブル名 [(カラムリスト)]...

TO Y=FROM fPUBLIC Y=名前リスト g

「許可リスト」には、SELECT、UPDATE、INSERT、REFERENCESなどの処理の種類を指定できます。

例:

- GRANT CREATE TABLE TO SCOTT.

- REVOKE SELECT ON TABLE1 FROM SCOTT.

なお、オペレーティングシステムが Windowsの場合、次のような RDBMSプログラムを使用して、システ

ム権限の付与と取消が可能です。

Oracle User Manager of SQL & DBAまたは Enterprise Manager

MS-SQL Server SQL Enterprise Manager

11–6 システムテーブルとセキュリティ SQLガイド

dbMAGIC Ver.8.2

Page 85: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第12章 オプティマイザ章目次12.1 オプティマイザの動作の仕組み : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :12–2

12.2 アクセスパス : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :12–2

12.3 統計情報の更新 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :12–3

12.4 オプティマイザで使われるアクセスパスの指定 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :12–4

12.5 オプティマイザの動作とアクセスパスのチェック : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :12–4

12.6 例 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :12–6

Page 86: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第12章 オプティマイザ

MS-SQL Serverにはオプティマイザが搭載されています。オプティマイザとは MS-SQL Serverのコンポーネ

ントの 1つで、テーブルに対してアクセスが実行される場合、最も効率の高いアクセス方法を検出するとい

う機能を持っています。このため、オプティマイザを使うことで、クエリに対する応答が高速化されます。

オプティマイザの動作は、クエリの種類によって異なります。つまり、実行されたクエリによって、テーブ

ルのスキャンの方法(シーケンシャルなど)が自動的に判断されたり、インデックスが使用されたりします。

また、一時テーブルを使用してソートが実行されたり、その他、必要に応じて、適当な方法が自動的に使わ

れます。どの RDBMSでも、オプティマイザは機能や構造はほぼ同じですが、それでも、MS-SQL Serverの

内部構造に応じて調整や改善が行われています。

12.1 オプティマイザの動作の仕組み

オプティマイザには、次の 2つの情報が渡されます。

■クエリの構造に関する情報 … 指定されているテーブル、WHERE句、ORDER BY句など。

■データベースの構造に関する情報… インデックスが設定されているカラム、インデックスの種類など。

オプティマイザ内部には、規則がいくつか定義されています。以下は、基本的な規則で、すべてのオプティ

マイザで使われます。

■ ORDER BY句よりWHERE句が優先されます。

■ カラムが定数または変数と比較される場合、そのカラムにインデックスが設定されているかどうかチェッ

クされ、インデックスがあれば、そのインデックスが使われます。

■ 非ユニークインデックスよりユニークインデックスが優先されます。

■ ORDER BY句で指定されているカラムにインデックスが設定されており、そのインデックスがWHERE

句で指定されているインデックスとコンフリクトしない場合、そのインデックスを使用して ORDER

BY 句が実行されます。

■ GROUP BY句でインデックスが使用できる場合、そのインデックスが使われます。

■ テーブルのカラムが別のテーブルのカラムと比較される場合、いずれかのカラムにインデックスが設

定されているかどうかがチェックされます。どちらかのカラムにインデックスが設定されているときに

は、そのカラムのテーブルがまず使われます。

オプティマイザでは、また、どういった方法を使えば結果が速く出せるかが自動的に判断されます。この場

合、次のような事項についてチェックされ、方法が決められます。

■ テーブルを順次スキャンするかどうか。

■ 行の特定にインデックスを使うかどうか。

■ 一時インデックスを作成して使うかどうか。

■ ソートを実行するかどうか。

12.2 アクセスパス

SQL対応の RDBMSでは、アプリケーションからのリクエストは SQLステートメントという形で送られま

す。送られた SQLステートメントは RDBMSで構文がチェックされ、そのチェックで問題がなければ、リク

エストの処理が実行されます。

12–2 オプティマイザ SQLガイド

dbMAGIC Ver.8.2

Page 87: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

12

たとえば、データベースユーザから次のような SQLステートメントが RDBMSに送られたとします。

SELECT A.a,A.b,A.c,B.a,B.b,B.c

FROM tableA a, tableB b

WHERE A.a = B.a and A.d =5 and B.e =’open requests’

ORDER BY B.b;

上記の場合、ステートメントが RDBMSでチェックされ、「 tableA」と「tableB」という 2つのテーブルが実

際に存在し、また、指定されているカラムがそれぞれ各テーブルに見つかると、ステートメントが実行され

結果テーブルが作成されます。

上記のように、テーブルとカラムがチェックされた後にステートメントが実行されますが、その場合、ステー

トメントは次のような手順で実行されます。この手順をアクセスパス(データにたどり着くまでの道順)と

呼んでいます。

1. テーブル「 tableB」の行がすべて読み取られます。その後、「B.b」の値が「open requests」かどうかが

チェックされます。チェックで見つかったレコード(値が「open requests」のレコード)についてそれ

ぞれ、テーブル「 tableA」がスキャンされ、「A.d」の値が「5」で、また、「A.a」の値が「B.a」の値と

等しいかどうかがチェックされます。この後、チェックの結果が「B.b」の値をもとにソートされます。

2. テーブル「tableA」の行がすべて読み取られます。その後、「A.d」の値が「5」かどうかがチェックされ

ます。チェックで見つかったレコード(値が「5」のレコード)についてそれぞれ、テーブル「 tableB」

がスキャンされ、「B.e」の値が「open requests」で、また、「A.a」の値が「B.a」の値と等しいかどうか

がチェックされます。この後、チェックの結果が「B.b」の値をもとにソートされます。

3. テーブル「 tableA」のレコードのうち、「A.d」の値が「5」であるレコードがカラム「A.a」の値を基準

にソートされます。続いて、テーブル「 tableB」のレコードのうち、「B.e」の値が「open requests」で

あるレコードがカラム「B.a」の値を基準にソートされます。この後、2つのソート済みリストがマー

ジされ、最後に「B.b」の値をもとにソートされます。

4. インデックスを使用して処理が実行されます。

なお、場合によっては、オプティマイザにより選択されたアクセスパスが不適当なこともあります。その場

合、結果が返るまで時間がかかります。そのため、不適当なアクセスパスが選択されるのは、データベース

やリクエストに関する情報が十分オプティマイザに渡されないことが原因であることが少なくありません。

この情報不足を防ぐには、システムテーブルのうち、とくにアプリケーションテーブルに関する情報が格納

されているシステムテーブルを最新の情報で更新しておくことが必要になります。これで、オプティマイザ

に最新の情報が渡されるようになり、その情報をもとにステートメントがチェックされるようになります。

12.3 統計情報の更新

オプティマイザでは、あらかじめ用意されている規則をもとにアクセスパスが決められます。このアクセス

パスが決められる場合、テーブルのサイズやインデックスに関する統計情報が重要になります。

このため、テーブルのインデックスに関する統計情報は、定期的に更新しておくことが必要です。統計情報

の更新は、UPDATE STATISTICSステートメントを使用して行えます。

SQLガイド

dbMAGIC Ver.8.2

12.3統計情報の更新 12–3

Page 88: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

MS-SQL Sewrverの場合:

UPDATE STATISTICS

[データベース.][オーナー.]テーブル名 [インデックス名]

Oracleの場合:

ALTER TABLE - テーブル名

COMPUTE Y=ESTIMATE STATISTICS

Oracleでは、インデックスの値に関する情報は、SQLサーバに保存されます。オプティマイザでは、この情

報をもとに処理に使うインデックスが決められます。この関係から、インデックスに関する情報を常に更新

しておくことが、オプティマイザの効率的実行に必要です。

インデックスのキー値が大幅に変わった場合、その都度、UPDATE STATISTICSを実行します。具体的には、

UPDATE STATISTICSは、次のようなときに実行します。

■ インデックスが設定されているカラムに多数のデータを追加したとき。データの変更や削除の場合も

同じです。

■ TRUNCATE TABLEステートメントを使用して、テーブルをトランケート(切り取り)し、再度、ポ

ピュレートしたとき。

なお、データが格納されている既存のテーブルでインデックスを作成したり、変更した場合、自動的にUPDATE

STATISTICSが実行されます。

12.4 オプティマイザで使われるアクセスパスの指定

アクセスパスはオプティマイザにより自動的に選択されますが、ときには、選択されたアクセスパスが適当

でないこともあります。このため、ほとんどの RDBMSでは、オプティマイザで使われるアクセスパスをオ

プションで指定することができるようになっています。ただし、このオプションは、オプティマイザの動作

を十分理解しているユーザが行わなければなりません。指定が不適当だと、逆に応答時間が長くなることが

あります。

12.5 オプティマイザの動作とアクセスパスのチェック

MS-SQL Server

プラン表示

MS-SQL Serverでは、オプティマイザの動作は、クエリでプランを使うことでチェックできます。この場合、

クエリの結果がインデックスを使用して出力されたかどうかをチェックできます。プラン表示については、

MS-SQL Serverの「システム管理者ガイド」の第 23章「プラン表示の出力」を参照してください。プランの表示は、SQLコマンドに記述して実行できます。また、ISQL/Wの左下にある[Dbplay Showplan]

アイコンを使用して実行することもできます。

通常、Set Showplanを使うよりも、できるかぎり統計情報だけが出力されるようにしてプランを表示したり、

クエリやインデックスの種類を変えながらプランを表示した方が効率はよくなります。

インデックスの追加などのデータベースイベントによりデータベースの内容が変更された場合、ストアドプ

ロシージャを再コンパイルして最適化することが必要になります。ストアドプロシージャは自動的に最適化

されることもありますが、自動最適化は、ストアドプロシージャが動作しているときに SQLサーバが再起動

されたとき、または、ストアドプロシージャの処理対象となっているテーブルが変更されたときに限って実

行されます。ストアドプロシージャの再コンパイルは、次のコマンドで可能です。

sp_recompiletable_name

12–4 オプティマイザ SQLガイド

dbMAGIC Ver.8.2

Page 89: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

12

Oracle

Oracleの SQLトレース機能

Oracleには SQLトレース機能が搭載され、この機能を使用して SQLステートメントの統計情報を出力でき

ます。

SQLトレース機能は、インスタンスレベルまたはセッションレベルのいずれかで実行できます。SQLトレー

ス機能を有効にしておくと、インスタンスまたはユーザセッションで実行された SQLステートメントに関す

る統計情報がトレースファイルに記録されます。

トレースファイルの内容は、TKPROFというプログラムでフォーマットし、読込可能な出力ファイルに書き

込むことができます。TKPROFでは、また、SQLステートメントの実行プランを作成したり、SQLスクリプ

トを作成して統計情報をデータベースに保存するといった処理も行えます。

SQLトレース機能の実行

インスタンスレベルで SQLステートメントの統計情報をトレースしたい場合、SQL TRACEの値を TRUE

にします。これで、すべてのセッションについて統計情報がトレースされるようになります。

一方、セッションレベルで(セッションごとに)トレースを行いたいときには、次の SQLコマンドを使い

ます。

ALTER SESSION

SET SQL_TRACE = TRUE

また、インスタンスレベルでトレースを実行しており、セッションレベルのトレースは無効にしたいときに

は、次の SQLコマンドを使います

ALTER SESSION

SET SQL_TRACE = FALSE

なお、インスタンスレベルでトレースを実行している場合、セッションごとに別個のトレースファイルが作

成されます。

TKPROFの実行

TKPROFを使用して、SQLトレース機能により作成されたトレースファイルをフォーマットし、出力ファイ

ルとして書き込むことができます。また、TKPROFを使うことで、実行プランの作成も行えます。

TKPROF入力トレースファイル出力ファイル EXPLAIN=ユーザ名/パスワード上では、「EXPLAIN=ユーザ

名/パスワード」を指定していますが、これによりトレースファイル中の SQLステートメントの実行プラン

が特定され、その実行プランが出力ファイルに出力されます。

TKPROFとそのパラメータについては、詳しくは、Oracle 7の「アプリケーション開発者ガイド」の付録 B

「パフォーマンス診断ツール」を参照してください。

SQLガイド

dbMAGIC Ver.8.2

12.4オプティマイザで使われるアクセスパスの指定 12–5

Page 90: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

EXPLAIN PLANコマンド

SELECTステートメントまたは DML ステートメントでオプティマイザが使われており、そのオプティマイ

ザでどういった実行プランが使われているかは、EXPLAIN PLANコマンドで表示できます。ここで、実行

プランとは、ステートメントの実行に必要な Oracleの処理手順をいいます。

EXPLAIN PLANコマンドではデータが出力されますが、EXPLAIN PLANの実行の前に、そのデータを格納

するテーブルを用意しておかなければなりません。このテーブルは、CREATE TABLEコマンドを使用して

作成できます。または、UTLXPLAN.SQLスクリプトを実行して作成することもできます。テーブルには任

意の名前を付けることができますが、カラムの名前とデータ型は、PLAN.TABLEと同じでなければなりま

せん。EXPLAIN PLANコマンドの書式は次の通りです。

EXPLAIN PLAN

[SET STATMENT_ID=’テキスト’]

[INTOテーブル]

FORステートメント;

EXPLAIN PLANで作成されたテーブルの内容は、次の SELECTステートメントで取り出すことができます。

SELECT LPAD (’ ’,2*(LEVEL-1))

jj operation _ operations,

options, object_name, position

FROM plan_table

START WITH id=0

AND statement_id = ’statement id from EXPLAIN

PLAN command’

CONNECT BY PRIOR id=parent.id

AND statement.id = ’statement id from EXPLAIN

PLAN

command’

EXPLAIN PLANコマンドについては、詳しくは、Oracle 7の「SQL言語リファレンスマニュアル」を参照

してください。

12.6 例

以下は、MS-SQL Serverでのテーブルの作成例です。ここでは、「社員」という名前のテーブルを作成してい

ます。SELECTステートメントの例は、この後にあります。

テーブル作成

create table社員 ( 社員番号 integer , 名前

char(20), 部門番号 smallint)

create unique index empno_ind on社員 (社員番号)

create index empname_ind on社員 (名前)

insert into 社員 values (1,’tomer’,2)

insert into 社員 values (2,’dalit’,2)

insert into 社員 values (3,’osnat’,4)

insert into 社員 values (4,’michel’,1)

insert into 社員 values (5,’john’,3)

insert into 社員 values (6,’benjamin’,1)

12–6 オプティマイザ SQLガイド

dbMAGIC Ver.8.2

Page 91: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

12

簡単な SELECTステートメント

SELECT * from社員 WHERE社員番号>1

結果:

ステップ 1

クエリは、SELECTとします。

FROM TABLE

社員

Nested iteration

Index : empno_ind

社員番号 名前 部門番号

2 Dalit 2

3 Osnat 4

4 Michael 1

5 John 3

6 Benjamin 1

この例では、インデックス(empnoind)を使用してレコードの取り出しが行われます。

WHERE句とORDER BY句を使った SELECTステートメント

SELECT *

FROM 社員

WHERE 社員番号>1

ORDER BY 名前 asc

結果:

ステップ 1

クエリは、INSERTです。

更新モードはダイレクト。

ワークテーブルは、ORDER BYの処理用です。

FROM TABLE

社員

Nested iteration

Index : empno_ind

TO TABLE

Worktable 1

SQLガイド

dbMAGIC Ver.8.2

12.6例 12–7

Page 92: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

ステップ 2

クエリのタイプは、SELECT。この場合、ソートが行われます。

FROM TABLE

Worktable 1

Using GETSORTED Table Scan

社員番号 名前 部門番号

6 Benjamin 1

2 Dalit 2

5 John 3

4 Michael 1

3 Osnat 4

WHERE句の優先度はORDER BY句よりも高いため、まず、インデックス(empnoind)を使用してWHERE

句が処理されます。その後、一時ワークテーブル(Worktable 1)を使用して、ソートが実行されます。

社員番号はすべて 1より大きい値で、社員はすべて取り出されます。したがって、この場合、インデックス

として EMPNAME INDを使うことで応答速度を向上させ、抽出漏れもなくなります。インデックスとして

EMPNAME INDを指定したい場合、次のようにします。

SELECT * from社員 (index=empname_ind) where

社員番号>1 order by名前

結果:

ステップ 1

クエリのタイプは、SELECTです。

FROM TABLE

社員

Nested iteration

Index : empname_ind

社員番号 名前 部門番号

6 Benjamin 1

2 Dalit 2

5 John 3

4 Michael 1

3 Osnat 4

12–8 オプティマイザ SQLガイド

dbMAGIC Ver.8.2

Page 93: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第13章 dbMAGICとSQL章目次13.1 何故 SQLを使用するのか? : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 13–2

13.2 dbMAGICの SQLサポート機能 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 13–2

13.3 dbMAGICと SQLの用語 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 13–3

13.4 データベースゲートウェイの命名規則 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :13–3

13.5 dbMAGICと API、そのバージョン : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :13–413.6 dbMAGICのリポジトリと機能 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :13–4

Page 94: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第13章 dbMAGICとSQL

dbMAGICは、SQLに対応しています。dbMAGICと SQLデータベースは相互補完的に動作し、その相性も

よく、双方を利用することでソフトウエアのコストも削減できます。dbMAGICで作成したアプリケーショ

ンは、MS-SQL Server、Oracleなど、SQL対応の RDBMSとともに使用できます。

データベースが SQL対応の RDBMSの場合、dbMAGICを使うことで、強力で実際の業務に柔軟に対応する

アプリケーションを短時間で作成できます。また、SQLには弱点もありますが、その弱点は dbMAGICを使

うことで補うことができます。また、dbMAGICを使うことで、SQLのメリットを最大限に引き出すことも

できます。

13.1 何故 SQLを使用するのか?

通常、プログラミングは言語ベースの開発ツールを使用して行いますが、dbMAGICを使うことで、その負

担が軽減されます。また、データベースへのアクセス手法としては、現在、SQLを使うのが標準になってい

ます。このため、データベースへのアクセスに使用するアプリケーションを開発する場合でも、この SQLを

利用するのが、アプリケーションの作成や保守、開発技術の習得に要するコストを間接的に削減することが

できます。

dbMAGICは、多種類の SQLデータベースに対応しています。したがって、SQLを dbMAGICで使用するこ

とで、各種の SQLデータベースアプリケーションの開発や保守が可能で、しかも、アプリケーションの移植

性も高くなります。従来、SQLでは実現できない機能、また実現できても開発が厄介な機能は、3GL、4GL

のツールを使用して埋め込み型 SQLや動的 SQLという形で開発を行いました。dbMAGICは、こういった

ツールに比べて、その機能や効率の面で数段優れています。

dbMAGICと SQLは非常に相性がよく、高機能で低価格のMISアプリケーションを容易に作成できます。実

際、dbMAGICの SQLデータベースに対する対応は、柔軟で完全です。このため、SQLの機能を最大限まで

引き出し、SQLを dbMAGICのアプリケーションに一体化させることが可能です。SQLデータベースといっ

ても、ANSI標準から見ると多少違いがありますが、dbMAGICでは、その相違も吸収できます。

dbMAGICの実行エンジンは、SQLの認識が可能なように設計されています。というより、実行エンジンの

内部メカニズムは、SQLの機能と言語を基本に作成されています。また、dbMAGICの SQLゲートウェイ

は、それぞれ、RDBMSの機能や設計の違いを吸収できるように設計されています。つまり、dbMAGICで

は、RDBMSの機能や設計の相違は自動的に調整されるため、開発者は、そういった相違をほとんど無視す

ることができます。以下、dbMAGICの内部メカニズムについて解説します。

13.2 dbMAGICのSQLサポート機能

dbMAGICは、各種の SQLベースの RDBMSに対応していますが、こういった RDBMSに対しては、データ

ベースゲートウェイを介してアクセスを行うことになります。現在、Oracle、MS-SQL Server、ODBC向け

のゲートウェイが出荷されています。

dbMAGICは、非明示(ビルドイン SQLサポート)、明示(埋め込み SQL)の両レベルで SQLに対応してい

ます。

13–2 dbMAGICと SQL SQLガイド

dbMAGIC Ver.8.2

Page 95: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

13

ビルドイン SQLサポート(非明示レベル)

dbMAGICには、ビルドイン SQLサポートが搭載されています。このサポートを利用することで、SQLス

テートメントを明示的に記述する必要がなくなります。つまり、すべての SQL処理が dbMAGICにより透過

的に実行されます。このため、開発者は、RDBMSの処理や操作とは離れてアプリケーションの開発に専念

できます。

dbMAGICと SQLデータベースとの間には、データベースゲートウェイがインタフェースとして介在します。

ゲートウェイは、各 RDBMS向けのものが用意されており、それぞれ、その RDBMSの独自の機能や構文を

吸収するように設計されています。また、dbMAGICには複数種類のゲートウェイを同時にロードすること

ができ、したがって、同じアプリケーションで複数の RDBMSの使用が可能になっています。

埋め込み SQL(明示レベル)

dbMAGICでは、非明示レベルのほか、明示レベルでも SQLがサポートされています。つまり、dbMAGIC

のタスクの中に SQLステートメントを直接埋め込むこともできます(埋め込み SQLと呼ばれます)。このた

め、開発者は、必要に応じて SQLステートメントを明示的に記述することができます。埋め込んだ SQLス

テートメントは、RDBMSに送られます。SQLステートメントの実行後に送られてきた結果は、dbMAGIC

で操作できます。

13.3 dbMAGICとSQLの用語

dbMAGICで使用している用語と SQLの標準の用語とは多少異なります。以下は、その違いをまとめた表

です。

dbMAGICの用語 SQLの用語

レコード 行

リンク ジョイン、ネストされた SELECT

データビュー テーブル、ビュー、ジョイン

13.4 データベースゲートウェイの命名規則

データベースゲートウェイの名前は、一定の規則をもとに作成されていますが、今回、この規則が変わりま

した。ゲートウェイの今後のバージョンでは、変更後の規則が使われます。変更は、次の通りです。

■ 最初の文字列は、RDBMSの名前とバージョンになります。

■ 最初の文字列の次には、「Version」という語が来ます。

■ 3番目の文字列は dbMAGICのバージョンで、その末尾には「-」が付けられます。

■ 最後の文字列はソース ID で、この ID は、「X.Y」の書式になります。ここで、「X」は、メージャー

ソースバージョン(たとえば、6、7,8など)を表します。「Y」は、マイナーソースバージョンまた

は現行バージョンを表します。マイナーソースバージョンは、ソースが変更されるたびに変わります。

例 1:Oracle 7.3 Version 8.20-01J

上記の例では、「Oracle 7.3」が RDBMSの名前とバージョン番号です。その右に「Version」という語が続き、

その右に dbMAGICのバージョン番号である「8.20」が、最後にレビジョン番号として「01J」が来ます。

SQLガイド

dbMAGIC Ver.8.2

13.3 dbMAGICと SQLの用語 13–3

Page 96: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

13.5 dbMAGICとAPI、そのバージョン

dbMAGICは動的ツールで、コンパイルもリンクも必要ありません。このため、dbMAGICのプログラムは、

その処理を定義するだけで実行することができます。また、dbMAGICのデータビューも動的で、プログラ

ムに応じて、アプリケーションに応じて変更することができます。dbMAGICのデータビューは柔軟で、様々

な形で使用できます。

上記のように dbMAGICのデータビューは柔軟ですが、この柔軟性は単一規則のエンジンで実現されていま

す。この関係から、dbMAGICでは、動的 SQLを使用してプログラムで必要となる SQLデータビューが作

成されます。つまり、SQLテーブルの処理に関連するタスクがあった場合、そのタスクから SQLステート

メントが送出され、そのステートメントにより必要なデータビューが特定されます。その後、SQLステート

メントは、Magicゲートウェイにより実行の準備が行われます。また、準備と並行して、DBMSのオプティ

マイザによりステートメントが解析され、その後、実際の処理に回されます。

3GLや 4GLなどを使い、埋め込み SQLの方式で開発したプログラムは、コンパイルするため、SQLステー

トメントの実行時の解析や最適化といった処理の負荷は少なくて済みます。これに対して、dbMAGICでは

プログラムのコンパイルは行いません。このため、dbMAGICでは、タスクの実行時の準備処理がオーバー

ヘッドになることがあります。ただし、タスクを常駐させれば、SQLステートメントの準備は一度で済み、

その後はそのままの状態が継続します。つまり、同じタスクが呼び出された場合、ステートメントはすでに

準備済みのため、再度、準備処理を行う必要はありません。したがって、常駐タスクの場合、dbMAGICの

動的 SQLの処理効率は、埋め込み SQLのプログラムと同等になります。

Oracle

Oracle用 dbMAGICゲートウェイは、Oracleコールインタフェース(OCI)プロシージャを使用して作成さ

れています。この方法により、最大限の機能と性能が発揮されます。このゲートウェイは、Oracleバージョ

ン 7以降に対応しています。

注意:� �

Oracle用 dbMAGICゲートウェイを使う場合、Oracle Pro*Cまたは SQL*NETがインストールされてい

ることが必要です。� �

MS-SQL Server

MS-SQL用Magicゲートウェイは、SQLサーバライブラリ(Dblib)を使用して作成されています。また、最

大限の性能を引き出すため、カーソルとコマンドはクライアントのものが使われます。このゲートウェイは、

Microsoft SQL Serverバージョン 6.5以上に対応しています。

ODBC

ODBC用Magicゲートウェイは、ODBC 2.00 APIを使用して作成されています。このゲートウェイは、ODBC

ドライババージョン 2以降に対応しています。

13.6 dbMAGICのリポジトリと機能

SQLのプログラミングについては、前述しました。ここでは、SQLのプログラミングと対比させながら

dbMAGICのプログラミングを説明します。

13–4 dbMAGICと SQL SQLガイド

dbMAGIC Ver.8.2

Page 97: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

13

dbMAGICのリポジトリと SQLのデータ辞書

dbMAGICでは、データ定義はリポジトリを使用して行います。dbMAGICのリポジトリ(データ定義リポジ

トリ)は複数あり、こういったリポジトリが相互に機能しあって処理が実行されます。また、開発者は、こ

うしたリポジトリを使用して、データや属性、処理方法などを指定することができます。

ISAMファイルマネージャと異なり、SQLデータベースには、独自のデータ辞書とデータ定義言語が用意さ

れています。SQLのデータ辞書には、テーブルやカラム、データ型、ユーザのアクセス権限、その他、デー

タベースの論理アーキテクチャに関する情報がすべて格納されています。

dbMAGICのデータ定義リポジトリは強力です。データ定義リポジトリとしては、次のようなものがあります。

■ [タイプ]リポジトリ  

このリポジトリでは、アプリケーションで使うデータ型(タイプ)を定義することができます。定義し

たデータ型は、[カラム]テーブルなど、アプリケーションを通して使用できます。タイプは、各種の

データ属性で構成され、範囲(SQLの整合性制約定義であるドメインに対応します)を定義することも

できます。また、ヘルプ画面や自動ヘルプなどの設定も可能です。

■ [テーブル]リポジトリ  

このリポジトリでは、データベースの種類を定義できます。また、各ファイル(SQLでいえば、テーブ

ル)について、ネットワークサーバアドレス(SQLではパスに対応)を定義できます。このリポジトリ

は柔軟で、事実上、どんなデータベースにも対応するアプリケーションの作成が可能です。

■ [カラム]テーブルと[インデックス]テーブル  

この 2つのテーブルを使用して、dbMAGICのカラムとインデックスを SQLの属性に関連付けることが

できます。この 2つのテーブルは、SQLのデータ辞書に相当します。SQLの属性とは、RDBMSの内部

格納データ型、SQLカラム名、SQLインデックス名などをいいます。

dbMAGICのデータ操作機能

dbMAGICのデータ操作機能は、その性質上、直接操作機能と間接操作機能に分かれます。まず、直接操作

機能としては、レコードの取り出し機能があります。この機能は、SQLの SELECTステートメントに相当

し、テーブルに直接定義できます。テーブルに定義されたレコード取り出し処理は、アプリケーションエン

ジンにより対応する SQLデータ操作ステートメントに変換されます。

一方、dbMAGICのレコード操作機能は、間接操作機能です。dbMAGICのレコード操作機能は、SQLの

INSERT、UPDATE、DELETEの各ステートメントに対応し、タスクモード(登録、修正、削除)を介して間

接的に実行されます。タスクモードは、dbMAGICのアプリケーションエンジンにより、対応する SQLデー

タ操作ステートメントに変換されます。

アプリケーションエンジンによるタスクモードの変換機能は非常に強力で、dbMAGICに備えられている先

進機能の 1つです。また、生産性を向上させる上でも大きな要因となっています。

従来の手続き型言語では、SQLデータベースへのアクセスは、カーソルを使用してレコードを順次処理する

という方法で実行されます。この場合、カーソルは、データベースコマンドルーチンに対する明示的呼び出

しという形で実現されます。したがって、カーソルは、SQLステートメントを指すポインタと考えることが

できます。これに対して、dbMAGICでは、従来型言語のようなコードはまったく不要です。とくに、従来

型言語では、RDBMSアプリケーションを作成するときには複雑なカーソルプログラミングコードが必要で

すが、dbMAGICではそういったコードは一切不要です。dbMAGICの場合、カーソルルーチンに対する呼び

出しはすべて、内部的に実行されます。

SQLガイド

dbMAGIC Ver.8.2

13.6 dbMAGICのリポジトリと機能 13–5

Page 98: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

dbMAGICでは、データはレコードレベルで処理されます。レコードレベルの処理はすべて、dbMAGICエン

ジンにより実行されます。たとえば、データに対するカーソルのオープンと管理、DBMSからのレコードの

フェッチ、データベーステーブルに対するレコードの挿入や更新、データベーステーブルのレコードの削除と

いった処理はいっさい、dbMAGICエンジンが代行してくれることになります。このため、開発者は、カー

ソルの操作や処理にはまったく関わらないで済みます。

dbMAGICのプログラミング手法は、SQL対応の DBMSだけでなく、ISAMデータベースの場合でも同じで

す。手法が同じなのは、Magicゲートウェイの仲介レイヤにより SQL対応の DBMSと ISAMデータベース

の相違が吸収されるためです。

dbMAGICと SQLを併用する場合の機能とメリット

カーソルルーチン

3GLや 4GLで RDBMSアプリケーションを作成するときには、一般に複雑なカーソルプログラミングが必

要ですが、dbMAGICでは、こういったプログラミングは必要ありません。dbMAGICの場合、カーソルルー

チンに対する呼び出しはすべて、内部で実行されます。

Magicデータベースゲートウェイ

dbMAGICでは、スタンドアロン用のアプリケーションでも、クライアント/サーバ向けのアプリケーショ

ンでも開発が可能で、しかも、各種のデータベースに対応するアプリケーションを作成できます。これは、

dbMAGICと RDBMSとの間に Magicデータベースゲートウェイが介在するためで、どんな RDBMSであっ

ても、Magicデータベースゲートウェイの働きによりデータベースに対する要求が所定の形に処理されます。

また、現在市販されている RDBMSでは、ANSI標準のほかにも機能が追加されていますが、Magicデータ

ベースゲートウェイを使うことで RDBMS独自の機能にも対処できます。

トランザクション処理

SQLデータベースでは、トランザクション処理がサポートされています。このトランザクション処理も、

dbMAGICでは簡単にまた論理的に操作が可能で、プログラミングが大幅に軽減されます。つまり、dbMAGIC

では、SQLトランザクション処理ステートメントを記述する必要はなく、フラグを使用して、必要なトラン

ザクション処理コマンドが実行される論理レベルを指示するだけで済みます。これで、必要なコマンドが自

動的に実行されます。そのほか、実際の SET TRANSACTIONを実行したり、コミットやロールバックといっ

た処理を実行することもできます。

ファイルとテーブルの操作

dbMAGICは、オープンアーキテクチャを基本に設計されています。このため、とくに大規模な企業や組織

ですでにデータベースを使用しており、そのデータを活用したいときにも非常に利用価値があります。また、

各種のプラットフォームにも対応しているため、統一され、一貫性のあるアプリケーション開発を行うこと

ができます。また、アプリケーションの配布も容易です。

インデックス順次ファイルの場合、dbMAGICではリポジトリを使用してファイルを操作できます。また、

SQLの場合、RDBMSには内部データ辞書がありますが、このデータ辞書にも dbMAGICは対応しています。

このため、SQLテーブルを扱うアプリケーションを開発するときには、データベースについて 2種類の情報

が使えることになります。

13–6 dbMAGICと SQL SQLガイド

dbMAGIC Ver.8.2

Page 99: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第14章 クライアント/サーバアーキテクチャ章目次14.1 dbMAGICのクライアント/サーバアーキテクチャ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :14–2

14.2 RDBMSの(オープン)クライアント/サーバアーキテクチャ : : : : : : : : : : : : : : : : : : : : : : : 14–3

14.3 異種クライアント/サーバ環境の例 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :14–4

14.4 いつ何を使うか : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :14–4

Page 100: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第14章 クライアント/サーバアーキテクチャ

一概にクライアント/サーバといっても、多数の定義があります。また、実際のクライアント/サーバ環境

にも多数の種類があります。

一般的にいえば、クライアント/サーバ環境とは、ユーザのワークステーション(クライアントと呼ばれま

す)とホストコンピュータ(サーバと呼ばれます)との間でデータの交換や処理が可能なシステムをいいま

す。また、クライアントとサーバのどちらでどれだけの処理が行われるかは、システムによって大きく異な

ります。

クライアント/サーバ環境で行われる処理には、主に次の 3種類があります。

■ アプリケーションによる処理

■ データ管理

■ プレゼンテーション(データ表示)

上の処理のうち、アプリケーションによる処理とデータ表示は、程度の違いはありますが、クライアント側

で行われるのが普通です。また、サーバ側では、主にデータ管理が行われます。

また、ほとんどの RDBMSでは、ストアドプロシージャやその他の SQL機能が搭載されているため、アプ

リケーションによる処理もサーバ側で行われる比率が高くなります。この場合、クライアントとサーバとの

間のネットワークトラフィックが軽減されます。

クライアントとサーバとの間の接続には、通信レイヤ(通信プロトコル)が使われます。通信プロトコルは、

現在、いろいろなプロトコルが普及していますが、主要なプロトコルは次の通りです。

TCP/IP … UNIX、Windows NT環境でもっとも普及している通信プロトコルです。

dbMAGICのクライアント/サーバアーキテクチャと RDBMSのクライアント/サーバアーキテクチャは異

なります。このため、dbMAGICで SQLデータベースを使う場合、両方のアーキテクチャについて理解して

おかなければなりません。

14.1 dbMAGICのクライアント/サーバアーキテクチャ

dbMAGICのクライアント/サーバアーキテクチャでは、サーバマシンに dbMAGICサーバをインストール

します。dbMAGICサーバ (データサーバ)には dbMAGICディスパッチャが搭載されており、クライアント

から送られてくる要求は、この dbMAGICディスパッチャによって受け取られることになります。

クライアント側から接続の要求が送られると、その要求は dbMAGICディスパッチャにより受信され、送信

元のクライアントが識別されます。識別後、サーバ上で、そのクライアントに対応する dbMAGICサーバプ

ロセスが起動します。この後、クライアントとの通信は、起動した dbMAGICサーバプロセスとの間でのみ

行われます。

上記のように、クライアントと dbMAGICサーバプロセスとの間で通信が始まると、dbMAGICディスパッ

チャは、別の要求に対して待機状態に入ります。なお、上記の処理には、クライアント側で次のような条件

が必要になります。

■ 通信プロトコルとして TCP/IPがクライアントにインストールされていること。

■ 通信ゲートウェイがインストールされていること。

■ 定義 SQLゲートウェイがインストールされていること。

14–2 クライアント/サーバアーキテクチャ SQLガイド

dbMAGIC Ver.8.2

Page 101: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

14

通信ゲートウェイ

通信ゲートウェイは、クライアントキットに付属しています。dbMAGICクライアントと dbMAGICサーバ

との通信は、この通信ゲートウェイにより実現されます。

dbMAGICでは、TCP/IPの通信プロトコルがサポートされています。

Windowsの場合、ソケットが使われるため、dbMAGIC通信ゲートウェイは「MGWSOCK.DLL」というDLL

になっています。

定義SQLゲートウェイ

定義 SQLゲートウェイとは、ファイルのチェック、その他のパラメータの制御機能を持つゲートウェイで、

この定義 SQLゲートウェイにより dbMAGIC上で RDBMSが定義されます。

定義 SQLゲートウェイをクライアントで使う場合、dbMAGICサーバにデータベースを定義しなければなり

ません。データベースは、次のいずれかのファイルの「MAGIC DATABASES」セクションで定義します。

■ MAGIC.INI

上記の定義は、dbMAGICサーバからデータベースに対してアクセスが実行される場合に必要となります。ま

た、クライアントにはデータベースは置かれていないため、定義 SQLゲートウェイのインストールが必要に

なります。

定義 SQLゲートウェイの名前は、接頭辞が「md」で、その右に RDBMSの名前が続きます。たとえば、

「mdms632.dll」、「mdora32.dll」などとなります。

データベースゲートウェイ

dbMAGICサーバ側PCには、データベースゲートウェイをインストールしなければなりません。データベース

ゲートウェイの名前は、接頭辞が「mg」で、その右に RDBMSの名前が続きます。たとえば、「mgms632.dll」、

「mgora73.dll」などとなります。

14.2 RDBMSの(オープン)クライアント/サーバアーキテクチャ

RDBMSは、クライアントから別のコンピュータに置かれているリモートデータベースに対して接続が可能

になっています。この場合、クライアントとサーバの両方に通信ソフトウエアがインストールされ、このソ

フトウエアによって接続が実行されます。また、dbMAGICクライアント/サーバを使う場合、クライアン

ト、サーバとも通信プロトコルを定義しておかなければなりません。

RDBMSにはそれぞれ、次のようなツールが付属しています。

■ Oracle… SQL*NET(V1、V2)

■ MS-SQL Server… NETlib

上記のどのツールも各種の通信プロトコルに対応しています。クライアント側では、次のようなプロトコル

やコンポーネントが必要です。

■ SQL*NET、その他、クライアントにインストールされ正常に動作しているツールでサポートされてい

る通信プロトコル。

■ 上記のいずれかのツール。ツールの種類は、RDBMSによって異なります。

■ MAGICゲートウェイ

SQLガイド

dbMAGIC Ver.8.2

14.2 RDBMSの(オープン)クライアント/サーバアーキテクチャ 14–3

Page 102: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

14.3 異種クライアント/サーバ環境の例

�����������

�������

�����

�����

������

����

����������

� �����

����

��� �

� �����

����

��� ! "�

#$

��� �

�����

�%��&

��������

� �����

����

�%"'�&�

�� "�

#$

�����

�%��&

�����

�����

��� �����

����(

�����

����)

�����

��� ��

�������(

*�+,-./0

�����

マルチスレッドサーバの場合、SQL PLUSプロセスの処理は上とは異なります。

14.4 いつ何を使うか

dbMAGICと RDBMSの各クライアント/サーバアーキテクチャの違い

dbMAGICのクライアント/サーバアーキテクチャと RDBMSのクライアント/サーバアーキテクチャでは、

使用に際しては次のような違いがあります。

■ RDBMSのクライアント/サーバアーキテクチャの場合、すべてのクライアントに、RDBMSクライア

ントと MAGICゲートウェイの両方をインストールしなければなりません。一方、dbMAGICにクライ

アント/サーバアーキテクチャでは、定義 SQLゲートウェイと通信ゲートウェイだけをインストール

すればよく、RDBMSクライアントはインストールする必要はありません。

■ dbMAGICのクライアント/サーバアーキテクチャの場合、データへのアクセス以上のことができま

す。このアーキテクチャでは、dbMAGICのプロセスがサーバ上にあるため、ISAMファイルの出力や

アクセスのほか、サーバ上で多数の処理を行うことができます。

14–4 クライアント/サーバアーキテクチャ SQLガイド

dbMAGIC Ver.8.2

Page 103: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

14

■ dbMAGICのクライアント/サーバアーキテクチャを使うことで、アプリケーションのパーティショニ

ングやタスクのバックグラウンドでの実行も可能になります。

■ RDBMSのクライアント/サーバアーキテクチャを使う場合、サーバに dbMAGICをインストールす

る必要はありません。RDBMSのクライアント/サーバアーキテクチャにより通信が実行されるため

です。ただし、クライアントには dbMAGICをインストールしなければなりません。

dbMAGICサーバがない場合、RDBMSのクライアント/サーバアーキテクチャを使います。状況によって

は、使用している PC(ワークステーション)にデータベースがインストールされていることがあります。こ

の場合、その PCはクライアント兼サーバマシンで、したがって RDBMSのクライアント/サーバアーキテ

クチャを使用していることになります。

SQLガイド

dbMAGIC Ver.8.2

14.4いつ何を使うか 14–5

Page 104: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

14–6 クライアント/サーバアーキテクチャ SQLガイド

dbMAGIC Ver.8.2

Page 105: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第15章 RDBMS環境の設定章目次15.1 RDBMS環境変数の設定 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 15–2

15.2 データベースへの接続 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :15–2

15.3 データベースアクセス権限の付与 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :15–3

Page 106: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第15章 RDBMS環境の設定

RDBMS環境の設定を行う場合、まず、RDBMSのクライアントとサーバの機能や仕組みを理解しておかな

ければなりません。また、データベースに対する接続状況のチェック方法も知っておくことが必要です。

15.1 RDBMS環境変数の設定

Oracle

ORACLE_HOME : Oracleホームディレクトリ

ORACLE_SID : Oracleインスタンスの名前

この変数は、Personal Oracleにはありません。

SQL*NET2を使用しているときには、上記の変数のほか、サーバ上で次の変数を設定しなければなりません。

TNS_ADMIN : SQL*NET2管理ディレクトリ

なお、OracleサーバをWindows NTにインストールしている場合、環境変数の設定は必要ありません。

MS-SQL Server

MS-SQL Serverの場合、環境変数の設定は必要ありません。

15.2 データベースへの接続

dbMAGICユーザがデータベースに接続する場合、あらかじめ、RDBMS側でデータベースへの接続が可能

な状態になっていなければなりません。接続後、ユーザの権限がチェックされます。ここで権限が適当でな

ければ、アクセスが拒否されます。権限が不適当な場合、DBA(データベース管理者)に依頼して、所定の

権限の割り当てを行ってください。

Oracle

Oracle用のワーキングディレクトリ(ORACLE HOMEY=bin)を追加します。

ネイティブ Oracle

次のように、Sql*plusを使用して Oracleに接続します。

sqlplusユーザ名/パスワード

Windowsの場合、[Sql*plus]アイコンをダブルクリックし、Oracleユーザのユーザ名とパスワードを入力し

ます。

SQL*NETは、Oracleのオープンクライアントツールです。

15–2 RDBMS環境の設定 SQLガイド

dbMAGIC Ver.8.2

Page 107: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

15

SQL*NET1を使う場合

SQL*NET1の場合、次のコマンドを使用して Oracleに接続します。

sqlplus ユーザ名/パスワード@SQL*NET1-接続文字列

Windowsの場合、[Sql*plus]アイコンをダブルクリックし、Oracleユーザのユーザ名とパスワード、SQL*NET1

接続文字列を入力します。

Windows NT対応 Oracleサーバを使用している場合、[Host String(ホスト文字列)]フィールドを設定しな

ければなりません。

SQL*NET1接続文字列の書式は、次の通りです。

ネットワークプロトコル:ホスト名:SID

上で「ネットワークプロトコル」は、使用するネットワークプロトコルを表す 1文字です。文字は、たとえ

ば、次のようになります。

2= Personal Oracle、d= DECnet、t= TCP/IP、x= SPX/IPX、p= pipe name

また、「ホスト名」は、Oracleサーバのホスト名です。「SID」は、Oracleインスタンスの SIDです。

SQL*NET2を使う場合

SQL*NET2の場合、次のコマンドを使用して Oracleに接続します。

sqlplusユーザ名/パスワード@SQL*NET2-サービス名

Windowsの場合、[Sql*plus]アイコンをダブルクリックし、Oracleユーザのユーザ名とパスワード、SQL*NET2

接続文字列を入力します。

Windows NT対応 Oracleサーバを使用している場合、[Host String(ホスト文字列)]フィールドを設定しな

ければなりません。

SQL*NET2-サービス名は、ORACLE HOME/network/admin/tnsnames.oraファイルに定義されています。

Oracleサーバが Windowsにインストールされている場合、[データベースマネージャ]アイコンをダブルク

リックし、[エイリアス]ボタンをクリックします。

MS-SQL Server

MS-SQL Serverワーキングディレクトリ(SQL60Y=binn and SQL60Y=dll)を追加します。[ ISQL/w]アイコン

をダブルクリックします。その後、MS-SQL Serverのユーザ名、パスワード、サーバを入力します。MS-SQL

Serverデータベースへの接続をチェックしたい場合、 ISQL/wから次のコマンドを実行します。

useデータベース名

go

15.3 データベースアクセス権限の付与

ユーザは、データベースへのアクセス権限(接続許可)があるときに限って、データベースにアクセスでき

ます。接続許可は、次の SQLコマンドを使用してユーザに付与できます。

GRANT CONNECT TOユーザ名

また、ユーザがデータ辞書の内容を変更する場合、そのユーザにリソース許可が与えられていなければなり

ません。ユーザに対しては、次の SQLコマンドを使用してリソース許可を付与できます。

GRANT RESOURCE TOユーザ名

SQLガイド

dbMAGIC Ver.8.2

15.3データベースアクセス権限の付与 15–3

Page 108: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

Windowsでの権限の付与

Oracle

[データベース管理ツール]グループの[ユーザマネージャ]アイコンをダブルクリックします。その後、

[作成]をクリックして新規ユーザを作成します。最後に、[権限]をクリックし、ユーザに役割や権限を付

与したり削除したりします。

MS-SQL Server

[SQLエンタープライズマネージャ]アイコンをダブルクリックします。続いて、[ログオン管理]アイコ

ンをクリックし、ユーザとユーザが接続できるデータベースを定義します。最後に[データベース管理]ア

イコンをクリックし、DML、DLL コマンドに対するユーザの使用権限を指定します。

15–4 RDBMS環境の設定 SQLガイド

dbMAGIC Ver.8.2

Page 109: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第16章 dbMAGIC環境の設定と定義章目次16.1 SQL用MAGICゲートウェイ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :16–2

16.2 [設定/動作環境]ダイアログ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :16–4

16.3 [設定/ DBMS]テーブル : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 16–4

16.4 [設定/データベース]テーブル : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :16–6

16.5 マルチデータベース : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :16–10

Page 110: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第16章 dbMAGIC環境の設定と定義

SQLデータベースを使う場合、dbMAGIC環境の設定が必要になります。また、dbMAGIC環境の設定を行

うときには、MAGIC.INI ファイルのフラグや設定についてあらかじめ理解しておくことが必要です。

16.1 SQL用MAGICゲートウェイ

SQL用MAGICゲートウェイの設定

アーキテクチャが dbMAGICのクライアント/サーバアーキテクチャの場合も、また、RDBMSのクライア

ント/サーバアーキテクチャの場合も、SQL用MAGICゲートウェイの定義とインストールが必要になりま

す。これは、クライアント/サーバアーキテクチャでは、実行時、所定のゲートウェイがロードされること

が必要なためです。ゲートウェイは、DB番号が入った変数を使用して定義します。DB番号は RDBMSを表

し、RDBMSとゲートウェイを対応させる形(たとえば、MGDB13=mgora73.dll)で指定します。

■ オペレーティングシステムが UNIX の場合、環境変数を使用して実行可能ファイルを定義します。こ

のファイルが、ゲートウェイとして使われます。たとえば、UNIX では、次のようにします。

MAGIC_DB_14_DRIVER=$MAGIC_HOME/bin/mgoracle8

上記の「14」は、「DB番号 + 1」を表します(したがって、実際の番号は 13となります)。

■ Windows 95または Windows NTでは、MAGIC.INI ファイルの [MAGIC GATEWAYS]セクションで、

MGDBnn(nnは番号)の値として DLL を設定します。この DLL がゲートウェイに相当します。

たとえば、Oracleの ID(番号)が「13」場合、次のように定義します。

MGDB13=mgora73.dll

なお、dbMAGICのクライアント/サーバアーキテクチャを使うときには、「MGDB13」の値は「mdora32.dll」

(定義SQLゲートウェイ)にします。以下は、Windowsの場合のMAGIC.INIファイルの [MAGIC GATEWAYS]

セクションの定義例です。

[MAGIC_GATEWAYS]

;MGCOMM01=mgwsock.dll

MGDB00=mgbtrv.dll

MGDB13=mgora8.dll

MGDB19=mgodbc32.dll

MGDB20=mgms632.dll

MGDB21=mgmemory.dll

MAGICゲートウェイの命名規則

ゲートウェイは、オペレーティングシステムによって異なります。このため、ゲートウェイ(ファイル)の

名前は、その内容や種類が分かりやすいように付けられています。

■ Windowsの場合、ゲートウェイの名前は、次の書式を使用して付けられています。

MXrdbmOS.DLL

16–2 dbMAGIC環境の設定と定義 SQLガイド

dbMAGIC Ver.8.2

Page 111: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

16

・上記において、「MX」は、MD(定義 SQLゲートウェイ)、または MG(フル SQLゲートウェイ)

を表します。

・「rdbm」は、ODBCなど、RDBMSを表します。

・「OS」は、オペレーティングシステムを表し、値は、「32」、「NT」、「95」のいずれかです。

「32」は、ゲートウェイがWindows NTまたはWindows 95で動作することを示しています。「NT」

は、ゲートウェイがWindows NTのみで動作することを表します。また、「95」は、ゲートウェイ

が Windows 95でのみ動作することを示しています。

注意:� �

Oracleには各種のバージョンがありますが、使用しているバージョンに合わせて、ゲートウェ

イを所定の Oracleライブラリにリンクしなければなりません。Oracleの場合、「ORnn」の

形式で RDBMSを定義しますが、「nn」は Oracleの動作に必要なクライアント上のサポート

ファイルのバージョン(8、7.3など)を表します。たとえば、Oracle 8では、「MGORA8.dll」

を指定します。� �

■ UNIX では、ゲートウェイの名前は、次の書式を使用して付けられます。

mxrdbms

・「mx」は、md(定義 SQLゲートウェイ)、または mg(フル SQLゲートウェイ)を表します。

・「rdbms」は、Oracleなど、RDBMSの種類を表します。

MAGICゲートウェイのバージョンの命名規則

MAGICゲートウェイのバージョンの名前は、一定の規則をもとに作成されています。規則は、次の通りです。

■ 最初の文字列は、RDBMSの名前とバージョンになります。

■ 2番目の文字列は、「Version」という語になります。

■ 3番目の文字列は dbMAGICのバージョンで、その末尾には「-」が付けられます。

■ 最後の文字列はソース IDで、この IDは、「x.y」の書式になります。ここで、「x」は、メージャーソー

スバージョン(たとえば、6、7,8など)を表します。「y」は、マイナーソースバージョンまたは現行

バージョンを表します。マイナーソースバージョンは、ソースが変更されるたびに変わります。

例:

■ Oracle 7.3 Version 8.20-01J

上記の例では、「Oracle 7.3」が RDBMSの名前とバージョン番号です。その右に「Version」という語が

続き、その右に dbMAGICのバージョン番号である「8.20」が、最後にレビジョン番号として「01J」が

来ます。

SQLガイド

dbMAGIC Ver.8.2

16.1 SQL用MAGICゲートウェイ 16–3

Page 112: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

16.2 [設定/動作環境]ダイアログ

ISAMトランザクション

dbMAGICは、DBMSのトランザクションに対応しており、トランザクションがある場合、必ず、実行されま

す。ただし、データベースファイルが ISAMファイルの場合、トランザクションを実行するかどうかは [ISAM

トランザクション] 欄を使用して指定できます。プログラムにトランザクションが定義されている場合、そ

のプログラムに関連するテーブルのデータベースは dbMAGICによりチェックされます。ここで、チェック

対象のテーブルが ISAMデータベースのテーブルだったときには、設定されている内容によってトランザク

ション処理が実行されるかとどうかが決まります。

MAGIC.INI とコマンドラインでの名前:ISAMTransaction

SQLメッセージの詳細表示

アプリケーションの実行時には、場合によっては RDBMSから制約定義エラーなどのエラーが返ることもあ

ります。こういった RDBMSからのエラーは、dbMAGICのバッファに格納されます。

[SQLメッセージの詳細表示]欄を「Yes」にしておいた場合、実行時、エラーメッセージが画面に表示さ

れるようになります。同時に、バッファに格納されていたエラーが消去されます。

実行時、画面にエラーメッセージを表示させたくないときには、この[SQLメッセージの詳細表示]欄を

「No」にしておきます。この場合、エラーメッセージは、dbMAGICの DBERR関数を使用して文字列の形式

で変数に格納できます。また、プログラムで操作することもできます。

なお、このフラグを「Yes」にしておいたときには、DBERR関数からは空の文字列が返ります。これは、エ

ラーメッセージの表示と同時に、バッファに格納されていたエラーが消去されるためです。

この設定内容は、アプリケーションの機能によって変更してください。

MAGIC.INI とコマンドラインでの名前:DisplayFullMsgs

マルチユーザアクセス

[マルチユーザアクセス]欄を「Yes」にしておくと、RDBMS上で論理ロックまたは物理ロックが実行され

るようになります。

この欄を「Yes」に設定しておいた場合、Oracleでは、レコードロックが必要なときに、SELECTステート

メントに FOR UPDATE句が追加されるようになります。この欄は、できるだけ「Yes」にしておきます。と

くに、dbMAGICのロックを使用しないとき、または、dbMAGIC以外のアプリケーションからデータベース

に対してアクセスが行われるようなときには、「Yes」に設定します。

MAGIC.INI とコマンドラインでの名前:MultiUser

16.3 [設定/DBMS]テーブル

NULL

この[NULL]フラグを「Yes」にしておくと、dbMAGICのテーブルで新規の行を作成した場合、デフォル

トとして、カラムの値として NULL 値が許可されるようになります。また、CREATE TABLEステートメン

トが送出されたときには、ゲートウェイにより NULL 値が許可されたカラムが作成されます。

このフラグは、普通は「No」に設定しておきます。これは、カラムに NULL 値を許可するかどうかは、必要

なときに[カラム特性]ダイアログで設定できるためで、また、このダイアログ使った方が柔軟な操作が可

能です。

16–4 dbMAGIC環境の設定と定義 SQLガイド

dbMAGIC Ver.8.2

Page 113: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

16

浮動小数点

このフラグは、定義取得処理([オプション/定義取得]コマンド)に関してのみ有効です。

浮動小数点数など、数値のデータ型によっては、サイズがないものもあります。このフラグでは、データ型

が浮動小数点数のカラムに対して定義取得を行ったときのデフォルトの書式を設定できます。定義は、この

フラグで指定した書式で返ります。

このフラグは、通常、[デフォルト(10.3)]にしておきます。

DBMS特性

パラメータ 設定 デフォルト 有効なゲートウェイ

プランの出力 Yesまたは No No MS-SQL Server

ログレベル なし、開発者、サポート、

ユーザ

なし すべて

ログファイル名 文字 255 なし すべて

ログ同期 Yesまたは No なし すべて

最大接続数 数値 3 MS-SQL Server

分離レベル 数値 0 MS-SQL Server

テーブルの存在チェック Yesまたは No No すべて

DBMSに関するパラメータ

DBMSに関するパラメータは、[設定/ DBMS]テーブルを使用して定義できます(図 16-1)。各パラメー

タの設定は、dbMAGICで定義しているすべてのデータベースで有効になります。

図 16.1:[設定/ DBMS]テーブル

SQLガイド

dbMAGIC Ver.8.2

16.3[設定/ DBMS]テーブル 16–5

Page 114: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

16.4 [設定/データベース]テーブル

データベースに関するパラメータは、[設定/データベース]テーブルを使用して設定できます。以下、この

テーブルの設定欄について順に説明します。

図 16.2:[設定/データベース]テーブル

名前

データベースの名前です。この名前は、dbMAGICで使われます。名前は、自由に付けられます。

DBMS

この[DBMS]欄には、[名前]欄で指定したデータベースの作成元となる DBMSを指定します。この欄は

ズームでき、ズームすると[DBMS]テーブルに定義されている DBMSの一覧が表示されます。新規の行を

作成すると、その行にデフォルトの DBMSが入力されます。

[DBMS]欄の値は必ず指定しなければなりません。

DB名

SQLサーバで定義されているデータベースの名前です。

MAGICサーバ

dbMAGICのクライアント/サーバアーキテクチャの場合、データベースはサーバ上に置かれ、このデータベー

スに対しては、dbMAGICのサーバコンポーネントによりアクセスが実行されます。この欄には、dbMAGIC

のサーバコンポーネント(MAGICサーバ)を指定します。MAGICサーバは、「サーバ一覧」から選択でき

ます。

データベースが、このコンピュータに置かれている場合、または、アーキテクチャが RDBMSのクライアン

ト/サーバアーキテクチャの場合は、MAGICサーバは指定しないでおきます。

位置

どの RDBMSでも、ほとんどの場合、データベースの格納場所をアプリケーションに定義する必要はありま

せん。したがって、この欄は通常、空白にしておきます。

16–6 dbMAGIC環境の設定と定義 SQLガイド

dbMAGIC Ver.8.2

Page 115: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

16

DBサーバ

この欄には、SQLサーバの名前を指定します。RDBMSによっては、SQLサーバは接続文字列を使用して指

定することもあります。MS-SQL Serverの場合、この欄は次のようにして指定します。

■ MS-SQL Server… 必ず、SQLサーバ名を指定しなければなりません。

■ Oracle … SQL*NET1を使用しているときには、SQL*NET2のデータベースエイリアス名を指

定することもできます。また、接続文字列(たとえば、T:rs6000)を指定することも

できます。

ユーザ名、パスワード

それぞれ、ユーザ名とパスワードを指定します。必要でないときには、指定しなくてもかまいません。ユー

ザ名とパスワードは、dbMAGICの論理名やシークレット名を使用して動的または非表示にすることもでき

ます。その場合、所定の値を使用してデータベースに接続することになります。

この 2つの欄にユーザ名とパスワードを指定しなかったときには、データベースのログオン画面が表示され、

ユーザはユーザ名とパスワードを入力しなければなりません。なお、この機能は、dbMAGICバージョン 7

で追加された機能です。

接続文字列

接続文字列の設定は、DBMSが Oracleの場合にだけ必要になります。接続文字列を使った場合、接続文字列

のデータベースサーバ定義、ユーザ、パスワードが、既存の定義、ユーザ名、パスワードより優先されます。

この欄は、とくに、SQL*NET2を使う場合に有効です。

dbMAGICロック

dbMAGICには独自のロックメカニズムが搭載されており、トランザクションとは無関係に行またはテーブルの

レベルでロックが可能になっています。ロックは、MGLOCKを使用して行われます。このロックを dbMAGIC

のロックと呼んでおり、[dbMAGICロック]欄を使用して指定できます。

注意:� �

dbMAGICバージョン 7の[dbMAGICレコードロック]と[ファイルロック]の 2つの欄は、dbMAGIC

バージョン 8では[dbMAGICロック]に統一されました。� �

開発モードでのテーブル変換

この欄の値を「Yes」にしておくと、開発モードの際、dbMAGICアプリケーションでデータベーステーブル

のテーブル構造を変更できるようになります。この欄は、通常、「No」にしておきます。

定義チェック(Yes)

dbMAGICには独自のテーブルリポジトリが用意されていますが、アクセス先の DBMSにも独自のテーブル

リポジトリが用意されていることもあります。テーブルリポジトリのテーブル構造は、dbMAGICで変更す

ることもできますし(dbMAGICを使用して変更した場合、DBMSのテーブルリポジトリも自動的に変更さ

れます)、外部 DBMSのユーティリティを使用して変更することも可能です(ただし、こういったユーティ

リティでの変更によっては dbMAGICのテーブルリポジトリの変更はできません)。dbMAGICのテーブルリ

ポジトリを変更した場合、テーブルリポジトリと dbMAGICプログラムによって使用されるテーブルの構造

が異なることもあります。こういったときには、dbMAGICプログラムの動作が異常になります。この[定

義チェック]欄を「Yes」に設定しておくと、データテーブルが開かれる際、物理ファイルのテーブルの構造

と dbMAGICのテーブルリポジトリの定義がチェックされるようになります。このチェックで、物理ファイル

の構造と dbMAGICのテーブルリポジトリの定義が異なったときには、エラーメッセージが表示されるとと

もに、dbMAGICの処理がアボートされます。なお、このパラメータは、テーブル構造に関する情報が提供

される DBMSで有効です。テーブル構造に関する情報がどの程度詳しいかは、DBMSによります。

[定義チェック]欄に指定できる値と意味は次の通りです。

SQLガイド

dbMAGIC Ver.8.2

16.4[設定/データベース]テーブル 16–7

Page 116: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

Yes … テーブルがオープンされるたびに物理ファイルの構造がチェックされます。

No … テーブルのオープン時にファイルの構造がチェックされることはありません。

この欄は必須です。デフォルトの値は、データベースの作成元の DBMSの種類によります。

ロックパス

データベースサーバを使用してデータにアクセスする場合、アクセス先のデータがどこにあるかは、dbMAGIC

には認識されません。つまり、データがリモートホストにあっても、dbMAGICにはローカルに置かれてい

るように見えます。この場合、dbMAGICのロックメカニズムは機能しません。これは、dbMAGICのロック

メカニズムが、同一のデータにアクセスするユーザがすべて、同一のロックファイルを使用するときに限っ

て機能するようになっているためです。

以前のバージョンでは、テーブルロックは、プログラムのアクセスモードと共有モードの設定(プログラム

リポジトリの DBテーブル)によって決まりました。このため、マルチユーザによりアクセスが実行される

オンライン環境では、アクセスモードと共有モードの設定によっては、タスクの実行中はテーブルがロック

されてしまうということが発生しました。この問題は、データベースが SQLの場合、改善されています。つ

まり、DBMSのテーブルロック機能を使うことで、ロック時間を縮小することができるようになりました。

テーブルのロックおよびレコードロックは、[dbMAGICロック]欄を使用して設定できます。dbMAGICロッ

クのデフォルト値は「T=テーブル」です。

dbMAGICロックを「N=なし」または「R=レコード」にしておくと、dbMAGICによるテーブルレベルのロッ

クは実行されません。この場合、DBMSによって実行されるトランザクションの種類によって、テーブルの

共有モードが決まります。したがって、DBMSの保護書込トランザクションを使いたいときには、dbMAGIC

ロックを「N=なし」または「R=レコード」にしておきます。

この欄を「R=レコード」または「B=両方」に設定しておくと、レコードロックについてもデータベースの

ロックメカニズムに加えて、dbMAGICの内部ロックメカニズムも使われるようになります。この場合、デー

タベースにアクセスするすべてのユーザによって共同で使用されるディレクトリを指定しなければなりませ

ん。このディレクトリは、この[ロックパス]欄で指定します。

この[ロックパス]欄は、ほかの関連パラメータすべてに優先されます。

この欄でロックパスを指定した場合、データベースのロックは、そのパス上にあるロックファイルにしたがっ

て行われるようになります。また、ロックパスを指定する場合、そのパスは、テーブルにアクセスを実行す

るユーザすべてが使用できなければなりません。

この欄の値には、論理名を指定できます。

この欄は、オプションです。

共通データ辞書

dbMAGICでサポートされているプラットフォームの中には、中央データベース情報リポジトリ(共通デー

タ辞書)が使われる場合もあります。こういった共通データ辞書を使うことで、複数のアプリケーションか

ら同一のデータにアクセスすることができるようになり、同時に、データ構造の統一も達成できます。

共通データ辞書がある場合、この[共通データ辞書]パラメータに、その共通データ辞書の名前を指定しま

す。この辞書が、dbMAGICにより参照されることになります。共通データ辞書と、共通データ辞書がサポー

トされているプラットフォームについては、「開発者ガイド -分散開発編」を参照してください。

この欄の値としては、論理名を指定できます。

この欄は、DBMSとして XBaseを 使用する際のオプションです。現状は使用しません。

インデックスチェック(Yes)

SQLデータベースでは、設定できません。

デフォルト値は、データベースの作成元の DBMSによって異なります。

16–8 dbMAGIC環境の設定と定義 SQLガイド

dbMAGIC Ver.8.2

Page 117: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

16

データベース情報

データベースに関する情報を入力します。入力した情報は、dbMAGICにより RDBMSに送られます。この

欄は、オプションです。dbMAGICバージョン 6、7では、この欄を使用してデータベース関連のフラグを指

定しましたが、バージョン 8では必ずしもデータベース情報を入力する必要はありません。

ヒント

Oracle、MS-SQL Serverの場合、この欄を使用して、オプティマイザのヒント文字列を指定することができま

す。指定したヒント文字列は、SELECTステートメントに追加され、このステートメントを使用して dbMAGIC

のデータビューが作成されます。なお、ヒントは dbMAGICによりチェックされることはありません。その

ため、構文エラーがないように指定しなければなりません。なお、MS-SQL Serverでは、ヒント文字列とし

て FORCEINDEXを入力できますが、この場合、自動的に所定の構文が使われ、オプティマイザで強制的に

インデックスが使用されるようになります。このヒント文字列については、詳しくは、MS-SQL Serverまた

は Oracleの技術マニュアルを参照してください。

テーブルの存在チェック

この欄には、[DBMS特性]ダイアログの[テーブルの存在チェック]欄の値が表示されます。新規のテーブ

ルを作成すると、[DBMS特性]ダイアログの[テーブルの存在チェック]欄の値が、この欄にコピーされま

す。なお、この値は変更することもできます。

配列のサイズ

dbMAGICの SQLゲートウェイは、配列処理に対応しています。つまり、ゲートウェイによりデータベース

の行が取り出されるときには、単一の行ではなく、複数の行がまとめて取り出されます。この機能により、

ネットワークトラフィックが軽減されます。

配列のサイズ(取り出される行の数)は、この欄を使用して指定できます。テーブルが大きい場合、この欄の

値を大きくすると処理効率が向上します。ただし、できるだけデフォルトの値を使うようにし、特別なケー

ス以外で変更は行わないようにします。

XAトランザクション

TPモニター用の XAトランザクションを有効にします。

照合順序ファイル

[照合順序ファイル]欄でズームすると、「ファイルを開く」ダイアログが表示されます。このダイアログで

ACSファイルを指定します。ファイルが指定されていない場合は、[データベース情報]欄の ACS文字列を

参照します。そこにも指定されていない場合は、動作環境ダイアログの[照合順序ファイル]パラメータの

定義内容を参照します。ここで指定されたファイルは、DBMSの照合順序ファイルの設定に反映されます。

新しい DBMSが選択された場合は、照合順序ファイルも指定し直してください。

バージョン5および6の外部使用

バージョン 7より以前の dbMAGICでは、[データベース]テーブルの[データベース特性]ダイアログに

[外部使用]欄がありました(この欄については、詳しくは、dbMAGICバージョン 5、6のマニュアルの第

16章を参照してください)。この欄の値を「Yes」にしておくと、dbMAGIC上でアクセスが実行されている

テーブルに対して、外部から同時にアクセスが可能になります。また、この場合、データベースのロックメ

カニズムが機能しました。

dbMAGICバージョン 7、8では、デフォルトで外部からのアクセスが許可されています。この欄の設定は、

[開発モードでのテーブル変換]と[動作環境]テーブルの[マルチユーザアクセス]欄の 2つの設定と部

分的に重なります。

つまり、[外部使用]欄の値を「Yes」にすると、次の 2つの欄の設定と同じことになります。

1. 開発モードでのテーブル変換= No

2. マルチユーザアクセス= Yes

SQLガイド

dbMAGIC Ver.8.2

16.4[設定/データベース]テーブル 16–9

Page 118: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

この欄は、通常、「Yes」にしておきます。

図 16.3:[データベース特性]ダイアログ

パラメータ データ型 デフォルト 有効なゲートウェイ

ヒント 文字 255 なし Oracle、MS-SQL Server

テーブルの存在チェック Yesまたは No No すべて

接続文字列 文字 255 なし Oracle

配列のサイズ 数値 0 Oracle、MS-SQL Server

16.5 マルチデータベース

MAGIC.INI ファイルのデータベース定義は、論理定義です。つまり、このデータベース定義は、dbMAGIC

のアプリケーションのビューと動作にだけ関係しており、実際の SQLデータベースとは無関係です。

MAGIC.INI ファイルでは、同一のデータベースを事実上、複数のデータベースとして定義することができま

す。この定義は、次のようなときに必要になります。

■ データベースのテーブルに対して、二人のユーザからアクセスが実行されることがあります。この場

合、各ユーザでそれぞれ、同じデータベース定義が必要になります。

■ 旧バージョンの dbMAGICで作成されたアプリケーションを使う場合、テーブルによっては dbMAGIC

のロックメカニズムを、また別のテーブルでは RDBMSのロックメカニズムを使う必要があります。こ

ういった場合、同一のデータベースを複数のデータベースとして定義することが必要になります。と

くに、dbMAGICのロックが行レベルのロックで、RDBMSのロックがページレベルのロックのときに

は、2つのデータベース定義が必要です。この場合、dbMAGICのロックフラグを変えて 2つのデータ

ベース定義を行います。

マルチ接続

SQLゲートウェイでは、マルチ接続(複数接続)がサポートされています。通常、MAGIC.INI ファイルに定

義されているデータベースに対してはいずれも、同じ接続を使用してアクセスが実行されます。そのほか、

既存の接続の定義(データベース名、ユーザ名、パスワード、データベースサーバなど)を変更し、その接

続を使用してアクセスすることも可能です。つまり、データベースに対して 2つ目の接続を使用してアクセ

スを実行することができます。

16–10 dbMAGIC環境の設定と定義 SQLガイド

dbMAGIC Ver.8.2

Page 119: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第17章 dbMAGICのリポジトリ章目次17.1 [テーブル]リポジトリ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :17–2

17.2 [カラム]テーブルと[カラム特性]ダイアログ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :17–5

17.3 [インデックス]テーブルと[インデックス特性]ダイアログボックス : : : : : : : : : : : : : : : : : : :17–8

17.4 定義取得 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :17–10

17.5 テーブルの修正 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :17–13

Page 120: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第17章 dbMAGICのリポジトリ

データベースのメタデータの定義や管理は、dbMAGICの[テーブル]リポジトリを使うことで行えます。

[テーブル]リポジトリとデータベースはリンクされており、[テーブル]リポジトリで変更を行うと、その

変更がデータベースに伝えられます。ただし、このリポジトリで実行できるのはデータ定義の管理だけで、

データ自体の変更はできません。

また、データベースの構造の最適化やデータベースのパラメータの調整は、dbMAGICでは行えません。こ

ういった処理は、外部ツールを使用して DBA(データベース管理者)が担当することになります。新規の

テーブルは dbMAGICで作成できますが、作成されたテーブルはごく基本的なもので、その後、細部を調整

し、使用環境に見合ったテーブルに仕上げることが必要です。したがって、場合によってはデータベース管

理者の協力も必要になります。

17.1 [テーブル]リポジトリ

[テーブル]リポジトリで定義したテーブルは論理定義で、dbMAGICのプログラムでだけ認識されます。こ

のため、データベース側から見ると、dbMAGICのテーブルはデータベースのテーブルのほか、ビュー、シ

ノニムなどであることもあります。このように、dbMAGICのテーブルとデータベースのテーブルには相違

があり、たとえば、CREATE TABLEには各種のパラメータがありますが、その全部が dbMAGICで指定で

きるわけではありません。一方、同一のデータベースオブジェクトについて、dbMAGICでは複数のテーブ

ルを定義することができます。

以下、[テーブル]リポジトリの欄について説明します。

名前

テーブルを示す簡単な名前で、この名前は、dbMAGIC全体で使われます。名前は、任意のものを入力でき

ます。

DBテーブル

データベースに定義されているテーブルの実際の名前です。この名前は、データベースによっては、書式に

制限があることもあります。たとえば、Oracleでは、この名前は 30文字以内で、先頭は記号ではなく文字

でなければなりません。

データベースオブジェクトの正式名は、通常、「オーナー.テーブル名」または「データベース.オーナー.テー

ブル名」の形式になります。このうちオーナー名は、[テーブル特性]ダイアログボックスで定義できます

が、このダイアログボックスオーナー名と[DBテーブル]欄のオーナー名は同じになります。

dbMAGICバージョン 8では、これまでのバージョンと異なり、[テーブル]リポジトリに新規の行を追加し

た際、[名前]欄の名前が自動的に、この[DBテーブル]欄にコピーされます。この場合、[名前]欄の名

前に空白(半角スペース)が入っていたときには、その空白が下線に置き換えられます。たとえば、テーブ

ル名が「my emp table」の場合、DBテーブル名は「my emp table」となります。なお、テーブル名は、独自

の命名規則を作り、その規則にしたがって付けると分かりやすくなります。

従来のバージョンの dbMAGICでは、[DB テーブル]欄を空白にしておくと、デフォルトの名前として

「XXFILL099」が使われました。ここで、「99」は、[テーブル]リポジトリの行番号を表します。一方、db-

MAGICバージョン 8では、[DBテーブル]欄は必ず設定しなければなりません。また、先頭には空白は置

けません。

テーブルの名前は、命名規則を決め、その規則にしたがって名前を作成すると便利です。

17–2 dbMAGICのリポジトリ SQLガイド

dbMAGIC Ver.8.2

Page 121: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

17

データベース

この欄には、DBMSの名前を指定します。DBMSの名前は、[データベース一覧]から選択できます。デー

タベース一覧には、MAGIC.INI ファイルに定義されている DBMSが表示されます。

図 17.1:[テーブル特性]ダイアログ

欄 データ型 デフォルト 有効なゲートウェイ

オーナー名 文字 なし すべて

位置 デフォルト、ユニークインデックス、

行 IDのいずれか

デフォルト すべて

インデックス 重複不可のインデックス番号 なし すべて

テーブルの存在チェック Yes、No、デフォルトのいずれか デフォルト すべて

テーブルのタイプ テーブル、ビューのいずれか テーブル すべて

ヒントフラグ Yesまたは No Yes Oracle、MS-SQL Server

ヒント 文字(255) なし Oracle、MS-SQL Server

カーソル デフォルト、Yes、Noのいずれか デフォルト MS-SQL Server

配列のサイズ 数値(4) 0 Oracle、MS-SQL Server

テーブル特性

常駐(N=なし:デフォルト)とキャッシュ範囲(D=位置とデータ:デフォルト)

[常駐]と「キャッシュ範囲」の各欄を使用して、それぞれ、テーブルを常駐テーブルとするとか、また、

テーブルをキャッシュに置くかどうかを指定できます。各欄の詳細は、「リファレンス」を参照してください。

テーブルを常駐あるいは、キャッシュを使うことで、取り出されたデータがクライアントのメモリに格納さ

れるようになり、SQLデータベースと通信量が減るため、処理速度が向上します。

SQLデータベース情報

この欄を使用して、RDBMSで必要とされる情報を指定できます。この情報は、dbMAGICにより RDBMS

に送られます。この欄はオプションです。dbMAGIC 6、7で指定したフラグは、そのほとんどをこの欄で指

定できます。

フラグは、通常、「フラグ名=値」の形式で指定します。

SQLガイド

dbMAGIC Ver.8.2

17.1[テーブル]リポジトリ 17–3

Page 122: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

オーナー名

この欄にオーナーの名前を指定しておくと、そのオーナー名がテーブル名の接頭辞として追加されます。空

白にしておいたときには、オーナー名は追加されません。オーナー名を指定しなかったときには、デフォル

トでは、指定されているユーザ名のユーザがオーナーであるオブジェクトが検索されます。その後、そのオ

ブジェクトを使用してデータベースへの接続が実行されます。

位置

dbMAGICでは、DBMSの種類によってそれぞれ、デフォルトで使われる位置キーが決まっています。Oracle

の場合、ROWIDが使われます。これ以外の RDBMSでは、最小のユニークインデックスが使用されます。こ

のデフォルトは、変更することもできます。ユニークインデックスや ROWIDについては、第 19章の「一意

性の識別」の節に詳細があります。この[位置]欄の値は、できるだけ「デフォルト」にしておきます。

インデックス

dbMAGICのデフォルトのインデックスを使わない場合、この欄でユニークインデックスを選択できます。

デフォルト位置

この欄には、デフォルトの位置インデックスが表示されます。この欄は参照用で、値を変更することはでき

ません。

テーブルの存在チェック

この欄には、[DBMS特性]ダイアログボックスの[テーブルの存在チェック]欄の値が表示されます。新規

のテーブルを作成すると、[DBMS特性]ダイアログボックスの[テーブルの存在チェック]欄の値が、この

欄にコピーされます。なお、この値は変更することもできます。

注意:� �

この欄の値を「No」にしておくと、データベースにテーブルが作成されなくなります。これは、データ

ベースにすでにテーブルが存在していると判断されるためです。プログラムを配布するときには、この

欄は「No」にしておきます。これで、処理速度が向上します。

値を Yesにしておくと、チェックが実行され、テーブルが見つからなかったときには dbMAGICにより

自動的にテーブルが作成されます。� �

テーブルのタイプ

この欄には、テーブルの種類として「ビュー」または「テーブル」のどちらかを指定できます。「ビュー」に

した場合、 DBDEL()と DBCOPY()の 2つの関数は使用できなくなります。これは、「ビュー」ではテーブ

ルは作成されず、そのため、DBDEL()によるテーブルの削除、DBCOPY()によるテーブルのコピーは無効

になります。

ヒント

ヒントフラグ(左側のボックス)に「Yes」を指定すると、ヒント文字列(右側のボックス)を入力できる

ようになります。なお、ヒント文字列を空白にしておいたときには、データベースに指定されているヒント

文字列が使われます。ヒントフラグの値を「No」にしておくと、このテーブルについてはヒントは使われま

せん。

Oracle、MS-SQL Serverの場合、この欄を使用して、オプティマイザのヒント文字列を指定することができま

す。指定したヒント文字列は、SELECTステートメントに追加され、このステートメントを使用して dbMAGIC

のデータビューが作成されます。なお、ヒントは dbMAGICによりチェックされることはありません。その

ため、構文エラーがないように指定しなければなりません。なお、MS-SQL Serverでは、ヒント文字列とし

て FORCEINDEXを入力できますが、この場合、自動的に所定の構文が使われ、オプティマイザで強制的に

インデックスが使用されるようになります。ヒント文字列については、詳しくは、MS-SQL Serverのマニュ

アルを参照してください。この欄は、必要なときに限って使うようにします。

17–4 dbMAGICのリポジトリ SQLガイド

dbMAGIC Ver.8.2

Page 123: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

17

カーソル

MS-SQLゲートウェイの場合、この欄を使用して、内部 DBコマンドまたはカーソルのどちらを使うか指定

できます。内部 DBコマンドを指定した場合、各結果セットについてそれぞれ、別々の接続が必要になりま

す。結果セットが大きいときには、内部 DBコマンドを使うと処理効率が上がります。この欄には、「デフォ

ルト」、「Yes」、「No」のいずれかを指定できます。

■デフォルト … 1. テーブルがメインテーブルの場合、カーソルが使われます。

2. テーブルがリンクテーブルの場合、DBコマンドが使われます。

■ Yes … カーソルが使われます。

■ No … DBコマンドが使われます。

注意:� �

テーブルに BLOBカラムがあるときには、自動的に DBコマンドが使用されます。� �

配列のサイズ

dbMAGICの SQLゲートウェイは、配列処理に対応しています。つまり、ゲートウェイによりデータベース

の行が取り出されるときには、単一の行ではなく、複数の行がまとめて取り出されます。この機能により、

ネットワークトラフィックが軽減されます。デフォルトでは、配列のサイズは「0」になっており、この場合、

レコードのサイズが配列のサイズとなります。このデフォルトの値は、変更することもできます。テーブル

が大きい場合、この欄の値を大きくすると処理効率が向上します。ただし、できるだけデフォルトの値を使

うようにします。なお、この欄の設定は、[データベース特性]ダイアログボックスの[配列のサイズ]欄よ

り優先されます。

17.2 [カラム]テーブルと[カラム特性]ダイアログ

図 17.2:[カラム]テーブルと[カラム特性]ダイアログ

カラムの定義と特性は、dbMAGICにだけ有効です。また、dbMAGICのデータ型と RDBMSのデータ型が

どのように対応しているか理解しておくことも大切です。

名前

この名前は、dbMAGIC全体で使われます。名前は、任意のものを指定できます。

SQLガイド

dbMAGIC Ver.8.2

17.2[カラム]テーブルと[カラム特性]ダイアログ 17–5

Page 124: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

この欄には、dbMAGICのデータの型を指定します。

[カラム特性]ダイアログ

カラムの特性は、[カラム特性]ダイアログボックスで設定できます。特性の中には、RDBMSと密接に関連

しているものもあります。

NULL値可

この欄を使用して、カラムに NULL 値の入力を許可するかどうかを指定できます。新規のテーブルを作成す

ると、この欄の値が自動的に使われます。デフォルト値としては、MAGIC.INI ファイルの DBMSセクショ

ンの値が使われます。実行時、この欄の設定にしたがってカラムの値がチェックされます。たとえば、この

欄の値を「Yes」にしておくと、カラムに NULL 値の入力が許可され、その後、値がデータベースに送られ

ます。

NULL計算値、NULL表示文字列

この各欄を使用して、NULL 値の計算に使う値と NULL 値の表示に使う文字列を指定できます。詳しくは、

「開発者ガイド」と「リファレンス」の該当の節を参照してください。

NULLデフォルトとデフォルト値

この 2つの欄を使用して、NULL 値にデフォルト値を割り当てるかどうか、また、どういった値を割り当て

るかを指定できます。詳しくは、「リファレンス」の該当の節を参照してください。

データベースデフォルト値

この欄に値を指定しておくと、その値がデータベースに格納されます。つまり、プログラムでレコードを作

成し、このカラムの値を指定しなかった場合、この欄の値が RDBMSのカラムに格納されます。

テーブル定義をロードしたときには、この欄に指定した値がデフォルト値としてロードされます。デフォ

ルト値が定数だった場合、その値がデフォルト値としてロードされ、その後、カラムのデフォルト値とし

て dbMAGIC内部で使われます。dbMAGICで新規のテーブルを作成すると、このデフォルト値が CREATE

TABLEステートメントに追加され、カラムのデフォルト値として使われます。たとえば、RDBMSがMS-SQL

Serverで、この欄の値が「defvalue」の場合、dbMAGICにより、

CREATE TABLEオーナー 1.テーブル 1 (Col1 CHAR (5) NOT NULL DEFAULT ’defvalue’)

というステートメントが作成されます。

注意:� �

この欄の値は、CREATEステートメントでは文字列として扱われます。そのため、カラムのデータ型に

応じて所定の引用符を付加したり、所定の書式にしなければなりません。� �

記憶型式

この欄を使用して、dbMAGICのデータ型のデータをどういったデータ型で保存するか指定できます。保存

するデータ型を指定しなかったときには、SQLゲートウェイにより、デフォルトのデータ型割り当てにした

がってデータが格納されます。たとえば、dbMAGICの「文字」型が「Zstring」型に割り当てられていると

きには、文字型のデータは Zstring型で格納されます。なお、dbMAGICの「文字」型は、dbMAGICでのみ

有効です。

使用している RDBMSを別の RDBMSに変更したときでも、基本的には、データは同じデータ型が格納され

ます。ただし、互換性の理由から、RDBMSによっては、それまでと異なるデータ型で保存されることもあ

ります。

dbMAGICのデフォルトの記憶型式はできるだけ変更しないようにします。詳しくは、第 18章「データ型の

割当」を参照してください。

17–6 dbMAGICのリポジトリ SQLガイド

dbMAGIC Ver.8.2

Page 125: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

17

SQLデータベース情報

ここには、データベース独自の情報を入力できます。入力した情報は、dbMAGICにより DBMSに送られ

ます。

図 17.3:[カラム特性]SQLデータベース情報

DBカラム名

カラムの実際の名前、つまり、使用しているデータベースで定義されているカラムの名前です。この名前は、

通常、データベースの命名規則にしたがって付けなければなりません。

従来のバージョンと異なり、dbMAGICバージョン 8では、テーブルに新規のカラムを追加すると、そのカ

ラムの名前がこの欄にコピーされるようになりました。また、空白は自動的に下線に置き換えられます。コ

ピーされたカラム名は、その後、変更できますが、空白は入れることはできません。たとえば、新規に作成

したカラム名が「emp id」の場合、この欄にコピーされた名前は「emp id」になります。なお、カラムの名

前は、一定の命名規則にしたがって付けるのが原則です。

タイプ

この欄には、データベースのカラムのデータ型を指定します。指定したデータ型は、テーブル定義のロード

と同時にロードされます。なお、[テーブル]リポジトリで新規のテーブルを作成すると、自動的にデフォル

トのマッピングをもとにデータ型が自動的に割り当てられるため、この欄の設定は普通は必要ありません。

ただし、デフォルトのデータ型の割当が不適当なときには、この欄を使用してデータ型を割り当てることが

必要になります。

たとえば、データベースが Oracleの場合、デフォルトでは、dbMAGICの日付型は、Oracleの’DATE’ 型に割

り当てられます。その場合、この欄を使用して別のデータ型、たとえば、SQLデータ型の CHAR (8)を割り

当てることもできます。dbMAGICと各種 RDBMSのデータ型のデフォルトのマッピング(割当)や対応関

係については、第 18章「データ型の割当」に詳細があります。

SQLガイド

dbMAGIC Ver.8.2

17.2[カラム]テーブルと[カラム特性]ダイアログ 17–7

Page 126: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

ユーザタイプ

データベースでユーザ定義データ型(UDT)が定義されていることがありますが、こういったユーザ定義デー

タ型は、この欄を使用して指定できます。ほとんどの RDBMSの場合、ユーザ定義データ型は、システムデー

タ型をもとに作成できます。たとえば、 ’VARCHAR(20)’というシステムデータ型をもとに’description’とい

うユーザ定義データ型を作成できます。作成したユーザ定義データ型は、CREATE TABLEや ALTER TABLE

などのステートメントで使用でき、また、デフォルト値や規則を設定することもできます。この欄に指定し

たユーザ定義データ型は、テーブルのロードと同時にロードされます。また、ユーザ定義データ型の作成元

となっているシステムデータ型もロードされます。この欄は dbMAGIC内部で使われます。また、現在のバー

ジョンでは、dbMAGICでテーブルを作成する場合、使用できるデータ型は SQLデータ型に限られます。

17.3 [インデックス]テーブルと[インデックス特性]ダイアログボックス

図 17.4:[インデックス]テーブルと[インデックス特性]ダイアログ

dbMAGICのインデックスは、dbMAGICの論理属性で dbMAGICだけで有効です。したがって、dbMAGIC

のインデックスとデータベースのインデックスは異なることもあります。データベースのインデックス構造

は、定義取得処理で確認できます。

dbMAGICのインデックスは、データベースのインデックスと同じように作成するのが理想的です。これで、

オプティマイザによるソート処理も不要になり、応答速度も向上します。

dbMAGICのインデックスには、次のような特徴があります。

■ dbMAGICで新規のテーブルを作成する場合、そのインデックスのデータ型を「実」にすると、そのイ

ンデックスと同じインデックスが自動的にデータベースに作成されます。

■ 実行時、dbMAGICのインデックスの種類や内容により、ORDER BY句がどのように SELECTステー

トメントに追加されるかが決まり、その後、SELECTステートメントが dbMAGICから送出されます。

言い換えれば、インデックスに設定されているセグメントが、ORDER BY句のカラムとして使われま

す。たとえば、インデックスがユニークインデックスで、セグメントが「Deptno(部門番号)Asc」と

「Ename(名前)Desc」の 2つの場合、次のような SELECTステートメントが作成されます。

SELECT ... FROM ... WHERE ... ORDER BY Deptno Asc, Ename Desc’

名前

インデックスの名前で、この名前は、dbMAGIC全体で使われます。名前は、任意のものを付けられます。

17–8 dbMAGICのリポジトリ SQLガイド

dbMAGIC Ver.8.2

Page 127: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

17

重複

この欄では、インデックスが重複不可(ユニークインデックス)であるか重複可(ノンユニークインデック

ス)であるかを指定できます。

SQLゲートウェイによっては、テーブルに少なくても 1つ以上、ユニークインデックスが必要な場合もあり

ます。

インデックスは、できるだけ、すべてユニークインデックスにするようにします。ユニークインデックスは、

ノンユニークインデックスより処理効率が上です。

セグメント

このグループボックスには、画面上部のインデックス一覧のセグメントがすべて表示されます。

[順]欄では、「昇順」と「降順」のいずれかが選択できます。なお、データベースにインデックスを作成す

る場合、データベースによっては昇順だけしかサポートされていないものもありますので、注意が必要です。

詳しくは、RDBMSに付属のマニュアルを参照してください。

[インデックス特性]ダイアログ

方向

この欄では、オンラインタスクの場合、テーブルの処理を双方向または片方向のどちらで行うかを指定でき

ます。

範囲処理モード

この欄は、SQLでは無効です。

SQLデータベース情報

ここには、データベース独自の情報を入力できます。入力した情報は、dbMAGICにより DBMSに送られま

す。この欄はオプションで、省略することもできます。

dbMAGIC 6、7では、この欄にはフラグを指定しましたが、バージョン 8では、そのほとんどは dbMAGIC

に内蔵され、指定する必要はなくなっています。

DBインデックス名

インデックスの実際の名前、つまり、使用しているデータベースで定義されているインデックスの名前です。

この名前は、通常、データベースの命名規則にしたがって付けなければなりません。

従来のバージョンと異なり、dbMAGICバージョン 8では、テーブルに新規のインデックスを追加すると、そ

のインデックスの名前が、この[DBインデックス名]欄にコピーされるようになりました。また、空白は

自動的に下線に置き換えられます。コピーされたインデックス名は変更できますが、空白は入れることはで

きません。

たとえば、新規に作成したインデックス名が「emp ind1」の場合、[DBインデックス名]欄にコピーされた

名前は「emp ind1」になります。

インデックスのタイプ

[インデックスのタイプ]欄では、インデックスが dbMAGICとデータベースの両方で定義されているか、

または dbMAGICでだけ定義されているか、その別を指定できます。この情報を使用して、インデックスが

データベースのインデックスか、dbMAGICのインデックスかが判断されます。新規のテーブルを作成する

際、作成するインデックスを dbMAGICのインデックスにしたい場合、この欄は「実」にしておきます。

この欄の設定は、既存のテーブルを実行するときには無関係です。たとえば、ビューへのアクセス実行時に

は仮想インデックスが追加されますが、この仮想インデックスと、この欄の設定は関係ありません。なお、

ビューへのアクセスでは、仮想インデックスより、RDBMSによるソート機能を使用してプログラムでソー

トを行うほうが効率がよくなります。この機能を使うと、所定の順にしたがってレコードが取り出されるた

め、dbMAGICでのソートの必要がなくなります。

SQLガイド

dbMAGIC Ver.8.2

17.3[インデックス]テーブルと[インデックス特性]ダイアログボックス 17–9

Page 128: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

クラスタ化インデックス

MS-SQL Serverの場合、この欄を使用して、dbMAGICでテーブルを作成する際、そのテーブルのインデック

スをクラスタ化インデックスとして作成するかどうかを指定できます。dbMAGIC 6、7では、最初のユニー

クインデックスはデフォルトでクラスタ化インデックスとして作成されました。一方、dbMAGICバージョ

ン 8では、この欄を使用して、どのインデックスをクラスタ化インデックスとして作成するかを設定できる

ようになりました。なお、レコードの挿入が多いテーブルでは、クラスタ化インデックスは、処理速度を低

下させることがあります。

クラスタ化インデックスのカラムでは、物理データは、そのインデックスの順にしたがって格納されます。

このインデックスの場合、順番に並んでいるデータのうち、複数のデータをセットで取り出すときには処理

効率は上がりますが、単一のデータを取り出すときには効率はよくありません。クラスタ化インデックスに

ついては、詳しくは、MS-SQL Serverのマニュアルを参照してください。

インデックスの再作成

この欄では、再索引モードのプログラムを実行するとき、それまでのインデックスをプログラムの初期時に

削除するかどうかを指定できます。PRIMARY KEY制約のインデックスには、このフラグを NOにしてくだ

さい。

17.4 定義取得

既存の RDBMSのテーブルを使う場合、あらかじめ、データ辞書に格納されているテーブル定義を取り出す

のが有効です。これで、dbMAGICで定義を初めから行う必要がなくなります。また、エラーも発生しにく

くなり、開発効率も向上します。

定義取得は、[オプション]メニューの[定義取得]コマンドを使用して実行できます。このコマンドでは、

ゲートウェイを介してデータベースにアクセスすることができ、また、データベースの定義も、その場で変

更できます。

データベースのファイル(テーブル)は、一つでも複数でも取得できます。[定義取得]コマンドは、[テーブ

ル]リポジトリで、テーブルにいずれかの SQLデータベースが割り当てられているときに有効になります。

単一のテーブルを取得する場合、次のようにします。

1. [テーブル]リポジトリを開きます。

2. 新規の行にカーソルを置きます。

3. データベース(RDBMS)を選択します。

4. 取得するテーブルの名前を入力します。

5. [オプション]メニューを開きます。[定義取得]コマンドが有効になっているはずです。

6.[定義取得]コマンドを選択します。選択後、[定義取得]ウィンドウが開きます。このウィンドウは、

自動的に閉じます。この後、[テーブル]リポジトリの各欄に何らかの値が入っているはずです。

7. [カラム]欄に移動し、ズームして、取得されたカラムの内容を確認します。

8.[インデックス]欄に移動し、ズームして、取得されたデータベースのインデックスを確認します。こ

の場合、データベースのインデックスは dbMAGICのインデックスとして取得されます。

17–10 dbMAGICのリポジトリ SQLガイド

dbMAGIC Ver.8.2

Page 129: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

17

図 17.5:[テーブル]リポジトリと[定義取得]コマンド

図 17.6:[テーブル]リポジトリと[定義取得]ウィンドウ

[定義取得]ウィンドウは、自動的に閉じます。この後、テーブルの各欄に値が表示されます。

SQLガイド

dbMAGIC Ver.8.2

17.4定義取得 17–11

Page 130: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

図 17.7:[定義取得]ウィンドウが閉じた後の[テーブル]リポジトリ

複数のテーブルを取得したい場合、次のようにします。

1. カーソルを[テーブル]リポジトリのタイトルの行に置きます。

2. [オプション]メニューから[定義取得]を選択します。

3. [定義取得]ウィンドウが表示されます。

4. [データベース]欄に移動し、ズームします。

5. [データベース一覧]からデータベースを選択します。

6. [タグテーブル]欄に移動し、ズームします。

「S=選択」を選択することで、[テーブル選択]ウィンドウを使用して、データベースでアクセス可能なテー

ブル(ユーザ名とパスワードが設定されているテーブル)を選択することができます。

[テーブル選択]ウィンドウが開きます。

図 17.8:[テーブル選択]ウィンドウ

17–12 dbMAGICのリポジトリ SQLガイド

dbMAGIC Ver.8.2

Page 131: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

17

この後、[テーブル選択]ウィンドウで、定義取得したいテーブルを選択します。選択したテーブルには、

チェックマークが表示されます。選択は、次のようにして行います。

1. 定義をロードしたいテーブルをハイライトさせます。

2. スペースバーを押します。これで、[選択]欄にチェックマークが表示されます。このチェックマーク

が付いたテーブルの定義が読み込まれることになります。

定義取得の際の注意

定義取得を行う場合、次の点に注意してください。

■ 既存のテーブルの定義を取得した場合、データベースの各カラムのデータ型はそれぞれ、dbMAGICの

データ型のうち、データベースのデータ型に一番近いデータ型に変換されます。

■ 特殊データ型は、そのデータ型が dbMAGICにあるときには、その特殊データ型が使われます。

■ dbMAGICでサポートされていないデータ型が見つかった場合、定義取得は失敗します。

■ 定義取得処理は、データベースによって異なることがあります。

■ テーブルリポジトリの[オプション/定義取得]を行うと、[名前]欄にテーブル名が上書きされます。

ビュー定義の取得

SQLには、テーブル定義のほか、ビュー定義もあります。このビューについても、[定義取得]コマンドで

定義を取得できます。SQLのビューは仮想テーブルで、クエリにより定義されます。ビューはテーブルと同

じようにアクセスできますが、格納されている行は物理行ではありません。SQLのビューに対しては、一般

に照会モードでアクセスでき、さらに、RDBMSによってはテーブルと同じように行の更新が可能です。

ビューにはインデックスはありません。そのため、ビューの定義を取得する際には、仮想ユニークインデック

スを定義しなければなりません。これは、dbMAGICでは、処理上、テーブルの位置情報が必要なためです。

なお、Oracleでは、ROWIDが使われ、ビューがテーブルをもとに作成されているときには、ROWIDを取得

できます。この ROWIDが位置情報になります。ただし、これ以外の場合、ビューの定義を取得するときに

は、仮想ユニークインデックスを定義しなければなりません。

17.5 テーブルの修正

テーブルの内容は、dbMAGICで変更することができます。変更処理としては、データの変換、テーブル名

の変更、テーブルの再作成といったことが可能です。また、インデックスの再作成も可能です。こういった

変更は、次のいずれかの方法で行えます。

■ ALTER、RENAME、DROPなど、RDBMSの DLL ステートメントを使用して変更処理を行えます。

■ ISAMファイルについて実行できるような変更処理が可能です。たとえば、一時テーブルの作成、既存

のデータの一時テーブルへのコピー、新規のテーブルの作成、データの新規のテーブルへのコピーと

いった処理が行えます。

なお、テーブルの変換処理は、dbMAGICだけで変換するより、データベース管理者に依頼して RDBMSの

DLL ツールを使用して変換するのが効率はおおよそよくなります。実際、ALTERコマンドは、データベー

ス管理者が直接、RDBMS側で実行するようにします。

■ Oracleゲートウェイでは、テーブルの変換時には、Oracleゲートウェイの ALTERコマンドは使用され

ません。このため、データベースのテーブルのカラムのうち、dbMAGICの[テーブル]リポジトリに

表示されないカラムがある場合、テーブルの変換を行うと、そのカラムは削除されます。

■ Oracleゲートウェイでは、DLLコマンドを使用してすべての処理を行うことができます。ただし、テー

ブルとカラムの名前の変更はできません。

SQLガイド

dbMAGIC Ver.8.2

17.5テーブルの修正 17–13

Page 132: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

テーブルの変更を行う場合、[開発モードでのテーブル変換]欄の設定に影響されます。この設定が「No」に

なっていると、データベースのテーブルの変更ができません。インデックス順次ファイルの場合、dbMAGIC

での変更処理は、SQLよりもシステムリソースの負担が大きくなります。たとえば、SQLで新規のインデッ

クスを作成する場合、データの再構築は行われませんが、ISAMファイルではデータの再構築が必要になり

ます。また、RDBMSの場合、その種類にもよりますが、フィールドの削除の際にもデータの再構築は行わ

れません。これは、RDBMSでは、データリポジトリのデータの変更だけで済むためです。また、データ型

の変換も、同様にデータリポジトリのデータの変更だけで済みます。

17–14 dbMAGICのリポジトリ SQLガイド

dbMAGIC Ver.8.2

Page 133: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第18章 データ型の割当章目次18.1 dbMAGICのデフォルトのデータ型の割当 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :18–2

18.2 テーブル定義取得と割当 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :18–2

18.3 SQLのデータ型の強制指定 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 18–3

18.4 日付型と時刻型の割当 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :18–4

18.5 Oracle : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 18–6

18.6 Microsoft SQL Server : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :18–7

18.7 ODBC : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 18–8

18.8 データ定義規則 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :18–9

Page 134: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第18章 データ型の割当

dbMAGICのデータ型は RDBMSのデータ型に割り当てることができ、その方法も簡単です。ただし、対応

関係が分からない場合、プログラマの援助が必要になることもあります。

18.1 dbMAGICのデフォルトのデータ型の割当

dbMAGICで新規のカラムを作成する場合、文字や数値、論理など、そのカラムのデータ型を指定できます。

SQLゲートウェイにはすべて、データ型対応テーブルが用意されており、このテーブルには、ゲートウェイ

に対応する RDBMSのデータ型と dbMAGICのデータ型の対応が記録されています。データベースにテーブ

ルを作成するときには、このデータ型対応テーブルが使用されます。また、実行時には、このテーブルを介

して dbMAGICのデータ型と RDBMSのデータ型の相互変換が行われます。

dbMAGICのデータ型の中には、複数の記憶型式で保存することができるものもあります。どの記憶型式で保

存されるかは、ゲートウェイによって決められます。また、SQLを使う場合、記憶型式によっては dbMAGIC

のデータ型との対応が不適当なものもあり、そういった記憶型式は使用を避けるようにします。たとえば、

dbMAGICの数値型にMS Float Basicを割り当てると、RDBMSから dbMAGICへデータが送られるとき、ま

たは dbMAGICから RDBMSにデータが返るときに変換が実行され、このため、処理速度が低下します。

dbMAGICのデータ型と記憶型式の割当は、デフォルトで決められています。できるだけ、このデフォルト

の割当を使うようにします。また、デフォルトの割当は、dbMAGIC 7と dbMAGIC 8では若干変更されてい

ます。また、アプリケーションによっては多少変更が必要になることもあります。

■ dbMAGICの日付型の長さは 8に固定されています。アプリケーションでは、この規則に準拠しなけれ

ばなりませんが、データベース側では変更は不要です。ただし、dbMAGIC 6または 7で SQLの日付

のデータ型として CHAR (6)を使用しているときには、長さを 8に変更しなければなりません。

18.2 テーブル定義取得と割当

テーブルの定義取得を実行すると、SQLゲートウェイにより、SQLデータベースのシステムテーブルがロー

ドされますが、それと同時にテーブルの各カラムのデータ型に関する情報が読み込まれます。この処理によ

り、SQLゲートウェイで、RDBMSのデータ型に応じて dbMAGICのデータ型と記憶型式が判別されるよう

になります。また、データ型に関する情報のほか、カラムの長さやプレシジョン、スケールに関する情報も

読み取られ、その情報にしたがって dbMAGICの書式フィールドが作成されます。なお、データベースから

の情報が不足することもあり、その場合にはプログラマによる補完作業が必要になります。この補完作業は、

たとえば、次のようなときに必要になります。■ データベースのデータ型が LONGRAW、イメージ( Image)、テキスト(Text)のいずれかで、長さが

ないとき。この場合、dbMAGICの書式フィールドは空白になり、したがってプログラマが手動で調整

しなければなりません。

■ データベースのデータ型が LONGRAW、イメージ( Image)、テキスト(Text)のいずれかで、dbMAGIC

のデータ型がメモ型や BLOB型の場合。この場合、テーブルの定義取得を行うと、データベースのデー

タ型がそのまま使われます。したがって、調整が必要になります。

■ MS-SQL Serverの場合、バイナリ系のデータ型は、dbMAGICでは複数のデータ型に割り当てることが

できます。ただし、デフォルトを設定している場合、テーブルの定義取得を実行すると、ゲートウェイ

ではデフォルトの設定が使われます。

■ Oracleでは、数値系のカラムは、内部では 40桁で格納されます。このため、テーブルの定義取得を行

うと、書式は問題はありませんが、データ型は必ず浮動小数点数(Float)になります。この場合、た

とえば、符号付き整数などのデータ型に変更することもできます。

18–2 データ型の割当 SQLガイド

dbMAGIC Ver.8.2

Page 135: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

18

各 RDBMSと dbMAGICのデータ型の対応関係については、後述の対応表を参照してください。

18.3 SQLのデータ型の強制指定

データは、デフォルト以外のデータ型を使うこともできます。その場合、指定は、[カラム特性]ダイアログ

の[SQL]タブの[タイプ]欄で行えます。たとえば、長さが 1文字の文字型のデータの場合、その格納形

式は、VARCHAR2(1)より CHAR(1)が適当です。ゲートウェイのデフォルトは、VARCHAR2(1)になってお

り、したがって、[SQL]タブの[タイプ]欄を使用して CHAR(1)に変更します。このように、データ型が

dbMAGICのデータ型と合致しないときには問題が起こることがあり、その場合、できるだけ変更するよう

にします。

また、テーブルの定義取得を実行すると、SQLゲートウェイにより自動的に SQLのデータ型が設定される

こともあります。

dbMAGICのデータ型

以下、dbMAGICのデータ型、サポートされている記憶型式、RDBMSのデータ型の対応表を掲載します。

RDBMSのデータ型はデフォルトのデータ型で、いずれも[カラム特性]ダイアログの[SQL]タブの[タ

イプ]欄で別のデータ型をとくに指定できます。

表は、MS-SQL、Oracle、ODBCに分けて掲載しております。

dbMAGICのデータ型 MS-SQLのデータ型 Oracleのデータ型 ODBCのデータ型

文字型(Zstring) Char/Text* Varchar2/ Long/ Char sqlchar/

sql longvarchar�

数値型(Signed Integer) Smallint、Integer Number sqltinyint/

sql smallint

数値型(Unsigned Integer) Binary Number sqlinteger/

sql binary sqlfloat

数値型(Float) Float、Real Number sqlfloat/ sql double�

日付型(StringNumber) BINARY Number sqlbinary�

数値型(Float MS-Basic) BINARY RAW sql binary�

数値型(Packed Decimal) BINARY RAW sql binary�

日付型(String Date) Datetime/ Char�� Date/Char/ Raw�� sql date

日付型(String Time) Char Char/Raw/ Date sqltime

メモ型(String Memo) Binary /Image Raw/ Longraw� sql binary

論理型( Integer Logical) Bit/ Smallint Number sqlbit

論理型(String Logical) Binary Raw sqlbinary

BLOB型(Blob)*** Image Longraw sqllongvarbinary

その他 Binary/ Image Raw/ Longraw sqlbinary/ sqllong

varbinary

注意:データ型が複数記載されている場合、最初に示してあるデータ型がデフォルトです。*-どちらのデータ型が使われるかは、カラムの長さによって決まります。**- dbMAGIC の String Date(文字列日付)のデータをデータベースに文字として保存したい場合、SQLのデータ型として char (8)を指定します。***- BLOB 項目は一つのテーブルにただ一つだけ設定できます。BLOB 項目とメモ項目 (データ型が LONGRAWのもの) を同じテーブルに同時に定義することはできません。また、テーブルチェックユーティリティでは Oracleの LONG型、LONG RAW型、dbMAGICのメモ型( 254バイト以上の長さを持つメモ型項目)および dbMAGICの BLOB型を区別しません。そのため、dbMAGICがこれらの型の項目を複数個見つけた場合、「メモ項目は1個しか使用できません。」というエラーメッセージを返すことがあります。****- MS-SQL では以下の注意点があります。論理型 (IntegerLogical)の場合サイズ 1(デフォルト)では Bit 型、サイズ 2では SmallInt型になります。MSSQLの制限により Bit 型の場合、インデックスに指定できません。Char/TEXTの場合

SQLガイド

dbMAGIC Ver.8.2

18.3 SQLのデータ型の強制指定 18–3

Page 136: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

項目の長さが255以下の場合は[Char]、それ以上の場合は[Text]になります。Smallint/Integeの場合項目の桁数が4桁以下の場合は [Smallint]、それ以上の場合は [Integer]になります。Float/Realの場合項目の桁数が6桁以下の場合は [Real]、それ以上の場合は [Float]になります。Binary/Image*4項目の長さが253以下の場合は [Binary]、それ以上の場合は [Image]になります。Binary/Smallintの場合

項目のサイズが1バイトの場合は [Bit]、2バイトの場合には [Smallint]になります。

18.4 日付型と時刻型の割当

dbMAGICの日付型は、デフォルトでは RDBMSの Dateまたは Timeに割り当てられています。ただし、次

の事項に注意が必要です。

1. RDBMSでは通常、日付と時刻はともに同じカラムに格納されます。一方、dbMAGICでは、日付と時

刻は別のデータ型として扱われます。

2. データベースが Btrieveなどの ISAMファイルの場合、dbMAGICアプリケーションでは日付の値とし

て 0が使用できますが、RDBMSでは日付の値として 0は無効です。

3. dbMAGICと各データベースとの日付、時刻の対応関係については、対応表を参照してください。

dbMAGICでの日付カラムの定義

dbMAGICで日付カラムを定義する場合、次のパラメータに注意してください。

サイズ

dbMAGICバージョン 7まででは、日付型のデフォルトのサイズは 6でした。このデフォルトのサイズは、

8に変更できます。dbMAGICバージョン 8では、デフォルトのサイズは 8に変更されています。このため、

西暦年の部分はすべてデータベースに格納できるようになりました。また、西暦 2000年問題にも対応でき

ます。

記憶型式

日付の記憶型式のデフォルトは String Dateで、できるだけこれを使うようにします。ただし、データの内部

変換には必ずしも、この String Dateが必要なわけではありません。このため、データベースで CHARACTER

(CHAR)が使われている場合、CHARにしてもかまいません。

タイプ

日付の値として「0」を使わない場合、データベースの日付のデータ型を使うようにします。Oracleでは、日

付のデータ型は Dateです。また、MS-SQL Serverでは、日付のデータ型は Datetimeです。また、日付カラ

ムに必ず値を入れなければならないときには、次のようにします。

■ 日付カラムの値として、NULL 値を許可します。

■ セレクトコマンドの代入式を使用して、カラムを基準日付に初期化します。

■ dbMAGICのデフォルトの日付をカラムの基準日付として使います。

■ プログラムで日付カラムが選択されていない場合、データベースのデフォルトの日付を使います。

日付カラムに「0」を格納したいときには、dbMAGICの日付のデータ型をデータベースの CHARACTERに

割り当てます。この割当は、[タイプ]欄を使用して行えます。たとえば、このパラメータの値を次のように

設定します。

CHAR (8)

上記のように設定すると、日付カラムの値は CHARACTERの型式で保存されるようになり、したがって、

「0」の格納も可能になります。

18–4 データ型の割当 SQLガイド

dbMAGIC Ver.8.2

Page 137: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

18

データ型の割当と既存のデータ

■ dbMAGICの日付型 - dbMAGICの日付型をデータベースの Dateまたは Datetimeに割り当てると、

dbMAGICアプリケーションでは時刻の部分が見えなくなるという現象が起こります(dbMAGICでは、

日付と時刻は別個に扱われるためです)。こういったカラムにデータを挿入したり更新を行うと、SQL

ゲートウェイにより、日付に一定の時刻(通常は 24:00:00)が自動的に追加されます。また、データの

挿入や更新以外の場合は、RDBMSのデフォルトの値が格納されます。ただし、こういったカラムに対

する範囲の設定は、問題はありません。

■ dbMAGICの文字型 -時刻の部分が dbMAGICアプリケーションで表示されるようにしたい場合、db-

MAGICの文字型をデータベースの Dateまたは Datetimeに割り当てます。この場合、dbMAGICの文

字型の長さは 19文字とします。データベースの Dateまたは Datetimeを割り当てるには、[カラム特

性]ダイアログの[SQL]タブの[タイプ]欄の値を「”DATE”」または「”DATETIME” 」に設定しま

す。これで、日付と時刻がすべて dbMAGICに文字として取り込まれ表示されるようになります。な

お、この場合、日付と時刻のチェックは行われません。

日付と時刻をチェックしたい場合、dbMAGICの Timeと Dateのデータ型の仮想フィールド(変数項目)を

それぞれ作成し、DVAL 関数と TVAL 関数を使用して、この 2つのフィールドを実際のフィールドに割り当

てます。

dbMAGICの文字型をデータベースの Dateまたは Datetimeに割り当てた後、テーブルの定義取得処理を実

行すると、使用している SQLゲートウェイ用のデータ型割当フラグがオンになります。

時刻型

dbMAGICの時刻型は、デフォルトの割当で通常は問題はありません。時刻には文字型が使われ、このため、

時刻カラムの内容は dbMAGICアプリケーションでも表示できます。

dbMAGICのデータ型と RDBMSのデータ型の対応表

以下、dbMAGICのデータ型と RDBMSのデータ型の対応表を掲載します。対応表は、RDBMS別になって

います。

SQLガイド

dbMAGIC Ver.8.2

18.4日付型と時刻型の割当 18–5

Page 138: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

18.5 Oracle

以下は、Oracleのテーブルに対して定義取得を行った後の結果です。

Oracleと dbMAGICのデータ型の対応

Oracle の

データ型

dbMAGICの型 dbMAGICの

記憶型式

保存サイズ SQL データ

書式

Varchar2(n)

**

文字型 Zstring 1-4000 n

Char(n) ** 文字型 Zstring 1-255 CHAR(n) n

Long ** 文字型 Zstring 0* LONG 0

Raw(n) *** 文字型 Zstring 1-2000 n

Long raw *** 文字型 Blob 0* LONGRAW 0

Number 数値型 Float 8 10.3

Number(p,q) 数値型 Float 8 p-q.q

Number(p) 数値型 Float 8 p

Date** 日付型 String Date 8 YYYY/MM/DD

Rowid 文字型 Zstring 19 18

* - Oracleの Longと Long rawでは、保存サイズはアプリケーションで指定しなければなりません。** - 書式の長さによって異なります。Oracle7の場合、2000桁以内では VARCHAR2型,それを越えると LONG型になり、Oracle8の場合、4000桁以内では VARCHAR2 型, それを越えると LONG 型になります。CHAR 型に設定するときは、カラム特性/タイプでCHAR(n)を設定します。*** - 書式の長さによって異なります。Oracle7の場合、253桁以内では RAW 型,それを越えると LONG RAW型になり、Oracle8の場合、1998桁以内では RAW 型,それを越えると LONG RAW型になります。

18–6 データ型の割当 SQLガイド

dbMAGIC Ver.8.2

Page 139: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

18

18.6 Microsoft SQL Server

Microsoft SQL Serverと dbMAGICのデータ型の対応

MS-SQL Serverのデータ型 dbMAGICの型 dbMAGICの記憶型式 保存サイズ

Char(n)、Varchar(n) 文字型 Zstring n、1-255

Text 文字型* Zstring デフォルト

Int 数値型 Signed Integer 4

Smallint 数値型 Signed Integer 2

Tinyint 数値型 Unsigned Integer 1

Numeric(p,s) 数値型 Float 8

Decimal(p,s) 数値型 Float 8

Float(8)(double precision) 数値型 Float 8

Float(4)(real) 数値型 Float 4

Money 数値型 Float 8

Smallmoney 数値型 Float 4

Datetime* 文字/日付型 Zstring/String Date 23/8

Smalldatetime* 文字/日付型 Zstring/String Date 16/8

Binary(n)、Varbinary(n) 文字型 Zstring n、1-255

Image 文字型 Zstring デフォルト

Bit 論理型 Integer Logical 1

Timestamp 文字型 Zstring 8

* -デフォルトでは、Microsoft SQL Serverの日付型(datetime、smalldatetime)は、dbMAGICの日付型(Date)に割り当てられており、この場合、時刻は表示されません。日付と時刻の両方を表示したい場合、Microsoft SQL Serverの Datetimeまたは Smalldatetimeを dbMAGICの文字型(Alpha)に割り当てます。これで、Datetimeのときには YYYY/MM/DD HH:MM:SS.mmm の書式で、また、Smalldatetimeのときには YYYY/MM/DD HH:MM の書式で日付と時刻が表示されるようになります。Datetimeまたは Smalldatetimeを dbMAGICの文字型(Alpha)に割り当てるには、[データベース特性]ダイアログの[データベース情報]ボックスに「SQL DATETOALPHA=Y」と入力します(図 16.3を参照してください)。* - MS-SQL Serverの text型では、保存サイズはアプリケーションで指定しなければなりません。

* - datetime型の制限により、dbMAGICの日付書式 String Date型には 1753/01/01以前の値は登録出来ません。

SQLガイド

dbMAGIC Ver.8.2

18.6 Microsoft SQL Server 18–7

Page 140: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

18.7 ODBC

ODBCの SQLデータ型と dbMAGICのデータ型の対応

ODBCのデータ型 dbMAGICの型 dbMAGICの記憶型式 保存サイズ

SQL CHAR 文字型 Zstring 1-255

SQL VARCHAR 文字型 Zstring 1-255

SQL LONGVARCHAR 文字型 Zstring デフォルト=0

SQL DECIMAL 数値型 Float 8

SQL NUMERIC 数値型 Float 8

SQL SMALLINT 数値型 Signed Integer 2

SQL INTEGER 数値型 Signed Integer 4

SQL REAL 数値型 Float 4

SQL FLOAT 数値型 Float 4

SQL DOUBLE 数値型 Float 8

SQL BIT 論理型 Integer Logical 1

SQL TINYINT 数値型 Unsigned Integer 1

SQL BIGINT 数値型 Signed Integer 4

SQL BINARY 文字型 ZString 1-255

SQL VARBINARY 文字型 ZString 1-255

SQL LONGVARBINARY Blob Blob

SQL DATE 日付型 String Date 8

SQL TIME 時刻型 String Time 6

SQL TIMESTAMP 日付型 String Date 8

*-(ZStringの Oracleのデータ型 Varchar2/Long/Charに対して)書式の長さによって異なります。Oracle7の場合、2000桁以内ではVARCHAR2型,それを越えると LONG型になり、Oracle8の場合、4000桁以内では VARCHAR2型,それを越えると LONG型になります。CHAR型に設定するときは、カラム特性/タイプで CHAR(n)を設定します。

*-(StringMemoの Oracleのデータ型 Raw/Longrawに対して)書式の長さによって異なります。Oracle7の場合、253桁以内では RAW

型,それを越えると LONG RAW型になり、Oracle8の場合、1998桁以内では RAW 型,それを越えると LONG RAW型になります。

18–8 データ型の割当 SQLガイド

dbMAGIC Ver.8.2

Page 141: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

18

18.8 データ定義規則

内容 MS-SQL

Server

Oracle

オブジェクト名の最大サイズ(ユーザ、カラ

ム、テーブル、ビュー、インデックスの名前)

30 30

char/ binary型データの最大長 255

varchar2型データの最大長 4000/2000*1

テーブル、ビューのカラム最大数 250 254

行の最大長(行の長さ) 1962 32511

インデックスの最大長 256 255

インデックスの最大カラム数 16

BLOBカラムの最大数 10 7

単一の BLOBフィールドの最大サイズ 2GB 2GB

インデックスの最大セグメント数 16

キーまたはインデックス式の最大長 255

文字型データの最大長 4000/2000*1

メモフィールドの最大長 32767バイト

メモフィールドの最大数 1*2

インデックスの最大数

*1 Oracleのバージョンにより異なります。

*2 dbMAGICの文法チェックユーティリティでは、Oracleの Long型、Long raw型も dbMAGICのメモ型と同じように扱われます。い

ずれのデータ型の場合もレコード中に複数見つかったときには、”メモ項目は1個しか使用できません.”というエラーメッセージが出さ

れます。

SQLガイド

dbMAGIC Ver.8.2

18.8データ定義規則 18–9

Page 142: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

18–10 データ型の割当 SQLガイド

dbMAGIC Ver.8.2

Page 143: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第19章 dbMAGICとSQLの動作章目次19.1 一意性の識別 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–2

19.2 ユニークインデックスとノンユニークインデックス : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–3

19.3 dbMAGICプログラムの例 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–4

19.4 通常のリンク([リンク]コマンド) : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–4

19.5 リンクジョイン([結合リンク]コマンド) : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–519.6 範囲 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–8

19.7 SQL WHERE句 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–8

19.8 片方向と双方向 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–11

19.9 インクリメンタルサーチ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–12

19.10RDBMSでのソート : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–12

19.11ソートに使われるセグメントの指定 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–12

19.12ソート実行時の動作 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–12

19.13ソート処理を行うときの注意 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :19–13

Page 144: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第19章 dbMAGICとSQLの動作

dbMAGICは、データベースが SQLデータベースの場合、SQL言語を介してデータベースとの通信が行われ

ます。ここでは、RDBMSとの通信が実行される場合の dbMAGICエンジンの内部機能と動作条件について

説明します。

19.1 一意性の識別

dbMAGICでは、照会や位置付、更新など、テーブルの処理が実行される際には、各行にそれぞれ一意性を

現すカラムが必要になります。使用している RDBMSによりますが、SELECTステートメントに自動的に単

一もしくは複数のカラムが追加され、このカラムによって一意性を識別します。このカラムは dbMAGICに

より保持され、レコード(SQLでは行)が識別されます。また、このカラムは、データベースから再度、行

が取り出される場合、その行の更新状況のチェックにも使われます。

RDBMSによる一意性の識別

RDBMSによっては、各行に非表示のカラムが置かれます。この非表示のカラムには、その行の IDが格納

されます。行の IDは、行が作成したときに設定され、行が削除されると削除されます。このカラムの値は、

ユーザが変更することはできません。たとえば、Oracleの場合、ROWIDがこれに該当します。

一方、MS-SQL Serverでは、特別に一意性を識別するカラムはありません。ただし、TIMESTAMPというカ

ラムを置くことができます。このカラムはオプションで、ROWIDと異なり、テーブルの作成時に宣言しな

ければなりません。TIMESTAMPの値は、行が更新されるたびに自動的に変更されます。

dbMAGIC内部での一意性の識別

RDBMSが Oracleの場合、SELECTステートメントに ROWIDが追加されます。この ROWIDは、更新や削

除コマンドのWHERE句で使用されます。

例:

SELECT 社員番号,名前,rowid

FROM 社員情報

ORDER BY 社員番号 asc

上記の場合、ユーザが行を更新すると、次のコマンドが送出されます。

UPDATE 社員情報 SET 名前=’ニーナ’ WHERE ROWID=値

上記で、ROWIDには、取り出されたレコードのユニークな値が格納されています。

なお、場合によっては ROWIDが使用できないこともあり、そのときには位置インデックスが使われます。

位置インデックスは、次のような場合に使用されます。

■ RDBMSが Oracleで、複数のテーブルをもとに作成されたビューに ROWIDがない場合。

■ RDBMSが MS-SQL Serverで、テーブルやビューに TIMESTAMPカラムがない場合。

■ ODBC用ゲートウェイが利用されている場合。

テーブルに TIMESTAMPカラムが定義され、使用可能な場合、そのカラムは ROWIDカラムとほとんど同じ

ように扱われます。ただし、違いが 1つあります。TIMESTAMPカラムの場合、行は更新の完了後にもう一

度取り出されます。これは、TIMESTAMPの値が変更されることにより発生し、このため、処理速度の低下

を招きます。

19–2 dbMAGICと SQLの動作 SQLガイド

dbMAGIC Ver.8.2

Page 145: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

19

位置インデックス

[テーブル特性]ダイアログの[位置]欄の値を「デフォルト」に設定している場合、ROWIDカラムがあ

るときにはそのカラムが、ないときには、テーブルに定義されている最小のユニークインデックスが位置イ

ンデックスとして使われます。また、[テーブル特性]ダイアログの[インデックス]欄を使用して、位置イ

ンデックスとして使われるユニークインデックスを指定することもできます。

ROWIDまたは DBKEYがない場合、位置インデックス(ユニークインデックス)を使用して行が識別され

ます。この位置インデックスのカラムは、ROWIDや DBKEYのカラムと同じように SELECTステートメン

トに追加され、また、UPDATEステートメントや DELETEステートメントのWHERE句で使われます。

位置インデックスのカラムは、非常に頻繁に使われるため、できるだけインデックスを設定するようにし

ます。

19.2 ユニークインデックスとノンユニークインデックス

dbMAGICでは、行の更新後、START POSITIONという内部関数を使用して画面の行が再配置されたり、イ

ンデックスの変更や行の並べ替えが実行されます。また、この内部関数は、コミットによりカーソルが閉じ

たときにも実行されます。この関数は、画面の行がすべてソートされ、しかも行の配置状態がだだ 1種類で

なければなりません。

このため、SELECTステートメントには、必ず ORDER BY句が追加されることが必要になります(ただし、

SELECTステートメントが、ROWIDや位置インデックスの特定の値、つまり特定の行に対して実行される

場合は除きます)。追加される ORDER BY句では、プログラムに定義されているインデックスが使われま

す。ただし、使用されるインデックスが非ユニークインデックスの場合、ROWIDや DBKEY、位置インデッ

クスのセグメントが ORDER BY句で使われます。これで、重複行があったときでも、行の配置は 1種類に

なります。

たとえば、Oracleで、「社員情報」というテーブルで「名前」というノンユニークインデックスが使われて

いたとします。この場合、次のような SELECTステートメントが生成されます。

SELECT 社員番号, 名前, rowid

FROM 社員情報

ORDER BY 名前 ASC, ROWID ASC

なお、上記の場合、ORDER BY句に ROWID(または位置インデックス)が追加されたため、データベース

ではソートの基準となるインデックスがなくなります。このため、データベースでソートが実行されます。

したがって、インデックスはできるだけユニークインデックスにするのがベストです。

注意:� �

dbMAGICでは、ORDER BY句にはできるだけ、ROWIDや位置インデックスのカラムが追加されない

ように処理が行われます。また、Oracleのバッチプログラムでインデックスがノンユニークインデック

スの場合、行は片方向でスキャンされます。このため、ORDER BY句には ROWIDではなく、位置イン

デックスが追加されます。� �

SQLガイド

dbMAGIC Ver.8.2

19.2ユニークインデックスとノンユニークインデックス 19–3

Page 146: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

19.3 dbMAGICプログラムの例

以下のテーブルをもとに、サンプルプログラムを説明します。

テーブル名:社員情報

社員番号 名前 Rowid

1 ジョン 11111

2 ベンジャミン 22222

3 ビル 33333

4 トム 44444

このテーブルでは、第 1ユニークインデックスは「社員番号」になっています。このプログラムを実行する

と、次のような処理が行われます。

■ ステップ 1… 次の SELECTステートメントのカーソルがオープンされます。

SELECT 社員番号, 名前,rowid

FROM 社員情報

ORDER BY 社員番号 ASC

■ ステップ 2… テーブルの 4行を取り出すループが作成されます。このループにより、すべての行が取り

出されます。

■ ステップ 3… GET CURRENTという dbMAGICの内部関数が実行され、次の SELECTステートメント

を使用して最初の行が取り出されます。

SELECT 社員番号, 名前, rowid FROM 社員情報

WHERE rowid=11111

GET CURRENTは、ユーザが画面の行をスクロールするたびに、その時点でスクロール

されている行について実行されます。

行の取り出しにキャッシュが使われる場合、GET CURRENTは、データベースからではな

くキャッシュから実行されます。

設定されているロック方式によっては、ユーザが行の更新を行うと、「フック」という内部関数が実行され、

データベースから行がもう一度取り出されます。この場合、次のような SELECTステートメントが送出され

ます。

SELECT 社員番号, 名前, rowid FROM 社員情報

WHERE rowid=11111 FOR UPDATE

Oracleでは、フックはFOR UPDATEといっしょに実行されます。MS-SQL Serverでは、フックはFOR UPDATE

なしに実行されます。

19.4 通常のリンク([リンク]コマンド)

リンクテーブルがある場合、メインテーブルから行が読み込まれるたびに、dbMAGICにより SELECTステー

トメントがもう一つ追加されます。この SELECTステートメントによって、リンクテーブルの行が取り出さ

れます。

メインテーブルの行はループを使用して読み込まれ、また、このループにより行がすべて取り出されます。

つまり、リンクが設定されているときには、メインテーブルの行の取り出し(フェッチ)処理が実行される

たびに別のカーソル(SELECTステートメント)がオープンされ、リンクテーブルの行が取り出されること

になります。

19–4 dbMAGICと SQLの動作 SQLガイド

dbMAGIC Ver.8.2

Page 147: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

19

メインテーブルが 2つのテーブルとリンクされている場合、まず、メインテーブルのカーソルがオープンさ

れ、その後、ループで次のような処理が実行されます。

■ メインテーブルの行が取り出されます。

■ 最初のリンクテーブルのカーソルが開かれます。

■ 2番目のリンクテーブルのカーソルが開かれます。

この後、ループは、テーブルの最後または画面の最後で終了します。通常リンク処理は、結合処理とは次の

点で異なります。

■ 結合処理の場合、結合テーブルにテーブルの行が存在しないときには、行は取り出されません。

■ 複数のテーブルの結合すると、単一のテーブルになります。したがって、テーブルのカーソルは一つ

で、このカーソルを使用して行の取り出しが行われます。

■ dbMAGICのリンク処理は、結合処理よりも効率が悪くなります。これは、リンクの場合、結合に比較

して、dbMAGICと SQLサーバとの間の通信量と要求が増えるためです。

以上から、複数のテーブルを使用してレポートや照会を行いたい場合、次のようにすると効率が上がります。

■ 複数のテーブルを結合し、ビューを使用してレポートや照会(読み取り専用)を実行します。

なお、リンクテーブルはキャッシュに置くようにします。とくに、リンクテーブルに格納されている行の数が

少ないときや、リンクテーブルの行の取り出しで同じ行がいくつも返るような場合、リンクテーブルをキャッ

シュに置きます。

19.5 リンクジョイン([結合リンク]コマンド)

リンクジョインは、単一のメインテーブルとリンクされた結合テーブル(ジョインテーブル)と間に 1対多

のリレーションを作成し、データビューを表示したいときに使います。この処理は、RDBMS側で実行され

ます。この処理では、dbMAGICにより SQL等価結合ステートメントが生成されます。

リンクジョインの機能

リンクジョイン([結合リンク]コマンド)を使うことで、RDBMSに搭載されている結合機能を十分活用で

きます。また、dbMAGICのデータ読込、ロック機能も併せて使用されます。なお、ユーザにより行の更新

が実行された場合、または dbMAGICにより再計算が実行されたときには、このリンクジョインは、リンク

確認処理([確認リンク]コマンド)と同様の働きをします。

パラメータ 意味

リンクモード J=結合または、O=外部結合を設定します。

テーブル識別番号 この欄でズームすると、データベースのテーブルの一覧が表示されますので、ここ

でリンクテーブルを選択します。

インデックス テーブルで使われるインデックスを指定します。なお、メインテーブルとリンクテー

ブルとの関係は 1対多となりますので、ユニークインデックス以外は選択できませ

ん。この欄でズームすると、リンクテーブルのユニークインデックスの一覧が表示

されますので、ここでインデックスを選択します。

順 この欄は、リンク処理では使いません。

戻り 戻りコードが返る項目を指定できます。この戻りコードで、リンク処理が成功したか

失敗したか判定できます。リンクジョインが実行され、結合ステートメントが返る

と、この項目に TRUEが返ります。また、結合リンクが確認リンクとして実行(つ

まり、再計算または更新)されたときには、確認リンク処理の場合と同じ戻りコード

が返ります。

条件 確認リンク処理の場合と同じです。

SQLガイド

dbMAGIC Ver.8.2

19.5リンクジョイン([結合リンク]コマンド) 19–5

Page 148: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

ジョインを行う際の注意

1. ジョインテーブルのインデックスセグメントはすべて選択しなければなりません。また、各インデッ

クスセグメントにそれぞれ、位置付式が必要です。

2. ジョインテーブルには、特定の範囲が必要です。このため、最小位置付式と最大位置付式は同じでな

ければなりません。

3. ジョインテーブルの位置付式としては、次の式が指定できます。

■ 定数

■ タスクで選択済みのメインテーブルのカラムに対する参照

■ タスクで選択済みのリンクテーブルのカラムに対する参照

■ 非複合式(複合式は指定できません)

ジョインの動作

タスクのデータビューの作成と同時に、結合ステートメントが作成されます。この結合ステートメントは、

すべてのジョインテーブルに対して機能します。また、WHERE句も生成され、ここでは、定数のほか、メ

インテーブルとジョインテーブルのカラムの名前が定義されます。この後、dbMAGICによりデータビュー

が最終的に構築されます。

ロック

行のロックが必要な場合、dbMAGICによりデータベース上でロックが設定されます。SQLゲートウェイで

論理ロックが使われる場合、メインテーブルとリンクテーブルに対して同時に論理ロックがかけられます。

また、SQLゲートウェイで使われるのが物理ロックの場合、SQLゲートウェイにより、RDBMS側で、ジョ

インテーブルの SELECTステートメントで FOR UPDATE句が使用できるかどうかがチェックされます。

・ RDBMSで、ジョインテーブルの SELECTステートメントで FOR UPDATE句が使用できる場合(たと

えば、Oracleなど)、FOR UPDATE句によりメインテーブルとジョインテーブルに対して同時にロッ

クがかけられます。なお、ジョインテーブルについては、アクセスモードが「書出」のジョインテーブ

ルに対してだけロックがかけられます。

・ RDBMSで、ジョインテーブルの SELECTステートメントで FOR UPDATE句が使用できない場合、

ロックは、リンクジョインに関連しているテーブルそれぞれに対して、別個の SELECT...FOR UPDATE

ステートメントを使用して設定されます。

タスクで、ジョインテーブルが「読込」アクセスモードで開かれている場合、ジョインテーブルにはロック

はかけられず、メインテーブルにだけロックが設定されます。

データベースの更新が必要になった場合、各ジョインテーブルが別個に更新されます。この場合、更新は、

テーブルの位置インデックスを使用して実行されます。

Oracleのロックの例

Oracleの場合、結合処理に関連しているテーブルのアクセスモードと共有モードが dbMAGICによりチェッ

クされます。この後、ロックが必要なテーブルがあれば、そのテーブルのいずれかのカラムが SELECT FOR

UPDATEステートメントの OF句に追加されます。

たとえば、「SelectA.col1, A.rowid, B.col1, b.rowid from Table1 A, Table2 B where A.col1=B.Col1 and A.rowid=

’ カレントの行の番号’ FOR UPDATE OF a.rowid」のようになります。

上記の例では、Table1(エイリアスは A)の行(a.rowid)がロックされることになります。

19–6 dbMAGICと SQLの動作 SQLガイド

dbMAGIC Ver.8.2

Page 149: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

19

リンクジョインを行う際の注意

1. リンクジョインは、データベースが SQLデータベースの場合にのみ有効です。また、結合できるファ

イルは同一種類のデータベースのものに限ります。

2. リンクジョインとリンク確認処理の主な相違は、次の通りです。

・リンク確認処理では、まず、リンクテーブルの行の取り出しが試みられます。ここで所定の行が

見つからなかったときには、その行に対応するメインテーブルの行が有効になります。

・リンクジョインでは、内部結合の SELECTステートメントを使用してメインテーブルとジョイン

テーブルが処理されます。このため、制約定義が重要になります。

3. dbMAGICによって SELECTステートメントが生成され、その SELECTステートメントで複数のファ

イルが指定されている場合、テーブルの名前としてはエイリアスが使われます。たとえば、メインテー

ブルは A、最初の結合ファイルは Bなどとなります。

4. 結合処理とキャッシュ

結合処理のキャッシュは、[タスク制御]ダイアログの[高度な設定]タブの[キャッシュ範囲]で設定

できます。結合処理の場合、ビューにはメインテーブルとすべてのリンクテーブルの行が置かれ、こ

の行についてキャッシュが実行されます。キャッシュの設定欄は[DBテーブル]ウィンドウにもあり

ますが、この欄は通常のリンクテーブルに関するもので、したがって、リンクジョインの場合には無

関係になります。また、リンクジョインでは、キャッシュは処理の種類によって機能が異なります。以

下、順に説明します。

挿入(行の作成)

新規の行を作成したときには、その行はデータベースに挿入されますが、キャッシュには格納されませ

ん。行は、その後、取り出しが実行された(フェッチコマンドまたはカレントの行の取り出しコマンド

が送出された)ときにキャッシュに格納されます。

削除

行の削除が実行されると、データベースから行が削除されると同時にキャッシュの行も削除されます。

更新

ビューの行のカラムの内容を更新すると、単一もしくは複数のステートメントがデータベースに送ら

れます。これで、テーブルのカラムの内容が更新されます。

更新対象がメインテーブルの場合、行はキャッシュから削除されます。その後、フェッチコマンドまた

はカレントの行の取り出しコマンドが実行されると、行は再度、キャッシュに格納されます。この処理

が行われるのは、行の更新により、メインテーブルとリンクテーブルを関連付けているカラムが変更

されることがあるためです。また、更新中は、キャッシュに格納されている行の値はチェックされるこ

とがなく、このため、再度のキャッシュへの格納が必要になります。

一方、更新対象がリンクテーブルの場合、キャッシュはクリアされ、その後、取り出された行がすべて、

もう一度、キャッシュに格納されます。これは、メインテーブルの複数のレコードがリンクテーブルの

単一の行とリンクされている場合、リンクテーブルの行が更新されると、そのほかの行についても値

の変更が起こることがあるためです。また、メインテーブルのこういった行は、リンクテーブルから

検索することはできません。

SQLガイド

dbMAGIC Ver.8.2

19.5リンクジョイン([結合リンク]コマンド) 19–7

Page 150: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

キャッシュは、次の場合にクリアされます。

1) タスクモードが「登録」に変わったとき。

2) ユーザによりソートが実行されたとき。

3) ユーザにより位置付が実行されたとき。

4) ユーザにより範囲に関する処理が実行されたとき。

5) インデックスが変更されたとき。

19.6 範囲

ユーザまたはプログラマにより、範囲に関する処理(範囲の指定)が実行されると、ステートメントに必要

なWHERE句が追加されます。

なお、範囲の指定は、インデックスに対して行わなければなりません。そうでない場合、オプティマイザに

よりデータベース側でソートが実行されます。

CNDRANGE( )関数

CNDRANGEは、新しく用意された関数で、条件を使用してセレクトコマンドの範囲式に使う最小値や最大

値を入れることができます。範囲式のほか、位置付式でも指定できます。

第 1パラメータには、TRUEまたは FALSEが返る条件を指定します。FALSEが返った場合、範囲式または

位置付式に対応する SQL句は生成されません。この関数は、範囲式で指定したカラムから NULL 値が返る

ような場合には使用しないようにします。こういったカラムでは、処理速度が低下します。

構文: CNDRANGE (条件,値)

パラメータ:  条件 … 論理式(TRUEまたは FALSEが返る式)で、実行時に評価されます。

値 … 条件が TRUEの場合、この値が返ります。

戻り値: 「条件」パラメータの値が TRUEの場合、「値」パラメータに指定した値が返ります。

FALSEが返ったときには、戻り値はなく、関数自体も実行されません。

例: CNDRANGE (‘TRUE’L, 10)

上記の例では、値「10」が返ります。

CNDRANGE (‘FALSE’L, 20)

上では、関数は実行されません(式を指定しなかったときと同じです)。

注意事項:

この関数は、[セレクト]コマンドの範囲式または位置付式でだけ使用できます。また、戻り値の型

は、カラムの型と互換でなければなりません。

19.7 SQL WHERE句

[タスク環境]メニューの[SQL WHERE句]コマンドを使用して、SQLのWHERE句を指定できます(こ

の場合でも、dbMAGICによりWHERE句は自動的に生成されます)。指定も簡単で、また、dbMAGICによ

り生成される正規のWHERE句も表示できます。

このコマンドでは、dbMAGICのカラムを使い、SQLの構文で範囲を指定できます。指定した範囲は、dbMAGIC

のWHERE句(レコードメインで定義されているWHERE句)に追加されます。

19–8 dbMAGICと SQLの動作 SQLガイド

dbMAGIC Ver.8.2

Page 151: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

19

[SQL WHERE句]のフォーム

SQL WHERE句は、フォーム(ウィンドウ)を使用して指定できます。このフォームは、次の部分で構成さ

れています。

■ カラム一覧

■ WHERE句追加領域

■ WHERE句全体表示領域

カラム一覧

ここには、SQL WHERE句で使用できるカラムが一覧で表示されます。指定できるカラムは、次の通りです。

・メインテーブルまたはジョインテーブルの実データ→データベースの項目名に置き換えられます。

・親タスクの項目→値に置き換えられます。

・カレントのタスクの変数項目と実データ項目→値に置き換えられます。

[WHERE句追加]領域

この領域には SQL WHERE句を記述できます。ここに記述したWHERE句が、参照されることになります。

項目の記述方法としては、次の 2種類があります。

・項目の番号(A、B、Cなど)の先頭に「 :」記号を付けて記述

項目が、メインテーブルまたはジョインテーブルの項目の場合、この方式を使います。項目名は、デー

タベースの項目名に置き換えられます。メインテーブルまたはジョインテーブルの項目でない場合、

データ型にしたがって値に変換されます。項目の型が文字型の場合、dbMAGICにより後続のスペース

が削除されるとともに引用符が追加されます。

・項目の番号(A、B、Cなど)の先頭に「@:」記号を付けて記述

項目が、メインテーブルやジョインテーブルの項目でなく、型が文字の場合、この方法を使います。こ

の場合、項目が値に置き換えられるます。また、dbMAGICにより引用符が追加されることはありま

せん。

[WHERE句全体表示]領域

この領域には、WHERE句全体が表示されます。この WHERE句は、dbMAGICにより生成された SQLス

テートメントで使われます。表示される内容は、次の通りです。

・レコードメインにより生成されたWHERE句:範囲式も表示されます。

・ SQL WHERE句:AND句を使い、カッコで囲まれて表示されます。レコードメインの範囲に追加され

ます。

[WHERE句全体表示] 領域では、項目一覧の項目はすべて置き換えられます。項目のうち、メインテーブル

とジョインテーブルの実データ項目は、「データベースの項目名」または「A.データベースの項目名」の形

式で置き換えられます。また、変数項目は、その名前に置き換えられます。

項目が置き換えられるときには、dbMAGICにより項目の型と記憶型式がチェックされ、必要な場合(たとえ

ば、文字型の場合)には引用符が追加されます。構文上、文字型の項目でも引用符を追加したくない場合、

「@」を項目の先頭に付けます。

ウィンドウの右下の[表示]ボタンをクリックすると、WHERE句全体表示領域の内容が更新されます。こ

の場合、リンク結合処理の結合条件も更新されます。

たとえば、実データ項目「A」のデータベースの項目名が「Employee.jobname」、変数項目「B」のデータベース

の項目名が「Vjobname」で、実行時の値が「AB」の場合、「 :A like ‘B%’」と記述すると、「Employee.jobname

like ‘B%’」と表示されます(なお、テーブル名は、リンク結合処理のときに限って追加されます)。また、実

行時には、「 jobname like ‘B%’」と変換されます。

SQLガイド

dbMAGIC Ver.8.2

19.7 SQL WHERE句 19–9

Page 152: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

また、「 :A like :B」と記述すると、「Employee.jobname like [ ”Vjobname”]」と表示されます(テーブル名は、

リンク結合処理のときに限って追加されます)。実行時には、「 jobname like ‘AB’」と変換されます。さらに、

変数項目「C」の名前が「Voperation」で、実行時の値が「”like”」の場合、「:A @:C :B」と書くと「 jobname

[Voperation] [”Vjobname”]」と表示され、実行時には、「 jobname like ’AB’」と変換されます。

SQL WHERE句の動作

タスクでデータビューが作成されると、dbMAGICによってWHERE句付きの SELECTステートメントが作

成されます。この場合、WHERE句の最初の部分は、レコードメインの範囲式をもとに作成されます。2番

目の部分は SQL WHERE句で、この部分はすべての SELECTステートメントにそれぞれ追加されます。項

目の値は、タスクが開始されたときに一度だけ評価され、再計算されることはありません。SQL WHERE句

すべての SELECTステートメントに追加され、したがって、必ず実行されます。ただし、dbMAGICにより

内部でカレントの取り出しとフックの処理が行われるとき(実行されるかどうかはロック方式により決まり

ます)には、SQL WHERE句は使われません。この場合、位置インデックスを使用して行の取り出しが実行

されるため、SQL WHERE句は不要です。

SQL WHERE句を使用するときの注意

■ カレントのタスクで変数項目を使用しており、その変数項目を SQL WHERE句で使う場合、変数項目

には呼び出し側のタスクのパラメータを使用して値を渡さなければなりません。この方法で値を渡さ

ないときには、デフォルトの値が使われます。注意:初期化式は、SQL WHERE句の後に実行される

ため、使用できません。

■ SQL範囲には、データ型が BLOBまたはメモの項目は指定できません。

■ dbMAGICでは、SQL WHERE句の構文のチェックは行われません。このため、SQLの構文が無効な場

合、実行時、RDBMSからエラーメッセージが出力されます。

■ dbMAGICでは、SQL WHERE句に指定されている項目のデータ型はチェックされません。項目のデー

タ型に対してはそれぞれ、文字列への変換が試みられ、SQL WHERE句の記述の所定の場所に連結さ

れます。このため、データ型に注意する必要があります。

■ リンク結合処理では、テーブル名のエイリアスが使われます。つまり、「テーブル 1.項目 1」ではなく

「A.項目 1」という形で使われます。このため、テーブル名にエイリアスを指定するとともに、そのエ

イリアスを項目名の前に記述することが必要になります。

■ 後続の空白(スペース)は自動的に削除されます。たとえば、変数項目「Vco11」のデータ型が文字

でサイズが 10、値が「 ’ABC’」の場合、「 :Vco11」と記述すると、実行時には「 ’ABC ’」ではなく

「 ’ABC’」となります(後続の 7個のスペースが削除されます)。

19–10 dbMAGICと SQLの動作 SQLガイド

dbMAGIC Ver.8.2

Page 153: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

19

図 19.1: SQL WHERE句のウィンドウ

19.8 片方向と双方向

オンラインタスクの場合、インデックスに対しては、片方向と双方向でアクセスが可能です。

ただし、RDBMSの場合、片方向インデックスしかサポートされていません。dbMAGICでは、通常、次の 3

段階の手順で行の検索が実行されます。

■ ステップ 1  

次のステートメントを使用して値が検索されます。

SELECT 社員番号, rowid

FROM 社員情報

WHERE 社員番号=3

ORDER BY 社員番号 ASC

■ ステップ 2  

ステップ 1で見つかった行の下に、次のステートメントを使用して、条件に合致する行がすべて表示さ

れます。

SELECT 社員番号, rowid

FROM 社員情報

WHERE 社員番号 3>=3

ORDER BY 社員番号 ASC

■ ステップ 3  

ステップ 1で見つかった行の上に、次のステートメントを使用して、条件に合致する行がすべて表示さ

れます。

SELECT 社員番号, rowid

FROM 社員情報

WHERE 社員番号<=3

ORDER BY 社員番号 DESC

SQLガイド

dbMAGIC Ver.8.2

19.8片方向と双方向 19–11

Page 154: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

片方向インデックスの場合、上記の処理は、次のようになります。

■ 行が画面の一番上に表示されます。

■ ステップ 1と 2だけが実行され、ステップ 3は実行されません。

■ スクロールアップでは、バッファは 500行 IDが最大です。

■ 特定の行の上にはスクロールできません。

双方向インデックスの場合、上記の処理は次のようになります。

■ 双方向インデックスを使いたい場合、[方向]欄を「双方向」に設定します。

■ MAGIC.INI ファイルの「画面中央(カーソル画面中央位置付)」パラメータが「Yes」に設定されてい

る場合、行は画面の中央に表示されます。また、上記の 3つのステップがすべて実行されます。

■ ステップ 3では降順のソートが必要ですが、この処理はデータベースの処理速度の低下を招きます。処

理速度が低下するのは、RDBMSによっては、インデックスの後方移動ができないことによります。

片方向インデックスを使用している場合、� �

Ctrl� �

+� �

End� �

を押すと、何も処理が行われなくなります(双方

向インデックスの場合、� �

Ctrl� �

+� �

End� �

を押すと、テーブルの最後に移動できます)。

以上のことから、次のような結論になります。

■ できるだけ片方向インデックスを使うようにします。

■ dbMAGICバージョン 7以降では、双方向インデックスを使う場合、「カーソル画面中央位置付」パラ

メータの値を「No」にしておきます。これで、ユーザがスクロールアップしたときにだけステップ 3

が実行されます。

19.9 インクリメンタルサーチ

インクリメンタルサーチでは、文字を入力するごとに dbMAGICにより上記の 3つのステップがすべて実行

されます。

このため、アプリケーションではインクリメンタルサーチは行わないようにします。

19.10 RDBMSでのソート

SQLデータベースの場合、ORDER BY句により、RDBMS側で動的なソートが可能になっています。この場

合、インデックスの定義も不要です( ISAMではインデックスは必要です)。

以上のように RDBMS側でのソートも可能ですが、ソートは基本的には dbMAGIC側で行われます。ただし、

ソートに使われる項目がすべてメインテーブルとジョインテーブルの項目の場合、RDBMSでソートが実行

されます。また、RDBMSでソートが不可能なときには、dbMAGICにより一時テーブルを使用してソート

が実行されます(従来のバージョンの dbMAGICでも同じです)。この場合、タスクのソートは、タスクの

テーブルに対する仮想インデックスの定義と同じ方法で行われます。このように、ソートは、必要に応じて

dbMAGICにより実行されるため、プログラマがユーザの要求にしたがって多数の仮想インデックスを定義

し、ソートを行う手間が省けます。

19.11 ソートに使われるセグメントの指定

従来のバージョンと同じく、dbMAGICバージョン 8でもユーザがソートに使うセグメントを指定できます。

19.12 ソート実行時の動作

ソートの実行時、ソートで使われるセグメントがすべてメインテーブルとジョインテーブルに属している場

合、そのタスクの SELECTステートメントが再度、送出されます。また、インデックスをもとに作成された

ORDER BY句は、ソートで使われる項目の名前に置き換えられます。

19–12 dbMAGICと SQLの動作 SQLガイド

dbMAGIC Ver.8.2

Page 155: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

19

dbMAGICでは、ORDER BY句は必ずユニーク(返ってくる行の配置が 1種類)でなければなりません。ユー

ザが指定した ORDER BY句がユニークでない場合、また、ソートに使われるセグメントの組み合わせがユ

ニークでないと dbMAGICが判断したときには、dbMAGICにより、ORDER BY句に位置インデックスが追

加されます。さらに、ソートに使われる項目のいずれもメインテーブルとジョインテーブルの項目でなかっ

た場合、dbMAGICにより一時ソートファイルが作成され、このファイルを使用してソートが実行されます。

19.13 ソート処理を行うときの注意

ORDER BY句を使用してソートを行う場合、RDBMS側で、インデックスを使わないで照会が実行されるこ

とがあります。

SQLガイド

dbMAGIC Ver.8.2

19.13ソート処理を行うときの注意 19–13

Page 156: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

19–14 dbMAGICと SQLの動作 SQLガイド

dbMAGIC Ver.8.2

Page 157: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第20章 プログラムのデバッグ章目次20.1 dbMAGICゲートウェイのログ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :20–2

20.2 RDBMSのツール : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 20–3

20.3 dbMAGICプロファイラ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :20–3

20.4 フローモニタ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :20–3

Page 158: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第20章 プログラムのデバッグ

SQLデータベースの場合、dbMAGICからデータベースに対してステートメントが送られますが、この通信

は SQL言語を介して行われます。このため、送出されるステートメントは容易に捕捉できます。また、SQL

の場合、ISAMに比べて、比較的簡単にアプリケーションやデータベースのパラメータを調整し、最大限の

処理効率を達成することができます。

20.1 dbMAGICゲートウェイのログ

dbMAGICの SQLゲートウェイはいずれも、同じテンプレートを使用して作成されています。このため、SQL

ゲートウェイの種類が違っても同じ手順で内容のチェックが可能です。

ログに関する設定

従来のバージョンでは、ログファイルの設定には外部 SETコマンドが必要でしたが、dbMAGICバージョン

8では、ログの設定は[DBMS]ダイアログを使用してできるようになりました。

Windows 95、Windows NTの場合、[DBMS]ダイアログを使用してログに関する設定を行えます。

ログの設定

[ログファイル名]欄には、ログファイルの名前を指定します。有効な書式であれば任意の名前が指定でき

ます。[ログレベル]欄では、次のいずれかのレベルを指定します。レベルによって、ログファイルに書き込

まれる情報が異なります。

■ユーザ向け … この設定にしておくと、プログラムのフローに関連する情報がログファイルに書き込ま

れます。具体的には、まず、環境やバージョン、接続文字列が、続いて、ゲートウェイ

によって生成された SQLステートメント、トランザクションの開始やコミットに関す

る情報が記録されます。プログラムの実行状態をチェックしたい場合、この設定にして

おきます。

■ 開発者向け … この設定では、dbMAGICファイルマネージャルーチンについて、タイムスタンプや値、

開始と終了に関する情報が記録されます。

■サポート向け … サポートセンターによるサポートを受けたい場合、この設定にしておきます。この設定

では詳しい情報が記録され、サポートセンターによる問題解決に役立ちます。

ログ同期(Yesまたは No)

デフォルトは「No」で、通常はこのままにしておきます。この欄は、重大な問題が発生し、ゲートウェイが

クラッシュするような場合、「Yes」にします。これで、アプリケーションのどこで、ゲートウェイのクラッ

シュが起こったかチェックできます。

プランの表示(Yesまたは No)

この欄は、RDBMSが MS-SQLのときにのみ有効です。この欄を「Yes」にしておくと、ゲートウェイでプラ

ンの表示が可能になり、データへのアクセスパスがログファイルに書き込まれます。このため、インデック

スやソートの使用や実行状況を確認できます。この情報は、アプリケーションの調整に使用でき、したがっ

て、RDBMSのツールも不要になります。

20–2 プログラムのデバッグ SQLガイド

dbMAGIC Ver.8.2

Page 159: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

20

ログに関する設定を行う場所

ログに関する設定は、定義ゲートウェイではなく、フル SQLゲートウェイ(データベースゲートウェイ)が

置かれている場所で行わなければなりません。つまり、dbMAGICのクライアント/サーバアーキテクチャ

を使用しているときには、クライアントではなくサーバ側で設定しなければなりません。一方、RDBMSの

クライアント/サーバアーキテクチャを使用している場合、ログの設定はクライアント側で行います。

ログファイルの使い方

ログに関する設定が終われば、アプリケーションを起動します。その後、dbMAGICを終了せずにログファ

イルを見ることができます。ログファイルは、dbMAGICを起動するたびに開き、dbMAGICの終了とともに

閉じます。ログファイルは、dbMAGICの動作中、いつでも内容を確認できます。このため、何らかの操作

を行った後、必要に応じて結果をチェックできます。ログファイルが大きくなりすぎたときには、いったん

dbMAGICを終了します。

20.2 RDBMSのツール

「オプティマイザ」のセクションで説明したように、RDBMSには SQLサーバ用のツールが用意されていま

す。こういったツールを使用して、SQLステートメントごとにオプティマイザのアクセスパスをチェックで

きます。RDBMSのツールは、フラグを使用して実行できます。また、SQLコマンドのログも可能です。

■ Oracle … 次のコマンドを使用して SQLプログラムを実行します。

alter session set SQLTRACE=true

この場合、プログラムの実行とともに、情報がすべてログされるようになります。ま

た、TKPROFユーティリティにより、読み取り可能なトレースファイルが作成され

ます。

■ MS-SQL Server… dbMAGICで SQL SHOWPLANが使用でき、したがって、外部のツールは必要あり

ません。また、MS-SQL Server 6.5では、SQLトレースプログラムが用意され、こ

のプログラムを使用してコマンドをトレースすることもできます。

RDBMSのツールでは、その他、ロックやロード、メモリ、SQLサーバの使用状況に関する情報も入手でき、

こういったデータをもとに SQLサーバの環境や設定をチェックできます。

20.3 dbMAGICプロファイラ

dbMAGICプロファイラを使用して、実行時、プログラムのデバッグが可能です。また、デバッグのほか、

SQL環境で使用し、タスク実行のタイミングに関する問題の特定にも使えます。さらに、問題がアプリケー

ション側にあるのか、SQLインタフェース側にあるのかもチェックできます。

20.4 フローモニタ

SQLゲートウェイのログは、フローモニタを使用して見ることもできます。

SQLガイド

dbMAGIC Ver.8.2

20.2 RDBMSのツール 20–3

Page 160: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

20–4 プログラムのデバッグ SQLガイド

dbMAGIC Ver.8.2

Page 161: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第21章 ロックとトランザクション章目次21.1 マルチユーザに関するパラメータ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–2

21.2 アクセスモードと共有モード : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–2

21.3 dbMAGICのロック方式 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–3

21.4 トランザクションレベル : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–5

21.5 エラー復旧 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–7

21.6 タスクまたはプログラムのコール時のロック : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–8

21.7 物理ロックと論理ロック : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–8

21.8 分離レベルとオプティマイザのヒント : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–1021.9 ROLLBACK関数 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–10

21.10INTRANS関数 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :21–11

Page 162: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第21章 ロックとトランザクション

マルチユーザ環境の場合、ロック処理とトランザクション処理は重要になります。とくにオンライントラン

ザクションの場合、トランザクションはなるべく短くし、ユーザーによる処理に影響を与えないようにする

ことが大切です。

トランザクションは、dbMAGICのタスクのパラメータの設定にしたがって開きます。この設定は、プログ

ラムレベルまたはシステムレベルで行えます。トランザクションのオープンに関するパラメータとロックに

関するパラメータとしては、次のものがあります。

■ [動作環境]ダイアログのパラメータ(マルチユーザアクセス、ISAMトランザクション)

■ [データベース特性]ダイアログのパラメータ(dbMAGICロック)

■ タスクの[DBテーブル]のアクセスモードと共有モード

■ [タスク制御]ダイアログのロック方式

■ [タスク特性]ダイアログの[タスクタイプ]欄(オンラインまたはバッチ)

■ トランザクションレベル

■ [レコードロック時]欄と[エラー]欄

■ [コールタスク]コマンド実行時のプログラムのロック

■ [動作環境]ダイアログの[マルチユーザ]タブでは、[マルチユーザアクセス]と[ ISAMトランザ

クション]の両方を「Yes」にしておきます。これで、あらゆる要求に関するトランザクションが有効

になります。

21.1 マルチユーザに関するパラメータ

[動作環境]ダイアログの[マルチユーザ]タブには[マルチユーザアクセス]欄がありますが、この欄を

「Yes」にしておくと、実行時、必要なときに dbMAGICのロックがかけられるようになります。ロックは、

また、RDBMS側でも実行されます。

この欄を「Yes」にしておくと、また、dbMAGICから RDBMSに対して SET TRANSACTIONコマンドが送

られ、この処理により、別のアプリケーションが動作していてもデータの整合性が維持されます。

この欄を「No」にしておくと、複数のユーザによる同時アクセスは拒否されます。この場合、dbMAGICに

よるロックは実行されません。また、ゲートウェイによる論理ロック、物理ロックも実行されません(つま

り、SELECT ... FOR UPDATEは送出されません)。

また、[ロック方式]欄の値を「No」にしておくと、共有モードでファイルアクセスが行われる場合もdbMAGIC

によるロックは実行されません。共有モードについては、次のセクションに解説があります。

21.2 アクセスモードと共有モード

dbMAGICでは、テーブルが開かれるときのモードとして、アクセスモードと共有モードの両方を指定できま

す。また、テーブルが開かれるときには、dbMAGICにより、データベースからのテーブル構造の取得、テー

ブルが存在するかどうかのチェックなどの内部処理も実行されます。さらに、dbMAGICのロックが有効な場

合、ロックに関する情報がロックファイル(mglock.dat)に書き込まれます。

21–2 ロックとトランザクション SQLガイド

dbMAGIC Ver.8.2

Page 163: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

21RDBMSの場合、「ファイルオープン(またはテーブルオープン)」コマンドはありません。このため、通常

はアクセスモードと共有モードは無効ですが、次の場合は例外です。

■ 共有がなしの場合、SQLゲートウェイから SQLデータベースに「ロックテーブル」コマンドが送られ

ます。ただし、RDBMS側で「ロックテーブル」ステートメントがサポートされていないときには、こ

のコマンドは無効になります。

■ テーブルのアクセスモードが「読込」、共有モードが「書出」で、そのテーブルがリンクテーブルの場

合、ロックが要求されても、リンクテーブルのレコードにはロックはかけられません。一方、テーブ

ルのアクセスモードが「書出」のときには、リンクテーブルは更新可能と判断され、ロックが実行さ

れます。

21.3 dbMAGICのロック方式

dbMAGICでは、[タスク制御]ダイアログを使用してタスクごとにロック方式を指定できます(図 21.1)。

図 21.1:[タスク制御]ダイアログの[ロック方式]欄

[ロック方式]欄には「即時」、「入力時」、「入力後」、「更新時」、「なし」のいずれかを指定できます。こ

の場合、「即時」ではレコードが最初に読み込まれると同時にロックがかけられますが、そのほかの設定で

は、レコードが最初に読み込まれたときにはロックはかけられません。つまり、「即時」以外の設定の場合、

その後、レコードが再度読み込まれた時点でロックがかけられます。このレコードの再読込を「フックアッ

プ」と呼んでいます。

フックアップでは、レコードの位置をもとに再読込が実行され、同時に、レコードの値がすべて最初にレコー

ドが読み込まれたときと同じかどうかがチェックされます。チェックで、値が異なっていることが分かったと

きにはエラーメッセージが出されます。この場合、値は元に戻され、その後、ユーザはもう一度、レコード

の更新を行うことになります。

即時

[ロック方式]欄が「即時」の場合、レコードは読み込まれると同時にロックされます。この設定は、バッ

チタスクのデフォルトです。ただし、レコードは読込と同時にロックされるため、マルチユーザ環境のオン

ラインタスクの場合、ロックが長く継続することがあります。これは、同じユーザが長時間、同じレコード

上にとどまることがあるためです。

SQLガイド

dbMAGIC Ver.8.2

21.3 dbMAGICのロック方式 21–3

Page 164: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

バッチタスクでは、dbMAGICでは、カーソルは FOR UPDATE句とともにオープンされます。この処理は、

Oracleでは、処理速度の低下につながることがあります。

■ Oracleでは、カーソルが FOR UPDATE句といっしょにオープンされる場合、処理に時間がかかります。

入力時

[ロック方式]欄を「入力時」に設定しておくと、ユーザがレコードの更新を始めると同時にレコードの再

読込が実行されます。

オンラインタスクの場合、この設定では、ユーザが入力フィールドに最初の文字を入力したとき、または、最

初の文字をテーブルから選択したときにロックがかけられます。オンラインタスクでは、この設定がデフォ

ルトです。

一方、バッチタスクの場合、レコード後処理で最初の項目更新処理([項目更新]コマンド)が実行された

とき、または最初のタスクまたはプログラムがコールされたときにレコードがロックされます。

入力後

[ロック方式]欄を「入力後」にしておいた場合、ユーザが入力を行い、その入力を確定したときにロック

がかけられます。なお、この「入力後」は、dbMAGICバージョン 4.xx、5.xxとの互換用として用意されて

います。

更新時

[ロック方式]欄を「更新時」に設定しておいた場合、データがデータベースに書き込まれる直前にロックが

かけられます。なお、カレントのタスクから子タスクが呼び出されているときには、その子タスクによって

別のテーブルにデータが書き込まれることもあります。ここで、カレントのタスクのレコードがデータベー

スに書き込まれていない場合、データの整合性に問題が発生します。

したがって、この「更新時」は、データの整合性を考慮しないで使用しなければなりません。たとえば、デー

タの書込先のデータベースでロック処理による負荷が大きいとき、または、比較で内容が異なっても、タス

クの構造上、データの整合性を維持できるときに限って指定するようにします。

なし

「なし」は、ロックのタイミングは「更新時」と同じですが、レコードの再読込は行われません。この場合、

レコードが最初に読み込まれた後、そのレコードが別のユーザによって更新済みであっても、メモリに置かれ

ているレコードがそのままディスクに書き込まれます。別のユーザによって更新が行われたかどうかのチェッ

クは行われないため、そのユーザの更新は上書きされます。

したがって、この「なし」は、現在、処理されているレコードが、別のユーザによってアクセスされていな

いことが明らかなときに限って使用するようにします。たとえば、アプリケーションレベルのロックフラグ

により(このフラグを使うことで、データベースによるロックの前に dbMAGICのロックがかけられている

かどうかを判定できます)、オブジェクトが更新中かどうか判定できる場合には、「なし」でも十分です。

なお、バージョン 7以前では、「なし」は「最小ロック」になっていました。「最小ロック」に設定しておい

たときには、レコードの再読込は実行されましたが、レコードの値の比較は行われませんでした。この機能

は、バージョン 7以降では「なし」に改善されました。

「なし」は、レコード前処理とレコード後処理の間隔が短く、別のユーザによるレコードの更新の余裕がな

いときに使うようにします。この間隔が長い場合、「即時」に設定します。

21–4 ロックとトランザクション SQLガイド

dbMAGIC Ver.8.2

Page 165: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

2121.4 トランザクションレベル

図 21.2:[タスク実行]テーブル([タスク定義]テーブル)

タスクレベル

トランザクションは、タスクレベルでは、「Yes」または「No」のいずれかに設定できます。「Yes」にしてお

くと、そのタスクレベルでトランザクションが有効になります。タスクですべてのレコードを処理する場合、

[トランザクション]欄を「Yes」にしておきます。

なお、ネストトランザクションはサポートされていません。したがって、トランザクションにより子タスク

や子プログラムが実行され、その子タスクや子プログラムでもタスクレベルのトランザクションが宣言され

ている場合、ゲートウェイでは、子タスクや子プログラムのトランザクションは無視されます。

レコードレベル

レコードレベルの場合、[トランザクション]欄では、「オンロック」、「前処理」、「後処理」、「更新」、「な

し」のいずれかを指定できます。

SQLガイド

dbMAGIC Ver.8.2

21.4トランザクションレベル 21–5

Page 166: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

図 21.3:レコードレベルの[トランザクション]欄

オンロック

[トランザクション]欄のオンラインタスクでの初期値です。この設定の場合、トランザクションはレコー

ドがロックされたときに開始されます。

前処理

[トランザクション]欄に「前処理」を指定しておいた場合、処理は次のようになります。

■ レコードが取り出される直前にトランザクションが開始されます。

■ レコード後処理が完了し、さらに、データファイルが更新されてからトランザクションのコミットが

実行されます。

■ トランザクションの開始とコミットの間で行われた処理(子タスクの処理も含みます)がすべて、ト

ランザクションの有効範囲になります。

「レコード」レベルでの「前処理」トランザクションの場合、トランザクションは対話処理段階(レコード

メイン)で開かれます。このため、オンラインタスクでマルチユーザ環境の場合、通常、この「前処理」の

トランザクションは定義しないようにします。これは、トランザクションを行うとレコードにロックがかけ

られ、このロックにより、別のユーザが同じレコードやテーブルにアクセスできなくなるためです。

後処理

[トランザクション]欄に「後処理」を指定しておいた場合、処理は次のようになります。

■ レコード後処理の直前にトランザクションが開始されます。

■ レコード後処理が完了し、さらに、データビューが更新されてからトランザクションのコミットが実

行されます。

「レコード」レベルでの「後処理」トランザクションでは、レコード後処理がすべて(子タスクがある場合は

その子タスクの処理も)、トランザクションの有効範囲となります。

トランザクションでエラーが発生した場合、再度、実行が試みられます。

更新

[トランザクション]欄に「更新」を指定しておいた場合、処理は次のようになります。

■ レコード後処理が完了した後、データファイルの更新が始まる前にトランザクションが開始されます。

■ データファイルの更新が完了した段階でトランザクションがコミットされます。

21–6 ロックとトランザクション SQLガイド

dbMAGIC Ver.8.2

Page 167: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

21「レコード」レベルでの「更新」トランザクションでは、トランザクションにはレコード後処理は含まれませ

ん。マルチユーザ環境の場合、この「更新」トランザクションを使うようにします。これは、このトランザ

クションでは、複数のユーザから同時にアクセスが行われても、アクセスが禁止されることはほとんどない

ためです。

なし

バッチタスクでの初期値です。[トランザクション]欄に「なし」を設定しておいた場合、レコードレベルで

はトランザクションは実行されません。

トランザクション実行時の規則

dbMAGICバージョン 5、6,7と、バージョン 8では、トランザクションが実行されるときの規則が異なり

ます。

dbMAGICバージョン 5、6,7の場合、ロックが要求されると、ロックの実行と同時にトランザクションが

開かれます。ロックが要求されないときには、トランザクションに関する設定にしたがってトランザクショ

ンが開かれます。

dbMAGICバージョン 8では、トランザクションが開かれる前にロックが要求されると(たとえば、ロック

が即時で、トランザクションの設定が後処理の場合)、次のエラーメッセージが表示されます。

「トランザクション外のため、ビューはロックできません。」

21.5 エラー復旧

図 21.4:[エラー]欄

エラー復旧は、[レコードロック時]欄と[エラー]欄の設定を使用して制御できます。

[レコードロック時]欄

トランザクションのうち、ロックトランザクションの機能はロックのみです。バッチタスクで、ロックトラ

ンザクションが実行され、その後、所定の読込/書出トランザクションが完了する前にエラーが発生し、し

かも、そのエラーがロックされたレコードの待機に関するものだった場合、何らかのエラー処理が必要にな

ります。この場合のエラー制御は、バッチタスクの[レコードロック時]欄を使用して行えます。[レコード

ロック時]欄は、[タスク制御]ダイアログにあります。

[レコードロック時]欄では、バッチ処理の際、行にロックがかけられていたときの処理を指定できます。

指定できる値は、次のいずれかです。

SQLガイド

dbMAGIC Ver.8.2

21.5エラー復旧 21–7

Page 168: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

A=アボート

この設定の場合、dbMAGICによりタスクがアボートされます。

R=リトライ

この設定では、行のロックが解除されると、再度、ロックが試みられます。したがって、ロックの解除後、

処理の継続が可能です。なお、リトライの際には、ユーザがタスクのアボートを行うこともできます(ただ

し、アボートが可能になっていなければなりません)。この設定がデフォルトです。

S=スキップ

ロックされている行はスキップされ、その次の行から処理が始まります。「スキップ」に設定したときには、

スキップした行に何らかのマークを付加する処理が必要で、これで、スキップした行を後で再度処理するこ

とができるようになります。なお、ロックメカニズムは RDBMSによって異なり、したがって、最適のもの

を指定することも必要です。

[エラー]欄

[レコードロック時]欄では、読込/書出トランザクションの前で発生したエラーについて制御できますが、

読込/書出トランザクションの後で発生したエラーの処理は、[エラー]欄で指定します。

なお、エラーがロックとは関係ない場合、[タスク制御]ダイアログの[レコードアクセス失敗時]欄を使用

してエラー処理を指定できます。

21.6 タスクまたはプログラムのコール時のロック

タスクやプログラムがコールされたときには、カレントのレコードはデフォルトでロックされます。この処

理は、[ロック方式]欄の設定とは無関係です(図 21.4)。

21.7 物理ロックと論理ロック

SQLの場合、主なロックとしては次の 2種類があります。

■ 排他ロック … UPDATEステートメントが送出されたときに自動的に生成されるロックです。

■ 共有ロック … SELECTステートメントまたは FOR UPDATE句付きの SELECTステートメントが送出

されたときに実行されるロックです。この場合、SQLサーバに対して、ユーザがレコード

の更新を行おうとしていることが知らされるとともに、共有ロックが解除されるまで別の

ユーザによる更新は拒否されます。別のユーザがレコードの更新を試みた場合、または、

SELECT ... FOR UPDATEステートメントが送られたときには、エラーメッセージが出力

され、アクセス対象のレコードがロックされていることが報告されます。

物理ロック

Oracle、では、SELECT ...FOR UPDATEステートメントがサポートされています。また、この 3つの RDBMS

では、行レベルのロックがサポートされています。このため、ロックが要求されると(ロックの種類は[ロッ

ク方式]欄の設定によります)、dbMAGICからゲートウェイに対して、ロック付きでレコードを読み込むよ

うに指示が出されます。また、トランザクションが開始されていないときには、ゲートウェイによりトラン

ザクションが開始されます。その後、ゲートウェイにより、FOR UPDATE句を使用してカレントのレコード

の読込が実行されます。

トランザクションは、RDBMS側で実行されます。したがって、dbMAGICアプリケーションを含め、いずれ

のアプリケーションでも、トランザクションの実行中は、レコードの更新はできません。トランザクション

は通常、更新が完了すると終了します。

21–8 ロックとトランザクション SQLガイド

dbMAGIC Ver.8.2

Page 169: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

21例:

下のステートメントでカレントのレコードを取り出します。

SELECT 社員番号, 名前, 部門番号, rowid

FROM 社員情報

WHERE

rowid=1111

values: 1 , ジョン, 30

下のステートメントで、ロックが要求されます。

SELECT 社員番号, 名前, 部門番号, rowid

FROM 社員情報

WHERE

社員番号=1111

FOR UPDATE NO WAIT

values: 1 , ジョン, 30

部門番号を「40」に変更します。

UPDATE 社員情報 SET 部門番号=40

WHERE

rowid=1111

バッチタスクの「即時」ロック

バッチタスクの場合、[ロック方式]欄を「即時」にしておくと、ゲートウェイによりデータビュー全体が

ロックされるようになります。

Oracleの場合、SELECTステートメントは、FOR UPDATE句、ORDER BY句といっしょに送出できます。

このため、カーソルがタスクの最初に定義されている場合、カーソルは FOR UPDATE句とともに宣言され

ます。また、このカーソルによりレコードがすべて取り出されます。

カーソルについては、「結合リンク」のセクションを参照してください。

なお、バージョン 7より前の dbMAGICでは、[ロック方式]欄が「即時」のときでも、FOR UPDATE句は

実行されません。

論理ロック

MS-SQLでは、FOR UPDATE句は使用できず、また、ロックもページレベルのロックだけがサポートされて

います。このため、とくにレコードのロックに関して問題が発生することがあります。このことから、RDBMS

が MS-SQLの場合、論理ロックが使用されます。論理ロックとは dbMAGICによるロックといい、レコード

は実際にはロックされません。その代わり、レコードにロック(論理ロック)がかけられた後、レコードが

ユーザによって更新されるまでの間に別のユーザによってレコードが変更されていないかどうかチェックが

行われます。この処理によりデータの整合性が維持されます。

具体的には、処理中、ロックが要求されると、dbMAGICからゲートウェイに対してレコードをロック(論

理ロック)付きで読み込むように指示が出されます。その後、ゲートウェイによってレコードが読み込まれ、

そのレコードの値がゲートウェイで保存されます。続いて、ユーザが更新を実行すると、レコード後処理で

UPDATEステートメントが送出されます。この場合、カラムがすべてWHERE句に追加されます。

なお、レコードに論理ロックがかけられている間に別にユーザによって同じレコードの内容が変更されたと

きには、その旨のメッセージがオリジナルのユーザに対して出力されます。この場合、UPDATEステートメ

ントは失敗します。

SQLガイド

dbMAGIC Ver.8.2

21.7物理ロックと論理ロック 21–9

Page 170: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

例:

次のステートメントでカレントのレコードが取り出されます。

SELECT 社員番号, 名前, 部門番号

FROM 社員情報

WHERE 社員番号=1

values: 1 , ジョン, 30

次のステートメントでロックが要求されます。

SELECT 社員番号, 名前, 部門番号

FROM 社員情報

WHERE 社員番号=1

values: 1 , ジョン, 30

部門番号を「40」に変更します。

UPDATE 社員情報 SET 部門番号=40

WHERE 社員番号=1 AND 名前=ジョン’ AND 部門番号=30

なお、ODBCゲートウェイでも論理ロックが使われます。これは、ODBCゲートウェイの場合、アクセス対

象のデータベースでレコードロックや FOR UPDATEステートメントがサポートされているかどうか分から

ないためです。

BLOBのロック

ほとんどの RDBMSでは、データ型が BLOB のフィールドは WHERE句に指定できません。このため、

dbMAGICでも、値を更新する項目が BLOB型の項目だけの場合、データベースのレコードにはロックはか

けられません。ただし、BLOB型の項目と併せて、そのほかの項目を更新するときには、ロックによるレコー

ドの更新が可能です。

21.8 分離レベルとオプティマイザのヒント

MS-SQL Serverの場合、分離レベルを使用してロックの有効、無効を段階的に設定できます。同時処理を最

大(複数ユーザによる同時アクセス許可)にしたい場合、分離レベルを「ダーティリード」にします。一方、

同時アクセスを制限したい場合(ユーザレベル 1)、「リードコミット(READ COMMITTED)」にします。

また、[ヒント]欄を使用して、オプティマイザにヒントを指定することもできます。ヒントとは、オプティ

マイザで使用されるインデックスやロックの種類の定義をいいます。

分離レベルやヒントは、あらかじめデフォルトが設定されており、通常は、このデフォルトで十分です。デ

フォルトは、必要であれば変更することもできますが、その場合、RDBMSのロックメカニズムに詳しいデー

タベース管理者に依頼して行うようにしてください。

21.9 ROLLBACK関数

トランザクションを行う場合、アプリケーションでロールバック処理を定義しなければならないこともあり

ます。

トランザクションは、データの整合性が維持されるように定義し、また、複数の処理が一度に完了するよう

に定義しなければなりません。

dbMAGICには ROLLBACK関数が用意されています。この関数のパラメータは、次の 2つです。

■ 論理値… このパラメータを使用して確認ウィンドウを表示するかどうかを指定できます。値は、TRUE

または FALSEのいずれかです。

21–10 ロックとトランザクション SQLガイド

dbMAGIC Ver.8.2

Page 171: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

21■ 数 … トランザクションレベルで、SQLの場合、このパラメータは必ず「0」にしておきます。これ

は、dbMAGICではトランザクションレベルは 1つしかサポートされていないためです。

例:ROLLBACK (’True’Logical,0)

ROLLBACK 関数は、どのタスクでも使用できます。この関数を実行すると、トランザクションの開始位置

までロールバックされます。タスクツリーの上部階層でトランザクションが始まっている場合も同じです。

ROLLBACK関数は、非常に強力な関数です。ROLLBACK関数を使うことで、アプリケーションの論理に反

するような処理が行われたときでも、クラッシュや停電が発生したときでも、トランザクションの開始地点

まで戻ることができます。

ROLLBACK 関数は、注意して扱ってください。たとえば、トランザクションが長い場合、ロールバックさ

れる処理が非常に多くなることもあり、そういったときには使用しないようにします。

ROLLBACK関数が呼び出されたときにトランザクションが存在しなかった場合、処理は何も行われません。

また、確認ウィンドウを表示するように設定していても、確認ウィンドウは表示されません。

ROLLBACK 関数を使用して、ロールバックプログラムが起動されるようなアプリケーションイベントを作

成することもできます。このアプリケーションイベントは、ホットキーやプルダウンメニューを使用してい

つでも実行でき、トランザクションのロールバックが可能です。

21.10 INTRANS関数

INTRANS関数を使用して、トランザクションが現在オープンしているかどうかをチェックできます。この

関数にはパラメータはありません。戻り値は論理値(TRUEまたは FALSE)で、TRUEの場合、トランザク

ションがオープンしていることを示します。

構文: INTRANS ( )

パラメータ: なし

戻り値: 論理値

SQLガイド

dbMAGIC Ver.8.2

21.10 INTRANS関数 21–11

Page 172: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

21–12 ロックとトランザクション SQLガイド

dbMAGIC Ver.8.2

Page 173: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第22章 埋め込みSQL章目次22.1 埋め込み SQLの使用 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 22–2

22.2 埋め込み SQLの構成要素 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 22–4

22.3 SELECTステートメントの動作 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :22–7

22.4 埋め込み SQLを使用する際の制限 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 22–8

22.5 エラーハンドリング : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :22–9

Page 174: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第22章 埋め込みSQL

SELECTステートメントが複雑な場合、RDBMSサーバ側で行の結合や抽出を行ったほうが処理速度が速く

なります。また、こうすることで、dbMAGICのタスクのデータビューに指定する行の数も減ります。とく

に、この方法の場合、ネットワークトラフィックが軽減されるため、クライアント/サーバ環境ではシステ

ムの効率が上がります。

RDBMSでは、単一の SQLステートメント、単一のカーソルを使用して複数の行の更新や削除が可能です。

トランザクションもシンプルで済みます。一方、dbMAGICのタスクでは、データビューのレコードは別個

に処理されます。つまり、行の挿入、更新、削除といったタスクでは、レコードは一つずつ別々に処理され

ます。この処理方法は、トランザクションの対象が複数の行であっても同じです。

実行時の処理がデータ定義言語(DDL)に関する処理で、また、一時的なものである場合、直接、SQLを使

用して処理を行うことができます。この SQL処理を埋め込み SQLなどと呼んでいます。たとえば、一時の

テーブルインデックスを作成してレポートを作成し、レポート出力が完了すれば、そのインデックスを削除

するといった処理では、埋め込み SQLを使用できます。また、RDBMSに一時テーブルを作成するときにも、

埋め込み SQLが利用できます。

ただし、一般的にいえば、上記以外の DDL 処理は dbMAGICでは行わないのが得策です。たとえば、結合

処理などは、普通は RDBMSで行ったほうが効率はよくなります。

22.1 埋め込みSQLの使用

埋め込み SQLは、dbMAGIC上で[タスク環境]メニューの[SQLコマンド]コマンドを使用して指定でき

ます。埋め込み SQLを定義する場合、タスクのメインテーブルが SQLステートメントのメインテーブルに

なります。

[タスク環境]メニュー

1. [リポジトリ]メニューから[プログラム]コマンドを選択します。

2. 新規の行を作成します。

3. プログラム名として任意の名前を入力します。

4. ズームして[タスクツリー]を表示します。

5. ズームして[タスク特性]ダイアログを表示します。

6. [タスク環境]メニューを開きます。

これで、画面は、図 22.1のようになります。

22–2 埋め込み SQL SQLガイド

dbMAGIC Ver.8.2

Page 175: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

22

図 22.1:[SQLコマンド]メニュー

dbMAGICでは、SQLコマンドは「タスク前処理」レベルの前に実行されます。したがって、SQLコマンド

で返ったデータは、タスクのデータビューの一部として使われることになります。

なお、指定した SQLコマンドの構文は dbMAGICによりチェックされることはありません。このため、柔軟

な SQLコマンドの作成が可能ですが、その分、注意して SQLコマンドを作成しなければなりません。また、

埋め込み SQLコマンドでエラーが発生しても、dbMAGICによりデータが保護されることはありません。

埋め込み SQLは、うまく利用することで処理効率を向上させることができます。ただし、使用する場合、そ

の効果を考慮し、適当な場合にのみ使うようにします。

埋め込み SQLは、主に次のような用途に使用できます。

■ 簡単な[リンク照会]コマンドの代わりに使用できます。ここで、[リンク照会]コマンドとは、静的

リンク式を使用して同一の SQLデータベースのテーブル間にリンクを設定する処理をいいます。

■ データベースに関する統計情報を出力したい場合に使用できます。たとえば、同一のデータが格納さ

れているレコードの数、本月の給与の合計などを取得したいときに使います。

■ 全レコードについて給与を 5%だけアップする、不要なレコードをすべて削除する、テーブルの一部を

別のテーブルにコピーするなど、テーブルの全レコードに対して処理を行いたいときに利用できます。

■ ストアドプロシージャなど、RDBMSのツールを使用して開発、コンパイルされた既存のプログラムを

再利用したいときに使用します。

SQLガイド

dbMAGIC Ver.8.2

22.1埋め込み SQLの使用 22–3

Page 176: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

22.2 埋め込みSQLの構成要素

埋め込み SQLタスクの作成

図 22.2:[SQLコマンド]ダイアログ

1.[タスク環境]メニューから[SQLコマンド]を選択します。この後、[SQLコマンド]ダイアログが

開きます(図 22.2)。

2. [データベース]フィールドをズームして、[データベース一覧]を開きます。

3. データベースを選択します。このデータベースに対して、埋め込み SQLが機能することになります。

SQLコマンド

[SQLコマンド]ダイアログに定義した SQLステートメントについては、その構文は dbMAGICによりチェッ

クされることはありません。また、指定した SQLステートメントは、dbMAGICではなく、RDBMS側です

べて処理されます。実行時、エラーが発生したときには、dbMAGICのタスクは終了し、エラーメッセージ

が表示されます。

DBMSでは、通常、定義済みプロシージャ(たとえば、ストアドプロシージャ)の作成やコンパイルが可能

ですが、[SQLコマンド]ダイアログでは、こういった定義済みプロシージャの名前を指定することもでき

ます。定義済みプロシージャの名前を指定した場合、そのプロシージャは RDBMS側で実行されます。また、

定義済みプロシージャは、SQLコマンドと同じようにして使用できます。その場合、定義済みプロシージャ

にも、通常の埋め込み SQLコマンドと同じ規則が使われます。

入力パラメータ

埋め込み SQLコマンドには、「コロン( :)+数値」の形式でパラメータ識別子を指定できます。この「コロ

ン( :)+数値」は、SQLコマンドフォームの[入力パラメータ]テーブルの値に置き換えられます。この場

合、パラメータは、SQLコマンドの準備処理の直前に計算され、続いて、「コロン( :)+数値」が計算済み

の値に置き換えられます。その後、SQLステートメントが RDBMSに送られ、構文のチェック後、実行され

ます。

SQLコマンドの構文は、必ず、その SQLコマンドの実行の前に検証されます。これは、タスクが常駐タス

クであっても同じです。一般に、入力パラメータは、WHERE句のプレースホルダとして使用します。

22–4 埋め込み SQL SQLガイド

dbMAGIC Ver.8.2

Page 177: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

22

出力パラメータ

SQL SELECTステートメントやストアドプロシージャを使うことで、標準のメインテーブルのデータビュー

のほかにもデータビューを作成できます。この場合、SQLコマンドの出力パラメータの値は、結果テーブル

やデータストリームの形で出力されますが、dbMAGIC側では、こういったデータを格納するバッファが用

意されます。このバッファは、SQLコマンドのタスクで定義されている変数項目に対応する形式で用意され

ます。この変数項目は、そのデータ型や書式が、SQLコマンドで生成されるデータのデータ型と書式と一致

していなければなりません。

アシストユーティリティ

SQLステートメントのうち、テーブル名やカラム名が必要な SQLステートメントは、アシストユーティリ

ティを使用して簡単に作成できます。

SQLコマンドを使う場合には SQL言語の知識が必要になりますが、これは、アシストユーティリティを使

うときでも同様です。

アシストユーティリティは、通常、データベースのテーブル名やカラム名を定義する SQLステートメントで

使用します。ただし、アシストユーティリティを使うときには、ステートメントの構文に注意しなければな

りません。たとえば、アシストユーティリティでは、次のような SELECTステートメントが作成されます。

SELECT ALL FROM EMPLOYEE

上記の SELECTステートメントは、構文上、正しくありません。正しい構文は次のようになります。

SELECT * FROM EMPLOYEE

アシストユーティリティの使用方法

図 22.3:[SQLアシスト]ダイアログ

SQLガイド

dbMAGIC Ver.8.2

22.2埋め込み SQLの構成要素 22–5

Page 178: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

1. [SQLコマンド]ダイアログの[アシスト]ボタンをクリックします。クリック後、[SQLアシスト]

ダイアログが開きます(図 22.3)。

2.[キーワード]ボタンをクリックします。または、� �

CTRL� �

+� �

K� �を押します。これで、カーソルが[キー

ワード]ボックスに置かれます。

3. 方向キーを使用してカーソルを「SELECT」に合わせます。

4.� �

ENTER� �

キーを押します。これで、[SQLコマンド]ボックスに「SELECT」という文字が表示され

ます。

5. [開く]ボタンを押します。または、� �

CTRL� �

+� �

O� �を押します。これで、カーソルが[演算子]ボッ

クスに置かれます。

6. 方向キーを使用してカーソルを「*」に合わせます。

7.� �

ENTER� �

キーを押します。これで、[SQLコマンド]ボックスの「SELECT」という文字に「*」と空

白が追加されます。

8. [SQLコマンド]ボックスで、スペースを入力した後、「FROM」を入力します。

9. [テーブル]ボタンをクリックします。

10. 方向キーを使用して、「EMPLOYEE」というテーブルを選択します。

11. ENTERキーを押します。これで、「EMPLOYEE」が追加されます。

[SQLアシスト]ダイアログでは、テーブル名は、dbMAGICのテーブル名で表示することもできますし、

RDBMSのテーブル名で表示することもできます。テーブル名は、[表示切替]ボタンをクリックして、dbMAGIC

のテーブル名と RDBMSのテーブル名を交互に切り替えることができます。ただし、どちらのテーブルを選

択していても、[SQLコマンド]ボックスでは必ず、RDBMSのテーブル名が表示されます。

注意:� �

[テーブル]ボックスに表示されるテーブルは、dbMAGICの[テーブル]リポジトリで定義されてい

るテーブルに限られます。ただし、SELECTステートメントでは、dbMAGICの[テーブル]リポジト

リで定義されていなくても、データベースで利用可能なテーブルであれば、任意のテーブルを指定でき

ます。� �

SQLコマンドでの APG

dbMAGICには、アシストユーティリティのほか、SQL APGユーティリティも用意されています。この APG

を使うことで、SQLステートメントをもとにプログラムを作成することができます。また、APGで作成した

プログラムでは、実行前に SQLステートメントのチェックが行われます。SQL APGでは、SELECTステー

トメントのほかストアドプロシージャを指定することもできます。

SQL APGで作成されたプログラムには、次のようなコマンドやフォームが含まれます。

■ SQLコマンド

■ 結果テーブルのカラムについての[セレクト変数項目]コマンドとそれらの変数の定義

■ 出力パラメータテーブル(自動変数項目付き)

■ デフォルトのフォーム(ユーザによる操作用)

なお、SQLコマンドの入力パラメータが必要な場合、そのパラメータを定義します。デフォルトのフォーム

を変更してもかまいません。

22–6 埋め込み SQL SQLガイド

dbMAGIC Ver.8.2

Page 179: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

22

APGユーティリティの使用方法

図 22.4:[APG]ダイアログ

1.[SQLコマンド]ダイアログの[APG]ボタンをクリックします。クリック後、[APG]ダイアログが

開きます(図 22.4)。

2.� �

ENTER� �

キーを 2回押します。

3.� �

F7� �

キーを押します。これで、プログラムが実行されます。

4. [出力パラメータ]欄にカーソルを移動し、ズームします。これで、APGユーティリティで作成され

た出力パラメータが表示されます。この出力パラメータは、[項目一覧]の変数項目に対応しています。

22.3 SELECTステートメントの動作

埋め込み SQLステートメントのうち、結果データベース(データが格納されるデータベース)を指定するよ

うなステートメントの場合、タスクの種類によって動作が異なることがあります。また、結果データベース

と入力データベース(データが取り出されるデータベース)が同じか、または別であるかによっても動作が

異なってきます。

埋め込み SQLステートメントは、必ず、タスク前処理の前に実行されます。このため、タスク前処理が実行

された場合、SQLステートメントはすでに完了していることになります。

オンラインタスクとバッチタスク

オンラインタスクの場合、埋め込み SELECTステートメントの処理は次のようになります。

■ SELECTステートメントの結果を表示する処理を行わなければなりません。

■ dbMAGICにより一時結果テーブル(ファイル)が作成され、レコードがすべて、そのテーブルに挿入

されます。このテーブルのレコードは、ユーザがスクロールして見ることができます。テーブルは、タ

スクが完了すると削除されます。

バッチタスクの場合、埋め込み SELECTステートメントの処理は次のようになります。

■ レコードはそれぞれ、1回ずつ読み込まれます。したがって、後方読込は必要ありません。

■ 定義されている SELECTステートメントにしたがってカーソルが開かれます。また、レコードはそれ

ぞれ、順次取り出されます。

SQLガイド

dbMAGIC Ver.8.2

22.3 SELECTステートメントの動作 22–7

Page 180: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

結果データベースと入力データベースが同じ場合

結果データベースと入力データベースが同じ場合、RDBMSでは、通常、次のステートメントを使用して処

理を行います。

INSERT INTOテーブル AS SELECT...

このステートメントでは、「テーブル」に指定したテーブルにすべてのデータがコピーされます。この方法

は、SELECTステートメントを使用してカーソルを開くよりも高速です。この場合、クライアントのレコー

ドがすべて取り出され、結果テーブルに挿入されます。

上記の場合、SQLゲートウェイによりデータベース上にテーブルが作成され、その後、次のステートメント

が送出されます。

INSERT INTO一時テーブル AS SELECT "埋め込み SELECTステートメント"

また、この方法では、ユーザがテーブルをスクロールすることで、SELECTステートメントの処理が速くな

ります。この方法の場合、取り出しと挿入は一度に行われるため、とくに結果テーブルが大きいときには有

効です。

結果データベースと入力データベースが異なる場合

結果データベースと入力データベースが異なるときには、一時テーブルが作成されます。また、カーソルが

定義され、レコードは一つずつ取り出されて結果テーブルに挿入されます。結果テーブルは、ユーザがスク

ロールして見ることができます。

使用方法

■ 結果テーブルが大きい場合、結果データベースと入力データベースを同じにする方法を使います。つ

まり、INSERT INTO AS SELECTステートメントを使用して処理を行います。

■ 結果テーブルが小さい場合、結果データベースとして ISAMデータベースを使います。ISAMデータ

ベースは、クライアントに置きます。また、結果テーブルの作成とスクロールは、クライアント上で

行います。この方が、ネットワークトラフィックが軽減されます。

■ 結果テーブルが比較的小さい場合、メモリゲートウェイを使うと処理速度が向上します。

22.4 埋め込みSQLを使用する際の制限

タスクで埋め込み SQLコマンドを使った場合、そのタスクは通常の dbMAGICのタスクとほぼ同じ機能を果

たします。ただし、次のような制約もあります。

■ SQLコマンドで指定するテーブルはすべて、[SQLコマンド]ダイアログの[データベース]欄で指

定されているデータベースのテーブルでなければなりません。異なるデータベースのテーブル名を同

時に指定することはできません。

■ オンラインタスクでは、SQLコマンドのビュー(結果テーブル)のカラムを更新することはできませ

ん。また、更新しても、その更新はディスクには書き込まれません。これは、結果テーブルはタスク

が終了すると同時に削除されるためです。更新を行いたいときには、別のテーブルをリンクします。

22–8 埋め込み SQL SQLガイド

dbMAGIC Ver.8.2

Page 181: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

22

■ レコードが親タスクのカレントのビューである場合、そのレコードの状態を変更するようなコマンド

は使用しないようにします。

■ バッチタスクの場合、[セレクト]コマンドでブレイクレベルを更新するような処理は行わないでくだ

さい。ブレイクレベル処理では、一つ前のレコードの更新が必要になりますが、バッチタスクの場合、

タスクのデータストリームは一方通行で停止できず、このためブレイクレベルの更新は行えません。

■ バッチ SQLコマンドでは、タスクレベルのトランザクションを使います。

■ 埋め込み SQLでは、COMMIT、ROLLBACKの各コマンドは使わないでください。この 2つのコマン

ドは、dbMAGICの標準トランザクション管理層では生成されないことがあり、その場合、結果が異常

になります。COMMIT、ROLLBACKの機能は、dbMAGICの[タスク定義]テーブルの[トランザク

ション]欄で必要なトランザクションを選択することで実現できます。

■ SQLステートメントは、使用しているRDBMSで実行されます。この場合、dbMAGICでは構文はチェッ

クされないため、定義の際には注意が必要です。また、SQLステートメントでは RDBMS独自の拡張

機能を定義することもできます。ただし、アプリケーションを各種 RDBMSに移植する場合、埋め込

み SQLにはできるだけ拡張機能を定義しないようにします。なお、RDBMSの拡張機能を定義しても、

dbMAGICでは問題はなく、RDBMSに応じて、ゲートウェイにより正常に構文が解釈されます。

■ オンラインタスクで埋め込み SQLを使った場合、dbMAGICにより一時テーブルが作成されます。ま

た、一時テーブルは、RDBMSで作成することもできます。RDBMSでは、一時テーブルは RDBMSの

ユーティリティを使用して作成できます。通常、RDBMSで作成する方が効率はよくなります。

■ DSQL(動的 SQL)の出力パラメータは、範囲の指定はできません。

■ データベースが Oracleの場合、LONGRAWのキーワードはサポートしていません。

■ 結果データベースが Oracleの場合、SELECTステートメント中で FOR UPDATE句は使うことができ

ません。

ストアドプロシージャは、「exec」の後にストアドプロシージャの名前を指定して実行できます。たとえば、

次のようになります。

exec sp_order_update

APGで作成されたステートメントは、ゲートウェイにより実行されます。この場合、結果セットの形式も正

しく解釈されます。また、データの取り出しだけでなく、データを変更するステートメントも作成できます。

22.5 エラーハンドリング

DBERR関数

dbMAGIC上で定義した SQLコマンドはチェックされないため、実行時にエラーが起こることもあります。

このため、DBERR関数を使用してエラーがないかどうかチェックするのも有効です。この関数では、SQLコ

マンドを定義したタスクの直後の親タスクの状態(データベースエラー)をチェックでき、戻り値で SQLコ

マンドが正常に実行されたかどうか、確認が可能です。

SQLガイド

dbMAGIC Ver.8.2

22.5エラーハンドリング 22–9

Page 182: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

22–10 埋め込み SQL SQLガイド

dbMAGIC Ver.8.2

Page 183: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第23章 dbMAGICと SQLによるパフォーマンス章目次

23.1 インデックスの定義と使用方法 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :23–223.2 範囲の定義 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :23–4

23.3 トランザクション : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :23–5

23.4 ソート : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :23–5

23.5 埋め込み SQL : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 23–6

23.6 ビュー : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :23–6

23.7 ストアドプロシージャとトリガ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :23–7

23.8 クライアント/サーバ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :23–7

Page 184: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第23章 dbMAGIC と SQL によるパフォーマンス

前章では、dbMAGICと SQLとの関係や基本的な動作を説明しました。ここでは、dbMAGICと SQLの効率

的使用方法を説明します。以下、いろいろな側面から、dbMAGICと SQLの効率的な利用方法を解説します。

23.1 インデックスの定義と使用方法

データの取り出しでは、ほとんどの場合、インデックスを使った方が RDBMSの応答速度が向上します。一

般に RDBMSでは、SQLステートメントにWHERE句が定義され、そのWHERE句でインデックスの最初

のセグメントが指定されており、また、要求されているレコードの順番がインデックスの順番と同じ場合、

そのインデックスの最初のセグメントを使用してレコードの取り出しが実行されます。

下に、インデックスを使った SQLステートメントを例を挙げて説明します。なお、例では、テーブルの名前

が「TBL1」で、このテーブルの「F1」、「F3」、「F5」の 3フィールドに「 IN1」というインデックスが設定

されているとします。また、「F3」、「F4」、「F5」の 3フィールドに「 IN2」というインデックスが設定され

ているものとします。

まず、ソートのとして最初のインデックス( IN1)が使われており、「F1」の最小範囲式と最大範囲式が同じ

で、「F3」の範囲式が 2つある場合、次のようなステートメントが dbMAGICから送出されます。

例:

SELECT F1, F2, F3, F4, F5

FROM TBL1

WHERE F1=1

AND F3=100

AND F3=200

ORDER BY F1, F3, F5

上記では、RDBMSでは、カラムのうち「F1」と「F3」についてインデックス「 IN1」が使われます。また、

レコードの順番は、このインデックスをもとに自動的に処理されます。ソートのキーとして最初のインデッ

クス( IN1)が使われており、「F1」の範囲式が同じで、「F2」の範囲式が 2つある場合、次のようなステー

トメントが dbMAGICから送出されます。

例:

SELECT F1, F2, F3, F4, F5

FROM TBL1

WHERE F1=1

AND F2<=’x’

AND F2>=’c’

ORDER BY F1, F3, F5

この場合、RDBMSでは、「F1」についてインデックス「 IN1」が使われます。また、「 F1=1」の条件に合致

するレコードがすべて検索されます。その後、検索されたレコードのうち、「F2」の値が「c」と「x」である

レコードが抽出され、結果テーブルに置かれます。レコードの順番は、インデックス「 IN1」により自動的

に決まります。

23–2 dbMAGICと SQLによるパフォーマンス SQLガイド

dbMAGIC Ver.8.2

Page 185: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

23

ソートのキーとして最初のインデックス( IN1)が使われており、「F1」の範囲式が同じで、「F3」の範囲式

が 2つある場合、次のようなステートメントが dbMAGICから送出されます。

例:

SELECT F1, F2, F3, F4, F5

FROM tbl1

WHERE F1>=1

AND F1=10

AND F3>=100

AND F3<=200

ORDER BY F1, F3, F5

この場合、RDBMSでは、「F1」についてインデックス「 IN1」が使われます。また、「F1」の値が「1」から

「10」までの範囲にあるレコードがすべて取り出され、さらに、取り出されたレコードのうち、「F3」の値が

指定された範囲(つまり、100から 200)にあるレコードが抽出されます。なお、「F3」については、最初の

セグメントの範囲が単一の値ではないため、インデックスは使われません。レコードの順番は、インデック

スによって決まります。

ソートのキーとして 2番目のインデックス( IN2)が指定され、「F1」の範囲式(最小と最大)が同じで、「F3」

の範囲式が 2つある場合、次のようなステートメントが dbMAGICから送出されます。

例:

SELECT F1, F2, F3, F4, F5

FROM TBL1

WHERE F1=1

AND F3>=100

AND F3<=200

ORDER BY F3, F4, F5

上記の場合、「F1」と「F3」についてインデックス「 IN1」が使われます。レコードのソートは、結果テーブ

ルをソートする方法で行われます。このケースでは、最初のインデックスが範囲の特定(F1が 1で、F3が

100から 200の間)に使われているため、2番目のインデックス( IN2)によるソートは不可能です。ただし、

この場合、結果テーブルは通常は小さいため、ソート処理は比較的高速です。

ソートのキーとして最初のインデックスが使われており、「F3」の範囲式が 2つある場合、次のようなステー

トメントが dbMAGICから送出されます。この場合、2番目のインデックスが使われ、レコードのソートは、

インデックスを使わずに実行されます。

例:

SELECT F1, F2, F3, F4, F5

FROM TBLI

ORDER BY F1 DESC, F3 DESC, F5 DESC

上記の例では、RDBMSでは、テーブル全体についてソートが実行されます。このため時間がかかることが

あり、このソートを回避したい場合、最初のインデックスのカラムと同じカラムに別のインデックスを定義

します。また、レコード順としては、降順を指定します。

SQLガイド

dbMAGIC Ver.8.2

23.1インデックスの定義と使用方法 23–3

Page 186: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

注意:� �

インデックスを使った場合、データベースにインデックス用のスペースが必要になり、このため、挿入

や更新、削除といった処理では時間がかかることがあります。また、極端なときには、SELECTステー

トメントの処理速度も落ちることがあります。

たとえば、データがディスクスペースの 1ブロックに収まるようなテーブルの場合(通常、このサイズ

で数千件のレコードを格納できます)、インデックスを使うと処理速度が落ちます。インデックスを使

用してテーブルにアクセスする場合、RDBMSでは、入出力処理が 2回(インデックスの入出力とデー

タの入出力)実行されます。一方、インデックスがないときには、1ブロック上のテーブルに対するア

クセスは 1回で済みます。つまり、テーブルは 1回の入出力でメモリに読み込まれます。メモリへのア

クセスはディスクへのアクセスに比べて速いため、この処理は高速です。

なお、指定されているカラムがすべてインデックスのセグメントである場合、RDBMSでは、データで

はなくインデックスに対してだけアクセスが実行されます。この処理をカバーインデックスクエリなど

と呼んでいます。以上のようにインデックスを使用した場合、処理速度が落ちることがありますが、一

般的にはインデックスを使った方がアプリケーションの処理は高速になります。� �

23.2 範囲の定義

リレーショナルデータベースの場合、大きいテーブルを検索する場合、範囲を指定してビューに表示される

レコードの数を絞るようにします。範囲を指定しないでテーブルにアクセスすると(たとえば、APGのプロ

グラム)、処理によっては時間がかかることがあります。とくに、位置付やページアップなどの処理は遅く

なります。また、範囲の指定は、インデックスのセグメントを使うと効率がよくなります。

dbMAGICでは、次の 2つの要素を使用して範囲の指定が可能です。

■ dbMAGICの SELECTステートメント  

[セレクト]コマンドで指定した範囲は、SELECTステートメントに追加されます。SELECTステート

メントは RDBMSに送られ、範囲は、RDBMSでWHERE句を使用して処理されます。これは、検索が

順次検索のときも同じです。この後、指定された範囲で見つかったレコードが取り出されます。

■ タスクレベルの範囲式  

タスクレベルで範囲式を指定した場合、データベースから返ってきたレコードは、その範囲式と照合さ

れます。その後、範囲に合致するレコードがビューに表示されます。

上記の 2つの範囲式は、別個に機能します。この 2種類の範囲式の使い方としては、まず、[セレクト]コ

マンドの範囲式で、おおよその条件を指定します。続いて、この範囲式で絞りきれなかったレコードをタス

クレベルの範囲式でさらに限定します。たとえば、カラム「フィールド 1」の値が「100」から「200」のレ

コード、または「300」から「400」のレコードを取り出したかったとします。この場合、[セレクト]コマ

ンドでは、この条件を一度に定義することはできません。こういったときにタスクレベルの範囲式を使いま

す。つまり、[セレクト]コマンドの範囲式では、カラム「フィールド 1」の値が「100」から「400」までの

レコードを取り出す条件を指定し、その後、タスクレベルで「300」から「400」のレコードを取り出す条件

を定義します。

23–4 dbMAGICと SQLによるパフォーマンス SQLガイド

dbMAGIC Ver.8.2

Page 187: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

23

23.3 トランザクション

トランザクションを使うことで、データの整合性を維持することができ、また、処理効率も向上します。一

般的にトランザクションが長ければ長いほど処理効率は向上しますが、オンラインタスクの場合、長いトラ

ンザクションは、ロックに関して問題が発生することがあります。以下、トランザクションを使う場合のガ

イドラインをオンラインタスク、バッチタスクに分けて説明します。

オンラインタスクの場合

オンラインタスクの場合、トランザクションは次の方法で使用します。

1. デフォルトでは、トランザクションはレコードレベルで設定するようになっています。この場合、db-

MAGICのサイクルでいうと、更新段階の前に読込/書出トランザクションが開始され、その後、更新

が実行され、最後にトランザクションがコミットされるという処理順序になります。この手法は、ISAM

ファイルを使ったときの dbMAGICの通常の処理方法で、したがって ISAMの場合、この方法を使い

ます。ただし、オンラインタスクの場合、行は、接続切断の際に挿入されたり更新されたりするため、

参照の整合性という点では不利になります。

2. トランザクションでのデータ処理がすべて完了すれば、バッチトランザクションを別個に実行してデー

タをデータベースに書き込みます。この場合、トランザクションで処理されるデータは、一時ファイル

の格納します。この方法では、参照の整合性を維持できますし、ロックに関する問題も解消されます。

ただし、処理はかなり複雑になり、これがデメリットになります。

バッチタスクの場合

バッチタスクでは、トランザクションの数をできるだけ減らすのが肝要です。その方法としては、タスクレ

ベルでトランザクションを開始します。また、タスクが非常に長いときには、ブレイクレベルを使用してト

ランザクションを開くようにします。タスクレベルでトランザクションを指定した場合、そのタスクがコミッ

トポイントに達しなかったときには、それまでのデータベースへの書込は自動的にロールバックされます。

なお、ブレイクレベルでトランザクションを開くようにした場合、コミットが実行されたポイント、つまり

タスクのどこまでの処理が完了したかをマークしておく必要があります。これは、ツリーの最上位のバッチ

タスクのトランザクションの設定を「Yes」しておくことで可能です。この操作により、子タスクも含めてタ

スク全体が単一のトランザクションに収められ、また、処理が記録されます。

たとえば、バッチタスクで、納品データをもとに顧客ごとに月次伝票処理を行うとします。この場合、単一

のトランザクションですべての顧客の処理を行うと、何らかの原因でタスクが途中で停止したときには、最

初から処理をやり直さなければなりません。一方、別の顧客に変わったときにトランザクションを開いた場

合(ブレイクレベルを使った場合)、直前に処理された顧客のレコードが制御レコードに維持されます。した

がって、エラーが発生したときでも、その時点で未処理の顧客のレコード(エラーが発生したときのレコー

ド)から再度、処理を開始することができます。

テーブルのすべてのレコード、または大部分のレコードを更新したい場合、テーブルは排他モード(書出/

なし)で開くようにします。これで、ロックは、各レコードごとではなく、テーブルにかけられるようにな

ります。

23.4 ソート

ソートは dbMAGIC内部でも可能ですが、負荷が大きくなります。このため、データのソートは RDBMSで

行い、ソート後の結果を dbMAGICに取り込む方法が有効です。この場合、ソートに使われるインデックス

は、dbMAGICの[テーブル]リポジトリで定義できます。

SQLガイド

dbMAGIC Ver.8.2

23.3トランザクション 23–5

Page 188: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

変数項目をキーにすることもできます。この場合、RDBMSではインデックスは定義されません。変数項目

をキーにした場合、SELECTステートメントに ORDER BY句が追加され、RDBMSに送られます。変数項

目のキーは、dbMAGIC上では、実データ項目のキーと同じように扱われますが、データベース側では変数

項目のキーに対応するインデックスは作成されません。なお、変数項目のキーは、リンクテーブルではなく

メインテーブル(また、タスクはバッチタスク)で使わなければなりません。

23.5 埋め込みSQL

dbMAGICでは、通常、RDBMSの機能を直接操作することはできませんが、埋め込み SQLを使うことで

RDBMSの SQL機能を引き出すことができます。

たとえば、テーブルの全レコードに対する更新や削除(グローバル処理)は、埋め込み SQLを使うと効果的

に実行できます。また、とくにクライアント/サーバ環境では、グローバル処理は過度のネットワークトラ

フィックを低減できるという点で有利です。

そのほか、SUM、TOTAL、AVG などの統計関数を使いたいときにも、埋め込み SQLを利用できます。ま

た、レコードの数をカウントしたい場合、単純にレコードを読み込んでカウントするより、埋め込み SQLで

SELECT COUNT(*)を使うのが便利です。

23.6 ビュー

複数のテーブルを結合して表示する場合、dbMAGICのテーブル(ビュー)を使うより RDBMSのビューを

使った方が効率がよくなります。dbMAGICでは、データベースの複数のリンクテーブルに対してそれぞれ

別個の SELECTステートメントを送出してビューを作成するという方法が使われます。この方法に比べて、

バッチタスクを使用してメインテーブルとリンクテーブルを結合し、この結合で出来上がったビューを利用

するのが効率的です。この場合、ビューは、データベース側で作成します。その後、作成されたビューはメ

インテーブルとして扱うことができ、したがって、タスクの SELECTステートメントも一つで済みます。

なお、dbMAGICのビューと RDBMSのビューでは、次のように意味が異なります。

■ dbMAGICでは、ビューとは、メインテーブルから選択された項目、リンクテーブルから選択された項

目、実データ項目をもとに作成された変数項目の 3者からなる簡単なテーブルをいいます。

■ RDBMS(SQLデータベース)では、ビューとは定義済み SELECTステートメントによる表示結果を

いいます。この定義済み SELECTステートメントは、内部のデータディクショナリに格納されていま

す。定義済み SELECTステートメントでは、複数のテーブルの結合も定義できますし、統計関数も使

用できます。また、WHERE句を使用してテーブルの特定のレコードの指定も可能です。

例:10,000件のレコードが格納されたメインテーブルと 3つのリンクテーブルを扱うタスクがあったとしま

す。このタスクでは、レコードをすべて取り出す場合、通常法方法では、実行される SELECTステートメン

トの回数は、1 + 3× 10,000で計 30,001回となります。

ここで、データベースのビューを使ったときには、SELECTステートメントの実行回数は 1回(つまり、メ

インテーブルに対してのみ)になります。

なお、結合処理は、RDBMSのビューの場合、デフォルトでは内部結合で、dbMAGICの結合処理(リンク)

は外部結合という違いがあります。

例:

テーブル「F1」とテーブル「F2」を、テーブル「F1」のカラム「C3」を使用して結合するとします。

上記の場合、dbMAGICでは、「F1」のすべてのレコードが dbMAGICのビューに表示されます。ここで、表

示されたレコードのうち、カラム「C3」の内容が空のレコード、またはカラム「C3」の値が「F2」のレコー

ドに見つからなかったレコードについては、「F2」から結合されたカラムの内容は空白になります。

一方、RDBMSのビューでは、結合方式はイナージョインのため、「F1」と「F2」で、双方ともカラム「C3」

の値が一致するレコードだけが表示されます。このビューを dbMAGICで使うことができます。

23–6 dbMAGICと SQLによるパフォーマンス SQLガイド

dbMAGIC Ver.8.2

Page 189: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

23

23.7 ストアドプロシージャとトリガ

ストアドプロシージャを利用することで、アプリケーション上でサーバの機能を十分引き出すことができま

す。ストアドプロシージャは、dbMAGICでは、埋め込み SQLを使用して呼び出すことができます。

ストアドプロシージャの構文は、データベースの種類によって異なります。そのため、アプリケーションの

移植の際には問題になることがあります。ストアドプロシージャとアプリケーションの移植については、第

24章に解説があります。

トリガとは、レコードの挿入や更新、削除が実行されると自動的に実行されるような処理をいいます。トリ

ガは dbMAGICで使用できますが、その場合、データベースにどういったトリガが用意されているかをよく

チェックしてください。トリガの中には dbMAGICのプログラムと機能が同じものもあり、その場合、とく

にトリガを使用する必要はありません。

23.8 クライアント/サーバ

クライアント/サーバアーキテクチャを使用する場合、アプリケーションのどの機能をクライアントまたは

サーバで実行するかを検討しなければなりません。クライアントにはフロントエンド(ユーザインタフェー

ス)があり、したがってユーザによる操作を、一方、サーバではデータベースに関する操作を行うのが普通

です。また、クライアントとサーバとの間でネットワークを介して大量のデータがやりとりされないように、

クライアントとサーバとの処理の分担を考慮することも必要です。結局、ネットワークトラフィックを減ら

すのが効率のいい処理を実現する秘訣です。

ネットワークトラフィックは、次のようにすることで軽減できます。

■ バッチタスクは、サーバで行います。クライアントから大きなバッチタスクをサーバに送るようなこ

とは避けます。

■ できれば、リンクよりビューを使います。

■ レコードのカラムは、必要なものだけを指定するようにします。これで、SQLステートメントで使わ

れるカラムも減り、SELECTステートメントが軽くなります。

SQLガイド

dbMAGIC Ver.8.2

23.7ストアドプロシージャとトリガ 23–7

Page 190: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

23–8 dbMAGICと SQLによるパフォーマンス SQLガイド

dbMAGIC Ver.8.2

Page 191: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第24章 dbMAGICバージョン 8への移行と移植章目次24.1 dbMAGICバージョン 8の新機能 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 24–2

24.2 dbMAGIC 6、7から dbMAGIC 8への移行 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 24–2

24.3 ISAM→ RDBMS : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :24–3

24.4 RDBMS→ ISAM : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :24–5

24.5 RDBMS←→ RDBMS : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :24–5

24.6 同じアプリケーションを RDBMSと ISAMで使用する場合 : : : : : : : : : : : : : : : : : : : : : : : : : :24–5

Page 192: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第24章 dbMAGICバージョン8への移行と移植

dbMAGICでは、使用する DBMSを変更することも簡単です。以下、従来の dbMAGICからのバージョンアッ

プと RDBMSの種類の変更について説明します。

24.1 dbMAGICバージョン 8の新機能

dbMAGICバージョン 8では、SQL関連の機能が多数強化されています。強化された機能は、主に次の通り

です。

■ 処理  

リンク結合、SQL WHERE句、RDBMS側でのソート、トランザクションモード「オンロック」の追加。

■ dbMAGIC 6、7で明示的に定義しなければならなかったデータベース情報の簡単な指定  

位置、ヒント、SQLタイプ、分離レベルなど。

■ dbMAGICの基本機能  

デフォルト、キャッシュ方式、DB名の自動生成。

■ 関数  

INTRANS()、CNDRANGE()、ISDEFAULT()。

■ 用語  

ISAMから SQLに即した用語へ変更。

24.2 dbMAGIC 6、7からdbMAGIC 8への移行

dbMAGICバージョン 8では、従来のバージョンに比べ、dbMAGICのデータ型の RDBMSのデータ型への

割り当てが簡単になりました、以下は、この割り当てに使われる規則です。

1. RDBMSのデータ型のうち、dbMAGICの文字型に割り当てられているデータは、内部的にはすべて

Zstringで格納されます。このため、dbMAGIC 6、7で作成されたアプリケーションを dbMAGICバー

ジョン 8にインポートすると、SQLの文字型のカラムは、Zstringで格納されます。なお、物理データ

には影響は及びません。

2. dbMAGICの数値型では、18桁までがサポートされています。SQLゲートウェイで数値が扱われる場

合、15桁を超える数値はすべて、dbMAGICの数値型として内部的に格納されます。物理データには

影響は及びません。

3. dbMAGICの日付型は、String Dateに割り当てられています。このデータ型の長さは 8桁です。した

がって、データベースでは変更は不要ですが、CTLでは変更が必要になります。

dbMAGIC 6、7で作成されたアプリケーションを dbMAGICバージョン 8にインポートすると、SQL

ベースの日付カラムはすべて、長さは 8桁になります。

注意:� �

dbMAGIC 6、7で日付型として CHAR (6)を使用していた場合、データの変更が必要になります。� �

4. dbMAGIC 6、7では、メモ型のサイズは、指定されている最大サイズになります。一方、dbMAGICバー

ジョン 8では、データベースのカラムの物理サイズがメモ型のサイズになります。また、データの後

続の空白は、スペースで埋められることはありません。

24–2 dbMAGICバージョン 8への移行と移植 SQLガイド

dbMAGIC Ver.8.2

Page 193: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

24

Oracle7関係

1. dbMAGIC 7では String Timeの SQLデータ型は RAWでしたが、dbMAGICバージョン 8では CHAR

になっています。

2. dbMAGIC6以前の Oracle7ゲートウェイで有効だった、設定/ DBMSパラメータの REFRESH=Yは

無効です。これに伴い、レコードロック時にタスクレベルのトランザクションが掛けられたバッチ処理

を実行したときの動きは、dbMAGIC6以前と 7以降では異なることがあります。

3. dbMAGIC6以前の Oracle7ゲートウェイで定義されたデフォルト RAW型は、dbMAGIC7以降のゲー

トウェイの RAW型より桁数が 1多くなっています。互換性を保つには、設定/ DBMSのパラメータ

に OLDRAW=Yを設定することです。ただし、このパラメータは将来のバージョンに渡ってサポート

される保証はありません。

4. dbMAGIC6以前の Oracle7ゲートウェイで定義された日付型記憶形式の StringDate(サイズ (8))は RAW

型でしたが、dbMAGIC7以降の Oracle7ゲートウェイでは DATE型に変更されました。互換性を保つ

には、設定/ DBMSのパラメータに OLDDATE=Yを設定することです。ただし、このパラメータは

将来のバージョンに渡ってサポートされる保証はありません。

5. dbMAGIC6以前の Oracle7ゲートウェイで、項目特性/データベース情報に設定が可能だった OLD-

DATE=Yは無効です。互換性を保つには、カラム特性/タイプに RAW(8)を設定してください。

6. dbMAGIC6より前のOracle7ゲートウェイで、項目特性/データベース情報に設定が可能だった LONG=Y

LONGRAW=Y VARCHAR=Nは無効です。LONG型、LONGRAW型、CHAR型項目を定義する場合、

カラム特性/タイプにそれぞれ、LONG LONGRAW CHAR(n)を設定してください。

7. dbMAGIC6より前の Oracle7ゲートウェイで、キー特性/インデックス名が指定していない場合のイ

ンデックス名の命名規則は、「テーブル名+KEYnnn(nnnはキー番号)」でしたが、dbMAGIC6以降の

Oracle7ゲートウェイでは、「KEYnnn+テーブル名」に変更されています。

24.3 ISAM→RDBMS

環境が ISAM(通常、Btrieveや CISAM)の場合、SQLデータベースのときとはアプリケーションの作成方

法が異なります。ISAMファイルでは、SQLデータベースに比べて、処理や操作は一般的には簡単になりま

す。SQLデータベースを扱うアプリケーションでは、通常、複雑なプログラミングが必要になることを留意

しておいてください。

RDBMS対応のアプリケーションを作成する場合、次の点に注意が必要です。

■ 一般の設定  

通常、MAGIC.INIファイルと[動作環境]ダイアログの設定を両方変更しなければなりません。dbMAGIC

の動作環境については、「リファレンス」を参照してください。

■ [テーブル]リポジトリ  

[テーブル]リポジトリの設定も変わります。ただし、設定の変更は、スクリプトを使用してエクスポー

トすることで行えます。

[テーブル]リポジトリの設定を変更する場合、まず、テーブルのデータベースの設定を変更します。

変更すると、カラムの記憶型式(データ型)が、データベースに対応する SQLゲートウェイのデフォル

トの記憶型式に自動的に変更されます。デフォルトはそのまま使えますが、日付カラムに「0」を入れた

いときには、SQLのデータ型を CHAR(6)または CHAR(8)にします。

また、ISAMではデータベース名は指定できないため、データベース名を追加します。さらに、必要で

あれば、NULL 値に関する設定を行います。

SQLガイド

dbMAGIC Ver.8.2

24.3 ISAM→ RDBMS 24–3

Page 194: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

■ 変換  

テーブルのデータベースを変更すると、dbMAGICのテーブル変更機能がオンになります。この後、db-

MAGICによりデータの変換が実行されます([テーブル変更]ダイアログ)。データの量が少ないときに

は、この変換機能を使用して変換できますが、データが多いときには、テーブルをいったん ASCIIファ

イルとしてエクスポートします。その後、SQLloaderや bcpなどの RDBMSのツールを使用して処理を

行います。こういったツールの方が、dbMAGICのテーブル変換機能よりも高速です。

■ デフォルト値以外の値が入っているカラムの選択  

NULL 値が許可されていないカラムは、INSERTステートメントで指定しなければなりません。このた

め、タスクでレコードを挿入する場合、まず、NULL 値が許可されていないカラムをすべて選択する必

要があります。ただし、これで、dbMAGICにより、選択されたカラムをもとに INSERTステートメン

トが自動的に作成されます。

■ 位置インデックスのカラムの選択  

RDBMSが MS-SQLのときには論理ロックが使われますが、この処理には、ユニークインデックスのセ

グメントの値が必要になります。このインデックスは、位置インデックス(DBPOS)と呼ばれます(詳

しくは、第 19章を参照してください)。このため、レコードの更新や削除を行うタスクでは、このイン

デックスのセグメントに関係するカラムをすべて選択しなければなりません。

■ インデックス  

ISAMでは、非ユニークインデックスが使われるのが普通です。SQLデータベースの場合、ノンユニー

クインデックスしか定義されていない場合、いずれかをユニークインデックスに変更するか、新規にユ

ニークインデックスを追加しなければなりません。また、できれば、インデックスの方向も片方向にし

ます。

■ インデックス  

データベースのインデックスは、dbMAGICのインデックスと同じにします。これで、アプリケーショ

ン上でのソート処理が少なくなります。

■ リンク  

ISAM 対応のアプリケーションでは、リンク処理もよく使われます。このリンク処理には多くのリソー

スが必要で、その関係からタスクの処理も遅くなります。リンク処理の負荷は、次のようにして軽減で

きます。

■データベースでテーブルを結合し、ビューを作成します。

■キャッシュを使用して、データベースからレコードが取り出される回数を減らします。

■カラムまたはコードの検証用のプログラムを作成し、そのプログラムを呼び出して検証を行います。

■テーブルがそれほど大きくなく、更新も少ない場合、テーブルを常駐にします。

■リンク結合処理を使います。

■ トランザクション  

ISAM 対応のアプリケーションでは、通常、定義済みのトランザクションはそれほど変更しなくて済み

ます。一方、RDBMSの場合、ほとんどの処理がトランザクションで実行されるため、よく検討する必

要があります。 ISAM 対応のアプリケーションのトランザクション処理を変更しない場合、通常、ロッ

クの時間が必要以上に短く、また、データベースエラーが発生したときには、処理全体がロールバック

されます。このため、定義済みのトランザクションの検証が必要です。ただし、変更部分はそれほど多

くなく、dbMAGICのデフォルトの設定でも十分なこともあります。

■ 埋め込み SQLとストアドプロシージャ  

埋め込み SQLを使うことで、アプリケーションの処理速度が向上するとともに、クライアントとサーバ

間のネットワークトラフィックも低減します。また、埋め込み SQLでは、テーブルの全レコードの一括

更新もでき、複雑な範囲指定も可能です。そのほか、ストアドプロシージャも利用できます。

埋め込み SQLやストアドプロシージャを使うことで、処理速度の大幅向上が見込めます。ただし、処理

はかなり複雑になり、そのため、アプリケーションと SQLに詳しくなければ扱えないこともあります。

24–4 dbMAGICバージョン 8への移行と移植 SQLガイド

dbMAGIC Ver.8.2

Page 195: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

24

■ dbMAGICのロック  

RDBMSのロックメカニズムを使うと、通常、dbMAGICのロックは不要になり、処理速度も向上します。

この場合の dbMAGIC上でのロックの動作は、ほかの SQL対応アプリケーションの場合と同じです。な

お、場合によっては、ロック処理の検証が必要になったり、ファイルによっては dbMAGICのロックを使

わなければならないこともあります。とくに、論理ロックやページレベルのロックが使われる RDBMS

では、dbMAGICのロックが必要なこともあります。

24.4 RDBMS→ ISAM

RDBMS対応の dbMAGICアプリケーションを ISAM対応にするのは、その逆よりも簡単です。ただし、ビュー

や仮想インデックス、埋め込み SQL、NULL、ストアドプロシージャなど、SQLでのみサポートされている

機能が搭載されているプログラムは若干問題があります。また、データベース自体の機能をアプリケーショ

ン側でサポートしなければならないこともあり、そういった場合は変更は複雑になります。

トランザクションは、無視してもかまいません。また、片方向のユニークインデックスとキャッシュもその

まま使用でき、処理効率も上がります。

24.5 RDBMS←→RDBMS

時には、使用しているRDBMSを別の RDBMSに変更したいこともあります。この場合の変更方法は、ISAM

から RDBMSへ、または RDBMSから ISAMに変更するときより簡単です。この変更は、ほとんどの場合、

[テーブル]リポジトリの各テーブルについて、そのデータベースの種類(つまり、基本的にはデータ型だ

け)を変えるだけで済みます。ただし、次のようなときには、多少、操作が必要になります。

■ 埋め込み SQLステートメントを使用しており、そのステートメントの構文がそれまで使用していた

RDBMS独自のものである場合。このケースでは、ステートメントの構文を変更しなければなりません。

■ ストアドプロシージャは、書き直す必要があります。

■ dbMAGICのビューは、RDBMSが変わってもそのまま使用できます。ビューがない場合、あらたに書

き起こさなければなりません。

■ それまで使用していた RDBMSのロックが物理ロック、行レベルのロックで(Oracle)、そのアプリケー

ションを論理ロック、ページレベルの RDBMSに変更したい場合(または、その逆)、動作が変わるこ

とがあるためチェックが必要です。

一般的には、RDBMSを別の RDBMSに変更するときの操作は簡単で、変更箇所はそれほど多くはありま

せん。

24.6 同じアプリケーションをRDBMSと ISAMで使用する場合

状況によっては、同じアプリケーションを RDBMSと ISAMの両方の環境で使いたいこともあります。こう

いったときには、[テーブル]リポジトリの設定を変更します。この作業は、スクリプトを使用してエクス

ポートする方法で行い、内容をスキャンしながら変更します。

アプリケーションを RDBMSと ISAMの両方の環境で正常に動作させたい場合、SQLと ISAMの最小公約数

を確保します。つまり、前述の「RDBMS→ ISAM」のセクションで説明したように、SQLの場合、ビュー、

埋め込み SQL、仮想インデックスなどが使われますが、こういった要素を除いたプログラムが ISAM対応の

プログラムとなります。したがって、RDBMS対応にしたいときには、こういった要素をアプリケーション

に追加し、ISAMの場合には、取り除けばいいことになります。

なお、埋め込み SQLや仮想インデックスは、アプリケーションによっては不要なこともあります。

SQLガイド

dbMAGIC Ver.8.2

24.4 RDBMS→ ISAM 24–5

Page 196: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

アプリケーションを RDBMSまたは ISAMで動作させたい場合、使用するデータベースの種類を指定しなけ

ればなりません。この指定は、MAGIC.INI ファイルのデータベースセクションで INIGET関数を使用して行

えます。この関数により、データベースの情報が読み込まれ、アプリケーションはそのデータベースに対応

するようになります。つまり、RDBMSでビューを表示したり、ISAMでリンク処理を行うといったことが

できるようになります。

なお、RDBMSのツールは、RDBMSに関係する処理にだけ使うようにします。RDBMSのツールを使用し

て、RDBMS上で ISAMのテーブルシステムを使うといったことは避けなければなりません。

24–6 dbMAGICバージョン 8への移行と移植 SQLガイド

dbMAGIC Ver.8.2

Page 197: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

第25章 技術情報章目次25.1 [SQLコマンド]ダイアログ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 25–2

25.2 一般的な技術事項 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :25–3

25.3 Oracle : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 25–4

25.4 MS-SQL Server : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 25–6

25.5 ODBC : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 25–9

25.6 旧バージョンと dbMAGICバージョン 8でのフラグの扱い : : : : : : : : : : : : : : : : : : : : : : : : :25–10

Page 198: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第25章 技術情報

この章では、SQLデータベース関する一般的な情報を紹介します。情報は、データベースごとに掲載してお

ります。

25.1 [SQLコマンド]ダイアログ

[SQLコマンド]ダイアログでは、任意の SQLコマンドを定義できます。このダイアログの使い方とは、お

およそ次の通りです。

機能

dbMAGICでは自動的に SQLコマンドが生成されますが、[SQLコマンド]ダイアログでは、dbMAGICに

より生成されない SQLコマンドの指定が可能です。このため、SQLの高度な機能が使え、また、処理効率

も向上します。

SELECTステートメント

[SQLコマンド]ダイアログには、どんな SQLコマンドでも定義できます。また、ストアドプロシージャを

実行したり、GROUP BY、SUM、DISTINCTなどのキーワードも使用できます。

注意:� �

SELECTステートメントに対しては、ゲートウェイでカーソルが使われます。このため、SELECTステー

トメントは、サーバのカーソルに対応した有効なステートメントでなければなりません。� �

結果データベース

結果データベースとソースデータベースは別個のデータベースでなければなりません。

APG

dbMAGICの APG(自動プログラムジェネレータ)を使用して、簡単なプログラムの作成が可能です。たと

えば、結果セットの操作や SELECTステートメントの出力を扱うプログラムを作成できます。

その他のステートメント

[SQLコマンド]ダイアログでは、SELECTステートメントのほか、グローバル更新やグローバル削除を実

行するステートメント、DDL ステートメント、PL/SQLブロックの指定が可能です。

25–2 技術情報 SQLガイド

dbMAGIC Ver.8.2

Page 199: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

25

25.2 一般的な技術事項

セキュリティ

dbMAGICには独自のセキュリティメカニズムが搭載され、このメカニズムは、RDBMSのセキュリティメカ

ニズムより優先されます。したがって、dbMAGICのセキュリティメカニズムを変更すると、自動的に RDBMS

の動作も変わります。また、RDBMSのセキュリティ上の規則も有効で、dbMAGICのセキュリティメカニズ

ムに加えて、その規則も機能します。セキュリティについては、詳しくは、「開発者ガイド」を参照してくだ

さい。

エラーハンドリング

dbMAGICからの要求はゲートウェイで処理されますが、処理でエラーが発生したときには、dbMAGIC上

でエラーメッセージが表示され、エラーの内容が報告されます。このエラー情報は、アプリケーションで

DBERR関数を使用して処理できます。DBERR関数については、「リファレンス」の「関数」の章を参照して

ください。

ソート/一時データベース

ソート/一時データベースとしては、ISAMデータベースが適しています。MS-SQLでは、ソート/一時デー

タベース用として一時テーブルが作成されます。ただし、この一時テーブルは、トランザクションエラーの

原因になることがあります。

トリガ

データベースにトリガがあるかどうかは、dbMAGICには認識されません。といっても、dbMAGICはトリガ

に対応しており、dbMAGIC上で扱うことができます。トリガの処理でエラーが発生した場合、そのトリガ

を起動した dbMAGICのアクションにもエラーが発生します。

ルール

データベースで使われているルールは、dbMAGICには認識されません。ただし、dbMAGICはデータベー

スのルールに対応しています。ルールの処理でエラーが発生した場合、そのルールを起動した dbMAGICの

アクションにもエラーが発生します。ルールがサポートされているデータベースとしては、MS-SQLがあり

ます。

再索引モード

DBテーブル/オープンが再索引モードを指定し、かつテーブルが新規に作成されるときには、プログラム

の終了時にインデックスが作成されます。このモードは、大きなバッチ更新処理のパフォーマンスの改善に

つながりますが、テーブルへの排他アクセスを必要とします。また、重複不可インデックスが定義されてい

るにもかかわらず、重複レコードが作成された場合には、対応するインデックスは作成されません。

また、再索引モードで既にテーブルとインデックスが存在している場合、インデックス特性/インデックス

の再作成フラグを Yesにしておくことで、プログラムの開始時にインデックスを削除し、プログラムの終了

時にインデックスを再作成する動作を行います。

SQLガイド

dbMAGIC Ver.8.2

25.2一般的な技術事項 25–3

Page 200: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

25.3 Oracle

以下、データベースが Oracleの場合、dbMAGICでサポートされている機能を掲載します。

オプティマイザのヒント

Oracleの場合、ヒント文字列を SELECTステートメントに追加できます。この文字列はハードコード文字列

で、フォーマットがチェックされることはありません。

ヒントの構文は、次の通りです。

/*+Oracleヒント */

なお、オプティマイザのヒントは、必要なときに限って使うようにします。ヒントを使う場合、あらかじめ

RDBMSのマニュアルをよくお読みください。

ストアドプロシージャ

Oracleのストアドプロシージャは、予約語「exec(または execute)」を使用して実行できます。フォーマッ

トは、次の通りです。

execストアドプロシージャ名 <パラメータ>

または、

executeストアドプロシージャ名 <パラメータ>

パラメータとして INOUTまたは OUTを使わないときには、ストアドプロシージャは PL/SQLブロックとし

て呼び出さなければなりません。この場合、フォーマットは、次のようになります。

begin プロシージャー名 (:1, ’:2’); end;

in, inout, outパラメータとデータの受け渡しを行う dbMAGICの項目のデータ型は、文字型、数値型をサポー

トしています。文字型の入力パラメータは、シングルクォーテーションで囲んでください。文字型以外、例

えば日付型の場合も文字型として扱います。パラメータを複数指定するときには、パラメータをコンマで区

切ります。また、プロシージャーの末尾にはセミコロンなどの記号は付けないようにします。

inパラメータを使用する場合は、[SQLコマンド]ダイアログの[入力パラメータ]からズームして[パラ

メータ]テーブルを開き、inパラメータに対応する dbMAGICの項目を適当に設定します。日付型の場合に

は、式欄で DSTR(パラメータとして渡される日付型変数, ’YY-MM-DD’ )のように変換します。

ストアドプロシジャーの EXEC (プロシジャー名);の構文を指定したときは、OUTパラメータをプログラム

の内部で正しくセットさせるため、SQLAPGを実行してください。また逆に、BEGIN;プロシジャー名;END;

の構文では SQLAPGを実行する必要はありません。OUTパラメータとして定義された変数項目は、カラム

特性のデータベース情報に特有のパラメータがセットされます。

OUTパラメータは、ストアドプロシジャーに直接記述せず、次のようにコンマをプレースホルダーとして使

います。

exec プロシージャー名 (:1,’:2’,,)

この例では、3番目のパラメータが OUTパラメータであることを示しています。

プログラムのタスクタイプは「B=バッチ」、トランザクションはタスク処理レベルで Yes、[タスク制御/タス

ク終了]を Yesに設定します。

25–4 技術情報 SQLガイド

dbMAGIC Ver.8.2

Page 201: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

25

注意:� �

結果データベースが Oracleでない場合、INOUTまたは OUTを使ったプロシージャは、バッチモードオ

ンラインモードのいずれかで使用できます。INOUTパラメータの日付フォーマットは、YYYYMMDD

でなければなりません。� �

マルチ接続

Oracleにはデータベースリンク機能が搭載され、この機能を使うことで、単一の dbMAGICセッション上で

異なるサーバに置かれたデータベースに別々にアクセスが可能です。

ビュー

Oracleでは、ビューには、仮想ユニークインデックスが定義されていなければなりません。ビューでは、更

新と削除処理が可能です。また、複数のテーブルをもとに作成されたビューには ROWIDはありません。し

たがって、[テーブル特性]ダイアログの[SQL]タブの[位置]欄では、「デフォルト」や「ROWID」では

なく、「ユニークインデックス」を選択します。

注意:� �

dbMAGIC上では、Oracleのビューは通常のテーブルと同じように扱われます。このため、dbMAGIC上

でビューの名前を変更したり変換処理を行わないようにしてください。こういった処理を行うと、エラー

メッセージが表示され、処理は実行されません。� �

ユニークビュー

dbMAGICでは、オープンされるファイルについてそれぞれ、行のユニークアイデンティファイアが必要で

す。Oracle 7の場合、通常、このユニークアイデンティファイアとして Oracle 7の ROWIDが使われます。

ただし、データビューが Oracleの複数のデータベーステーブルのカラムをもとに構成されているときには、

ROWIDはありません。したがって、ユニークインデックスを指定しなければなりません。このユニークイ

ンデックスは、仮想インデックスでもかまいません。

2相コミット

Oracleで、マルチ接続を使用して 2相コミットを行いたい場合、Oracleのデータベースリンク機能を使わな

ければなりません。

テーブルパラメータの指定

RDBMSが Oracleの場合、次のようなパラメータを指定できます。指定は、Oracleのテーブルの作成時、[テー

ブル特性]ダイアログで行えます。

TABLESPACE=...

INITRANS=...

MAXTRANS=...

PCTFREE=...

PCTUSED=...

CLUSTER=...

STORAGE=...

SQLガイド

dbMAGIC Ver.8.2

25.3 Oracle 25–5

Page 202: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

リモートサーバからの定義のロード

dbMAGICでは、リモートサーバ上にあるOracleデータベースを使用することもできます。このデータベー

スは、Oracleのデータベースリンク機能を使用してローカルホストに接続されます。ローカルホストでは、

シノニム(別名)を使用してデータベースを指定します。

リモートサーバ上のデータベースを使う場合、まず、サーバからデータベースの定義を読み込みます。その

後、dbMAGICの[テーブル]リポジトリでシノニムを指定します。指定は、次の手順で行います。

1. [テーブル]リポジトリの[データベース]欄に、リモートデータベースの名前を入力します。

2. [DBテーブル]欄に、リモートデータベースのテーブルまたはビューの名前を入力します。

3. dbMAGICの定義取得処理を実行します([定義取得]コマンド)。

4. データベース名をローカルのデータベース名に変更します。この名前には、リンクデータベースのシ

ノニムを使います。

SQL処理の遅延実行

Oracle 7では、SQLステートメントのステップを遅らせて実行することができます。この遅延実行により、

処理が高速になることがあります。ただし、クライアントのメモリが通常より消費されます。今回のバージョ

ンのゲートウェイでは、パラメータを使用して遅延実行の設定が可能になっています。NO DEFERというパ

ラメータで、デフォルトは NO DEFER=Nになっています。この設定の場合、遅延実行が有効になります。

なお、クライアントのメモリが少ないときには、NO DEFER=Yにしておきます。これで、遅延実行は行わ

れず、ステートメントのステップは通常どおり実行されます。

DBCOPY関数

コピー元のテーブルにインデックスがある場合には、インデックス名は「KEYnnn +コピー先テーブル名」

(nnn:インデックス番号)としてコピーされます。

25.4 MS-SQL Server

以下、データベースが MS-SQL Serverの場合、dbMAGICでサポートされている機能を説明します。

オプティマイザのヒント

MS-SQL Serverの場合、ヒント文字列を SELECTステートメントに追加できます。この文字列はハードコー

ド文字列で、フォーマットがチェックされることはありません。[インデックス特性]ダイアログの[SQL]

タブの[ヒント]欄で、ヒントとして「HOLDLOCK」を指定した場合、ゲートウェイにより次のようなコ

マンドが作成されます。

Select fld1 from table1 (HOLDLOCK) order by fld1 asc.

また、[インデックス特性]ダイアログの[ヒント]欄で「FORCEINDEX」を指定した場合、現在のイン

デックスに対してだけ、このヒントが有効になります。ヒントは、ほかのダイアログでも指定でき、たとえ

ば、[テーブル特性]ダイアログの[ヒント]欄で「FORCEINDEX」を指定すると、ヒントは、そのテーブ

ルに対して有効になります。さらに、[データベース特性]ダイアログの[ヒント]欄で「FORCEINDEX」

を指定すると、ヒントは、データベースに置かれているすべてのテーブルに対して有効になります。

[インデックス特性]ダイアログまたは[テーブル特性]ダイアログで、[ヒント]欄にヒントを指定したも

のの、そのヒントを使いたくないときには、[ヒント]欄の左側のボックスに「NO」を指定しておきます。

これで、インデックスまたはテーブルのインデックスには、ヒントは使われなくなります。

25–6 技術情報 SQLガイド

dbMAGIC Ver.8.2

Page 203: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

25

[ヒント]欄にヒントとして「FORCEINDEX」を指定した場合、ゲートウェイにより次のような処理が行

われます。

ゲートウェイにより生成された SELECTステートメントに、次のコマンドが追加されます。

"(INDEXインデックス名)"

上で、「インデックス名」は、dbMAGICのテーブルのインデックスの名前です。オプティマイザのヒントは、

必要なときに限って使うようにします。ヒントを使う場合、あらかじめ RDBMSのマニュアルをよくお読み

ください。

マルチ接続

MS-SQL Serverの場合、dbMAGICの単一のセッションで、複数のデータベースを使うことができます。デー

タベースが別々のサーバに置かれているときも同じです。複数のデータベースに接続する場合、MS-SQL

Serverゲートウェイにより、接続先のサーバとユーザについてそれぞれ接続が開かれます。サーバが同じで、

そのサーバに対して複数のユーザにより接続が要求されたときも、この処理が行われます。つまり、MS-SQL

Serverにより、ユーザごとに接続が開かれることになります。

ビュー

MS-SQL Serverでは、ビューには、仮想ユニークインデックスが定義されていなければなりません。ビュー

では、挿入、更新、削除処理が可能です。

MS-SQL Serverの場合、複数のビューに対して更新処理が可能です。なお、位置インデックスのいずれかの

セグメントが更新された場合、画面のレコードが一貫性に欠けることがあります。dbMAGIC上では、ビュー

は通常のテーブルと同じように扱われます。このため、dbMAGIC上でビューの名前を変更したり変換処理

を行わないようにしてください。こういった処理を行うと、エラーメッセージが表示され、また、処理は実

行されません。

ロック

MS-SQL Serverでは、明示的にテーブルロックを指定することはありません。つまり、dbMAGICの「共有

/なし」、「共有/読込」によって、MS-SQL Serverに対してテーブルロックを掛けることはありません。

従って、マルチユーザー環境においては、dbMAGICロックを [B=両方]に設定し、dbMAGICのロックファ

イルを共通にしてください。

DBコマンド

ゲートウェイでは、デフォルトでカーソルが使われます。dbMAGICのタスクで処理されるレコード数が多

いときには(たとえば、ファイルのスキャンを実行するバッチタスクなど)、このデフォルトの設定を変更

することもできます。変更するには、[テーブル特性]ダイアログの[カーソル]欄の値を「No」にします。

これで、カーソルの代わりに、ゲートウェイで DBコマンドが使われるようになります。なお、この場合、

結果セットごとに別個の接続が必要になります。このときの接続の最大数は、ユーザが指定できます。最大

接続数のデフォルト値は、「3」になっています。

単一のレコードまたはコマンドに関するコマンドで、そのコマンドで結果が取り出されないコマンド(たと

えば、更新など)については、ゲートウェイにより別個の接続が開かれます。また、結果が取り出されるコ

マンドについても、別の接続が開かれます。

SQLガイド

dbMAGIC Ver.8.2

25.4 MS-SQL Server 25–7

Page 204: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

一般的には、ゲートウェイで開かれる接続の数が増えると、クライアントの処理速度は上がります。ただし、

同時にクライアントで必要となるメモリが増え、また、サーバの処理速度は低下します。既存の接続がすべ

てコマンドにより使用されており、その状態で新規の接続が必要になった場合、LRUアルゴリズムにした

がって既存の接続が解放されます。この処理は、強制的に解放された接続に関連するコマンドが、結局は再

度、実行されるため、処理効率を著しく低下させることがあります。

なお、強制的に解放された接続に関連するコマンドが埋め込み SQLのバッチタスク(ストアドプロシージャ

または SELECTステートメント)の場合、その接続によりすべての結果が返ってはじめて、そのバッチタス

クが実行されます。また、埋め込み SQLのバッチタスクがネストのときには、接続の数が最大接続数を超え

ることがあり、その場合、次のようなエラーメッセージが出力されます。

MS-SQL Gateway: No more connections available. Try increasing Max Connections in the DBMS properties.

(接続の数が不足しています。[DBMS特性]ダイアログで最大接続数を増やしてください。)

上記のエラーメッセージが表示された場合、[DBMS特性]ダイアログで最大接続数を増やすか、アプリケー

ションを修正します。とくに、ネストの埋め込み SQLは避けるようにします。

ストアドプロシージャ

ストアドプロシージャには単一もしくは複数のパラメータを指定できます。複数指定する場合は、コンマで

パラメータを区切ります。ストアドプロシージャの本体が SELECTステートメントの場合、ストアドプロ

シージャは通常の SELECTステートメントと同じよう扱うことができます。つまり、[オプション/ APG]

コマンドまたは[APG]ボタンを使用して処理が可能です。ストアドプロシージャは、APGを使用して次の

操作が可能です。

■ ストアドプロシージャは、APGで起動できます。ストアドプロシージャに SELECTステートメント以

外のステートメントが定義されている場合、そのステートメントをコメント行にします。

■ dbMAGICからストアドプロシージャを呼び出す場合、入力パラメータは値でなければなりません。従っ

て、:1,:2などの数値型の入力パラメータは、一時的に任意の値を設定します。

■ 出力パラメータに出力されるのは、SELECTステートメントの結果です。OUTPUTパラメータを指定

したストアドプロシジャーの結果は取り込むことはできません。

注意:� �

ストアドプロシージャに定義されている SQLステートメントが複数の場合、最初の SQLステートメン

トだけが処理されます。その後、ゲートウェイにより、各データベースサーバについて別個の接続が開

かれます。この接続を使用して、サーバのストアドプロシージャを使用できます。� �

関連パラメータ

■ [テーブル特性]ダイアログの[SQL]タブの[カーソル]欄を「No」にしておくと、そのテーブル

にはカーソルは使われなくなります。代わりに、DBコマンドが使われます。

■ [DBMS特性]ダイアログの[最大接続数]欄を使用して、ゲートウェイで使われる接続の最大数を

指定できます。デフォルト値は「3」(プラス 1)です。「プラス 1」は、結果が取り出されないコマンド

(たとえば、更新など)、または、単一のレコードが取り出されるコマンド用の接続です。なお、この

最大接続数は、サーバとユーザ名の対が一つの接続となります。つまり、[設定/データベース]で定

義している各データベースについて、この最大接続数が有効になります。したがって、[設定/データ

ベース]で複数のデータベースを定義している場合、データベースそれぞれについて、サーバとユー

ザ名の対の数が最大接続数となります。

25–8 技術情報 SQLガイド

dbMAGIC Ver.8.2

Page 205: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

25

■ [データベース特性]ダイアログの[SQL]タブの[データベース情報]欄は新設されたパラメータ

で、書式は次のようになります。

SQLBLOB=n

「n」は数値で、上記の場合、テーブルに格納できる最大の BLOBデータのサイズ(単位バイト)を示

します。デフォルトは 65534バイトで、最大値は 2147483647バイトです。この「SQLBLOB」は、通

常、埋め込み SQLとデータの変換のときに使用します。具体的には、次の場合に使います。

・埋め込み SQLを使用して BLOB処理用のストアドプロシージャを実行する場合。

・結果データベースが Btrieveで、埋め込み SQLを使う場合。または、ファイルを Btrieveのデータ

に変換する場合。

25.5 ODBC

ODBCゲートウェイの場合、次のような機能がサポートされています。

ロック

ODBCでは、明示的なテーブルロック機能はありません。このため、dbMAGICの「共有/なし」、「共有/

読込」は機能しません。ロックは、SQLエンジンによって実行されます。

対応ODBCドライバ

ODBCゲートウェイ(ODBC用データベースゲートウェイ)は、基本的には、Ver2.0以上のどの ODBCド

ライバにも対応しています。ただし、ただし、SQL機能は、使用する ODBCドライバの使用に依存します。

トラブルシューティング

ODBCゲートウェイの使用中に問題が発生した場合、次の操作を行います。

ODBCドライバが正常に動作するかテストします。ODBCゲートウェイを介してデータにアクセスできるも

のの、ゲートウェイが正常に機能しないときは、Microsoft Queryなどのツールを使用して ODBCドライバ

をチェックします。Microsoft Queryでデータにアクセスできれば、ODBCドライバは正常にインストールさ

れていることになります。

ビュー

ビューには、仮想ユニークインデックスが定義されていなければなりません。ビューでは、挿入、更新、削

除処理が可能です。

dbMAGIC上では、ビューは通常のテーブルと同じように扱われます。このため、dbMAGIC上でビューの名

前を変更したり変換処理を行わないようにしてください。こういった処理を行うと、エラーメッセージが表

示され、また、処理は実行されません。

ドライバのチェック

ODBCドライバには、ドライバチェック用のプログラムが付属しています。このプログラムを使用して、ODBC

のデータソースをテストするとともに、ドライバでサポートされている機能の一覧を出力できます。また、

このテストで、ODBCドライバが dbMAGICの ODBCゲートウェイに対応しているかどうかが分かります。

デフォルト値

ODBCの場合、デフォルト値はありません。

SQLガイド

dbMAGIC Ver.8.2

25.5 ODBC 25–9

Page 206: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

これまで分かっている問題

■ Microsoft Accessのファイルで、フィールドの数が多い場合(おおよそ 227以上)、アクセスエラー(複

雑なクエリ)が発生します。

■ [型]欄の設定が「N=数値」で「書式」パラメータの値が「2」の場合、[カラム特性]ダイアログ

の[格納形式]タブの[記憶型式]欄をデフォルトの「Signed(符号付き)」から「Unsigned(符号な

し)」に変更してください。

■ カラム名またはテーブル名に、データソースまたは ODBCのキーワードを使わないようにしてくださ

い。キーワードは、ODBCゲートウェイのログで確認できます。

■ ODBC(データソース)では、ソートファイル、一時ファイル、アプリケーションファイルはサポート

されていません。

■ データのサイズや制約は、使用するデータベースにより決まります。

25.6 旧バージョンとdbMAGICバージョン 8でのフラグの扱い

以下は、dbMAGICバージョン 8で、特性ダイアログのパラメータとして内蔵されたフラグの一覧です。表

のフラグはいずれも、パラメータとして内蔵されたため、[データベース情報]欄に明示的に指定する必要

はありません。

ダイアログ パラメータ Oracle MS-SQL Server ODBCDBMS 最大接続数 SQL MAX SERVERCONNECTIONS

DBMS プランの出力 SQL SHOWPLAN

DBMS 分離レベル SQL ISOLATION LEVEL

データベース テーブルの存在チェック

SQL TAB EXIST

データベース ヒント SQL HINT

データベース 配列のサイズ

データベース 接続文字列 SQL CONNECT

テーブル テーブルの存在チェック

SQL TAB EXIST

テーブル タイプ SQL VIEW

テーブル オーナー SQL OWNER SQLOWNER SQLOWNER

テーブル ヒント SQL HINT SQL HINT

テーブル 配列のサイズ

インデックス クラスタ化インデックス

インデックス ヒント SQL HINT

インデックス インデックスの再作成

CONSTRAINT

インデックス DB インデックス名

DBPOS

インデックス オーナー

カラム タイプ SQL TYPE SQLTYPE SQLTYPE

カラム ユーザタイプ

25–10 技術情報 SQLガイド

dbMAGIC Ver.8.2

Page 207: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

25

以下のフラグは、従来どおり[データベース情報]欄に指定しなければなりません。

■ MS-SQL Server

・データベース関連パラメータ

MSDATEは、SQL DATETOALPHAに変更になりました。

■ Oracle

・データベース関連パラメータ

NO DEFER

・テーブル関連パラメータ

CLUSTER

INITRANS

MAXTRANS

PCTFREE

PCTUSED

STORAGE

TABLESPACE

SQLゲートウェイでサポートされている特性

ダイアログ パラメータ Oracle MS-SQL Server ODBC

DBMS ログレベル x x x

DBMS ログファイル名 x x x

DBMS ログ同期 x x x

DBMS テーブルの存在チェック x x x

DBMS 最大接続数 x

DBMS プランの出力 x

DBMS 分離レベル x

データベース テーブルの存在チェック x x x

データベース ヒント x

データベース 配列のサイズ x

データベース 接続文字列 x

テーブル テーブルの存在チェック x x x

テーブル タイプ x x x

テーブル 位置 x x x

テーブル オーナー名 x x x

テーブル ヒント x x

テーブル カーソル x

テーブル 配列のサイズ x x

インデックス クラスタ化インデックス x

インデックス ヒント x x

インデックス インデックスの再作成 x x x

インデックス オーナー名

カラム タイプ x x x

カラム ユーザタイプ x

SQLガイド

dbMAGIC Ver.8.2

25.6旧バージョンと dbMAGICバージョン 8でのフラグの扱い 25–11

Page 208: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

25–12 技術情報 SQLガイド

dbMAGIC Ver.8.2

Page 209: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

付録A SQLコマンドの基本構文章目次A.1 基本構文 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : A–2

Page 210: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第A章 SQLコマンドの基本構文

A.1 基本構文

ステートメント … SELECT

機能 … テーブルのデータの取り出し。

構文 … SELECTカラム名,カラム名,...

FROMテーブル 1エイリアス [ ,テーブル 2エイリアス,...]

[WHERE条件]

[GROUP BYカラム名 [,カラム名,...] ]

[HAVING 条件]

[ORDER BYカラム 1 [ASC / DESC] [,カラム 2 [ASC / DESC] ,...] ]

ステートメント … INSERT

機能 … データベースへの新規の行の追加。

構文 … INSERT INTOテーブル名 [(カラム 1,カラム 2,...)]

VALUES (値 1,値 2,...)

[SELECTステートメント]

ステートメント … DELETE

機能 … データベースの行の削除。

構文 … DELETE FROMテーブル名

[WHERE条件]

ステートメント … UPDATE

機能 … データベースの既存のデータの変更。

構文 … UPDATEテーブル名

SETカラム 1 =値 1,カラム 2 =値 2...

[WHERE条件]

ステートメント … CREATE TABLE

機能 … データベースへの新規のテーブルの追加。

構文 … CREATE TABLEテーブル名 (カラム 1データ型,カラム 2データ型,...)

A–2 SQLコマンドの基本構文 SQLガイド

dbMAGIC Ver.8.2

Page 211: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

Aステートメント … ALTER TABLE

機能 … 既存のテーブルの構造の変更。

構文 … ALTER TABLEテーブル名 ADD カラム名カラム定義

DELETE

MODIFY

ステートメント … CREATE VIEW

機能 … データベースへの新規のビューの追加。

構文 … CREATE VIEWビュー名 [(カラム定義)]

AS SELECT SQLステートメント

ステートメント … CREATE INDEX

機能 … カラムのインデックスの作成。

構文 … CREATE [UNIQUE] INDEXインデックス名

ONテーブル名 (カラム名 [DESC],...)

SQLガイド

dbMAGIC Ver.8.2

A.1基本構文 A–3

Page 212: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

A–4 SQLコマンドの基本構文 SQLガイド

dbMAGIC Ver.8.2

Page 213: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

��

付録B データベースのデータの例章目次B.1 製品 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : B–2

B.2 仕入先 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : B–2

B.3 在庫 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : B–2

B.4 営業所 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : B–2

B.5 部門 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : B–2

B.6 社員情報 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : B–3

Page 214: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

第B章 データベースのデータの例

B.1 製品

製品番号 製品名

1 ボルト

2 ナット

3 ネジ

4 クギ

B.2 仕入先

仕入先番号 仕入先会社名 住所

10 アクメ ボストン

20 ブラウン ダラス

30 セントラル シカゴ

B.3 在庫

仕入先番号 製品番号 数量 日付

10 1 10

10 2 20

20 2 16

30 3 20

B.4 営業所

市 担当者番号 目標 売上 地区

シカゴ 3 750,000 750,042 東部

ロサンジェルス 4 800,000 835,915 西部

ニューヨーク 4 700,000 692,637 東部

アトランタ 2 350,000 367,911 東部

デンバー 1 200,000 186,042 西部

B.5 部門

部門番号 部門 所在地

10 経理 ロサンジェルス

20 マーケティング サンフランシスコ

30 総務 ノーフォーク

40 営業 ニューヨーク

50 リサーチ バークレー

B–2 データベースのデータの例 SQLガイド

dbMAGIC Ver.8.2

Page 215: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

B

B.6 社員情報

社員

番号

名前 職種 マネージャ 入社日 給料 コミッ

ション

年齢 部門

番号

3567 アレン 営業 3970 15-Apr-85 4300 2000 33 40

3891 ジョージ 営業 3970 01-Jan-94 4400 3000 32 40

3092 ターンブル 営業 3970 15-Jun-93 4050 5050 40 40

3667 マークソン 事務 3373 17-Oct-90 3000 27 30

3559 ジョーダン アナリスト 3408 03-May-89 4250 30 50

3123 ウオーカー 社長. 13-Mar-8 5500 40 10

3472 メイジャー マネージャ 3123 13-Mar-8 4750 43 10

3373 クレイン アナリスト 3408 02-Feb-93 3900 41 50

3162 バートン マネージャ 3123 02-Dec-87 4200 35 20

3408 エイデン マネージャ 3123 04-Aug-89 4700 33 50

3582 アントン 事務 3162 22-Jan-92 3500 42 20

3115 カーライル 事務 3162 15-Mar-93 3375 22 10

3012 ボンフィーリオ アナリスト 3408 27-Jul-91 4175 42 50

3970 オニール マネージャ 3123 15-May-94 4850 43 40

SQLガイド

dbMAGIC Ver.8.2

B.6社員情報 B–3

Page 216: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

B–4 データベースのデータの例 SQLガイド

dbMAGIC Ver.8.2

Page 217: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect

dbMAGIC Ver.8.2 SQLガイド

c 1999,Magic Software Japan K.K.

第1版 1999年 2月 5日 第3版 1999年 7月 16日

発 行 〒 151-0053 東京都渋谷区代々木三丁目二十五番地三号 大東京火災新宿ビル 14階

Page 218: dbMAGIC Ver8.2 SQLガイド - magicsoftware.co.jp · 7.4 group by 句-グループ化して結果を出力: 7–6 7.5 having 句-グループ検索条件: 7–7 7.6 ネストされたselect