Sybaseのデータベース互換性の問題
SybaseデータベースとOracleデータベースは、一部の領域で機能が異なるため、互換性の問題が発生します。
連鎖モード
ゲートウェイは、ANSI標準のチェーン・モードをサポートしています。
このモードでは、Sybaseストアド・プロシージャを記述する必要があります。 チェーン・モードで実行すると、ゲートウェイはOracleおよびSybaseデータベースを更新するトランザクションにOracleの2フェーズ・コミット保護を拡張できます。
列の定義
デフォルトでは、列定義にNULLが指定されていないかぎり、Sybase表の列にNULL値を含めることはできません。
ANSI標準に準拠して、デフォルトの列定義をNULLに変更するには、Sybaseデータベース・オプション"allow nulls by default"をtrueに設定できます。
Oracle表の場合、列定義でNOT NULLが指定されていないかぎり、列にNULL値を使用できます。
命名規則
次のトピックでは、命名規則の問題について説明します。
オブジェクトのネーミング規則
OracleとSybaseでは、異なるデータベース・オブジェクトの命名規則が使用されます。
たとえば、各オブジェクト名に使用できる最大文字数は異なる場合があります。 また、一重引用符と二重引用符、大/小文字の区別、および英数字の使用はすべて異なる場合があります。
関連項目:
「Oracle Databaseリファレンス」およびSybaseのドキュメント。大文字と小文字の区別
識別子を二重引用符で囲む場合を除き、Oracleデータベースはデフォルトで大文字になります。
たとえば、empというSybase表を参照するには、次のように二重引用符で名前を入力します:
SQL> SELECT * FROM "emp"@SYBS;
ただし、OracleアプリケーションからSCOTTが所有するempというSybase表を参照するには、次のように入力します:
SQL> SELECT * FROM "Scott"."emp"@SYBS;
empというSybase表がSCOTT(表所有者名は大文字)によって所有されている場合、次のように、二重引用符文字なしで所有者名を入力できます:
SQL> SELECT * FROM SCOTT."emp"@SYBS;
または
SQL> SELECT * FROM scott."emp"@SYBS;
Oracleでは、すべてのSybaseオブジェクト名を二重引用符で囲み、Sybaseデータ・ディクショナリに表示されるオブジェクト名に正確な大文字と小文字を使用することをお薦めします。 「データ・ディクショナリ」にリストされている、サポートされているOracleデータ・ディクショナリ表またはビューを参照する場合は、この規則は必要ありません。
これらの規則に従って既存のアプリケーションを変更できない場合は、Oracleでビューを作成し、Sybase名を正しい大文字と小文字に関連付けます。 たとえば、大文字の名前のみを使用して既存のOracleアプリケーションからSybase表empを参照するには、次のビューを定義します:
SQL> CREATE VIEW EMP (EMPNO, ENAME, SAL, HIREDATE)
AS SELECT "empno", "ename", "sal", "hiredate"
FROM "emp"@SYBS;
このビューを使用すると、アプリケーションは次のような文を発行できます:
SQL> SELECT EMPNO, ENAME FROM EMP;
ビューの使用は、Sybaseデータ・ディクショナリで発生したデータ・ディクショナリ情報を複製する回避策です。 Sybaseデータベースで対応する表のデータ定義が変更されるたびに、Oracleビュー定義を更新する準備をしておく必要があります。
データ型
次の各トピックでは、データ型の問題について説明します。
バイナリリテラル表記法
Oracle SQLでは、一重引用符で囲まれた16進数を使用して、データ型RAWとして定義されている列に比較または挿入されるリテラル値を表します。
この表記法は、SybaseのVARBINARYおよびBINARYデータ型と互換性のある構文には変換されません(0xの後に16進数、一重引用符で囲みます)。
たとえば、次の文はサポートされていません。
SQL> INSERT INTO BINARY_TAB@SYBS VALUES ('0xff')
ここで、BINARY_TABには、VARBINARYまたはBINARYデータ型の列が含まれます。 VARBINARYおよびBINARYデータ型への挿入または更新時にバインド変数を使用します。
データ型変換
Sybaseは暗黙的な日付変換をサポートしていません。 このような変換は明示的である必要があります。
たとえば、ゲートウェイは次のSELECT文に対してエラーを発行します:
SELECT DATE_COL FROM TEST@SYBS WHERE DATE_COL = "1-JAN-2001";
暗黙的な変換の問題を回避するには、次のように明示的な変換を追加します:
SELECT DATE_COL FROM TEST@SYBS WHERE DATE_COL = TO_DATE("1-JAN-2001")
関連項目:
データ型の制限の詳細は、「データ型変換」を参照してください。問合せ
次のトピックでは、問合せの問題について説明します。
行選択
Sybaseは、選択したすべての行の問合せ条件を評価してから、いずれかの行を返します。
1つ以上の行の評価プロセスでエラーが発生した場合、残りの行が条件を満たしていても、行は返されません。
Oracleは、問合せ条件の行ごとに評価し、評価が成功すると行を返します。 行は、行が評価に失敗するまで返されます。
空の文字列
Oracleは、SQL文の空の文字列をNULL値として処理します。 Sybaseは空の文字列を空の文字列として処理します。
空の文字列を比較する場合、ゲートウェイはリテラル空の文字列を変換せずにSybaseデータベースに渡します。 空の文字列でNULL値を表す場合は、Sybaseはそのように文を処理せず、空の文字列を使用します。
この問題を回避するには、次の例のように、空の文字列構文ではなくSQL文でNULLまたは IS NULLを使用します:
SELECT * from "emp"@SYBS where "ename" IS NULL;
空の文字列の選択
VARCHAR列の場合、ゲートウェイは空の文字列をNULL値としてOracleデータベースに返します。
CHAR列の場合、ゲートウェイは列のフル・サイズを戻し、各文字を空白(')として返します。
ロック
Sybaseデータベースのロック・モデルは、Oracleモデルと大きく異なります。
ゲートウェイは基礎となるSybaseの動作に依存するため、ゲートウェイを介してSybaseにアクセスするOracle applicationsは、次のシナリオの影響を受ける可能性があります:
- 読取りアクセス権によって書込み権限がブロックされる場合があります
- 書き込みアクセスが読み取りアクセスをブロックする可能性がある
- 文レベルの読取り一貫性は保証されません
関連項目:
Sybaseロック・モデルの詳細は、Sybaseのドキュメントを参照してください。
Sybase識別子の長さ制限
デフォルトでは、ゲートウェイは常に識別子を引用します。 ただし、特定のSybaseリリースでは、表名や列名などの識別子に対して30文字の制限があり、この制限に対してチェックする場合、引用符は名前の一部とみなされます。
したがって、引用符を使用する場合は、28文字のみを指定できます。 Sybaseリリースの最大長制限をサポートするには、ゲートウェイ初期化パラメータ・ファイルでHS_FDS_QUOTE_IDENTIFIER=FALSEを指定する必要があります。 この初期化パラメータを設定すると、ゲートウェイは識別子を引用符なしで送信します。 ただし、ドット(.)またはスペースを含む識別子の使用を禁止する副作用があり、識別子は使用されるSybaseデータベースの大文字と小文字の区別に従います。