データベースの互換性に関する問題
モジュールのプロパティでDBMSの型が[(all)
]に設定されると、クエリにはOutSystemsがサポートするすべてのデータベースサーバーと互換性があることが求められます。
互換性に関する問題に関心がない場合は、ご利用のデータベースサーバーに固有のSQL文を使用できます。
Dualテーブルの使用
Oracleデータベースでは、スカラー値を計算している場合でも、すべてのSELECT文にFROM
句が必要です。
この場合、開発者はクエリのFROM
句でDual
テーブルを使用します。Varchar2データ型のDummy
という名前の単独の列を備えたDual
テーブルがOracleデータベースによって自動的に作成されます。そこには値「X」を持つ単独の行があります。
Dual
テーブルを使用するクエリの互換性を保証するために、OutSystemsはサポートされているすべてのデータベースにOracleデータベースと同じ定義でDual
テーブルを作成します。
すべてのDBMS対応 | SQL Server | Oracle |
---|---|---|
SELECT 2 + 2 FROM Dual | SELECT 2 + 2 | SELECT 2 + 2 FROM Dual |
getdate()関数の使用
SQL ServerとMySQLでは、データベースサーバーの時計に基づいて現在の日付と時刻を返す関数が使用できるようになります。Oracleとの互換性を保証するために、OutSystemsには独自のgetdate()
が用意されています。このため、ご利用データベースの種類とは関係なく、この関数をクエリで使用できます。
以下のテーブルは、この関数の使用方法を示しています。
すべてのDBMS対応 | SQL Server | Oracle |
---|---|---|
SELECT getdate() FROM Dual |
SELECT getdate() | SELECT sysdate FROM Dual |
このクエリの結果は日付時刻として処理できるため、書式設定ビルトイン関数を使用して結果を書式設定できます。
クエリ条件での空の文字列の使用
データベースでテキストの比較を実行する際、Oracle DBMSで空の文字列を表す方法が原因で、空のテキスト行を含むレコードを取得する場合は、スペース1個を引用符で囲んで使用する必要があります。
以下のテーブルは、サポートされているデータベースで空の文字列を含むクエリを設計する方法の例を示しています。
すべてのDBMS対応 | SQL Server | Oracle | MySQL |
---|---|---|---|
SELECT {User}.* FROM {User} WHERE {User}.Username = '<single space>' |
SELECT {User}.* FROM {User} WHERE {User}.Username = '' |
SELECT {User}.* FROM {User} WHERE {User}.Username = '<single space>' |
SELECT {User}.* FROM {User} WHERE {User}.Username = '' |
テキストアトリビュートの外部キーは、参照が存在する場合はテキスト値とともに保存され、別のエンティティの行への参照が存在しない場合はNULLとして保存されます。ご注意ください。
プロセスとWebサービスの処理
OracleまたはDB2データベースを使用する際は、Read Committed分離レベルで作業を行います。つまり、トランザクション内でまだコミットされていないデータは読み取ることができません。このため、プロセスインスタンスまたは利用しているWebサービスのメソッドを呼び出す際は、エンティティレコードに対して行われた変更は、呼び出し前にデータベーストランザクションをコミットした場合にのみプロセスまたはメソッドで有効になります。詳細については、「トランザクションの処理」をご覧ください。
ラージテキストオブジェクトでの大文字/小文字とアクセントの区別をしない検索
Oracleに固有の大文字/小文字とアクセントの区別をしないクエリ機能は、LOB(ラージテキストオブジェクト)では機能しません。詳細については、OracleのWebページ「Working with LOBs」の「Restrictions for LOB Operations」セクションをご覧ください。
文字数が2,000文字以上のテキストの等値演算子
文字数が2,000文字以上のText型変数は、CLOBとしてOracleに実装されます。このデータベースシステムでは、CLOB値を比較するために「=」演算子を使用できません。Aggregateや高度なクエリで「like」演算子に置き換えます。
このような状況になった際にすべてのクエリを置き換えなくても済むようにするには、テキストを操作しているときは常に「like」演算子を使用します。