Oracle Serverにおけるカーソルには、1行だけの結果を扱う「暗黙カーソル」と複数行の結果を扱うことができる「明示カーソル」の2種類があります。暗黙カーソルは、カーソル名の宣言を行うことなく使用できるもので、明示カーソルは、宣言部でカーソル名とSELECT文を対応づける必要があります。 一方、SQL Serverにおけるカーソルは、Oracle Serverの明示カーソルに該当するものだけがあります。Oracle ServerとSQL Serverのカーソルの機能の違いで目立ったものは、SQL Serverのカーソルはオープン時にカーソル引数が使えないこと、そしてフェッチの方向が自由に設定できることです。SQL Serverの場合は、順方向フェッチ、逆方向フェッチなど、さまざまなフェッチの方法があります。 ☆さらに詳細はこちら→
Oracle では、リレーショナルデータベースを操作するための対話式の言語であるSQLと、SQLを拡張したプログラミング言語「PL/SQL」を区別しています。 SQL Serverでは特に区別はなく、SQL Serverで実行するSQLステートメントをすべて「Transact-SQL」と呼びます。 PL/SQLは「PL/SQLブロック」単位で関連する処理をグループ化し、1度に送信して実行します。一方、Transact-SQLではSQL Serverに1度に送信する単位は「バッチ」と呼び、キーワード「GO」で終了します。そのバッチの中に、BEGIN…ENDで囲み複数のステートメントをまとめた「ステートメントブロック」を含めることができます。また、宣言部や例外処理部のようにブロックで記述するという考え方はありませんが、変数宣言やエラー処理はプログラムで書くことができます。
Oracle Serverで使用できる関数には、システムで提供されている単一行関数やグループ関数と、PL/SQLで作成できるユーザー定義関数(ファンクション)があります。以下、左側「Oracle Server」:右側「SQL Server」の対応で、カッコ内はそれぞれの説明です。 ・「単一行関数」:「スカラー関数」 (1行に対して1つの結果を返します) ・「グループ関数」:「集合関数」 (行のグループに対して1つの結果を返します) ・「ユーザー定義関数」:「ユーザー定義関数」 (ユーザーが独自に作成できる関数です) ・「なし」:「行セット関数」 (SQLステートメントのFROM句でテーブル参照の代わりに使用できます) Oracle ServerとSQL Serverで、同じ名前の関数や似たような関数も多くあります。しかし、たとえばSQL ServerではROUNDの第2引数は必須など、同じ名前でも使い方が違う場合もあるので注意が必要です。
Oracleで使用しているデータ型は、SQL Serverと比べてかなりシンプルな構成になっています。たとえば、数値を表す型は「NUMBER型」だけであり、NUMBER型の指定の仕方で整数、少数点以下を扱うもの、浮動小数点扱いになるもの、といった具合に変化します。それに対して、SQL Serverでは1から255までの整数は「tinyint型」、-32768から32767までの整数は「smallint」といったように、扱う数値に応じて型そのものが違ってきます。 どちらの製品も数値、文字、日付、バイナリなど扱うデータの種類自体は大きな差はありませんが、型名などにかなり違いがあります。Oracle ServerからSQL Serverへ移行する場合は、そのまま移行できるものもあれば、何らかの変更が必要なものもあります。SQL Server「のDTSエクスポート/インポートツール」を使うと、CREATE TABLE文を自動生成するので、どのような型に変換されたか確認することができます。
PL/SQLでは、エラーがあった場合に備えて「EXCEPTIONブロック」を作成します。BEGIN〜ENDで例外が発生すると、自動的にEXCEPTIONブロックに制御が移る仕組みになっています。 Transact-SQLには、エラー時に自動的にエラー処理部に制御が移る仕組みはありません。エラー時にはそのまま処理が進む場合と、強制終了になる場合があります。強制終了はファイルが一杯などの主にリソースが使用できない場合に発生しますので、管理を徹底することで防ぐことが可能です。通常のエラー処理では、エラーの発生しそうなステートメントの後にIF文を入れ、@@ERROR関数を使用して「直前のステートメントにエラーが発生したか」を判断します。 IF文の中には、ROLLBACKなど必要なエラー対応処理を記述します。
PL/SQLでコメントを記述する場合、行内コメント(インラインコメント)は「--(ハイフン2つ)」で表し、複数行にまたがるブロックコメントは「/*」と「*/」で囲みます。これらはTransact-SQLでも同様です。コメントにする場合の注意として、Transact-SQLではブロックコメントの中に「GO」コマンドを入れないようにします。GOコマンドはクエリアナライザやOSQLなどのツール用のコマンドで、バッチ(まとめてSQL Serverに送られ、コンパイル、実行される単位)を区切るためのものです。このGOコマンドがブロックコメントの中にある場合、GOだけが正常に動作してしまい、/*と*/が別々にSQL Serverに送られます。その結果「/*」記号がコメントと判断されずにエラーになってしまうのです。これを避けるためには、ブロックコメントの中のGOをインラインコメントします。