データベースでOracleとSQLServerの両方をサポートする必要のあるプログラムがあります。ある時点で、selectステートメントの2つの列を連結するクエリを実行する必要があります。
SQL Serverでは、これは+演算子を使用して行われます
select column1 + ' - ' + column2 from mytable
そして、オラクルこれはconcatで行われます
select concat(concat(column1, ' - '), column2) from mytable
両方を活用する方法を探しているので、コードには両方のデータベースに対して単一のSQLクエリリテラル文字列があり、接続しているDBMSを確認する必要がある醜い構造を回避できます。
私の最初の本能は、さまざまなクエリをストアドプロシージャにカプセル化して、各DBMSがクエリの独自の実装を持つことができるようにすることでしたが、SQLServerと同じ方法でレコードセットを返すプロシージャをOracleで作成できませんでした。
更新:SQL Serverでconcat関数を作成しても、クエリはOracleと互換性がありません。これは、SQL Serverでは、関数を次のように呼び出すときに所有者を指定する必要があるためです。
select dbo.concat(dbo.concat(column1), ' - '), column2) from mytable
SQL Serverで独自のconcat関数を作成した後、それを理解するのに少し時間がかかりました。
一方、Oracleの関数はSYS_REFCURSOR
単純なものでは呼び出せないように見えます
exec myfunction
そして、SQLServerのようにテーブルを返します。
結局のところ、解決策は、両方のRDBMで同じ名前で、実装が異なるビューを作成することでした。そうすれば、ビューで簡単select
に実行できます。