0

データベースで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に実行できます。

4

4 に答える 4

2

OUTストアドプロシージャを作成する方法をたどりたい場合は、使用しているフレームワークが、SQL Serverのストアドプロシージャと同じように、パラメータを使用してOracleストアドプロシージャを多かれ少なかれ透過的に処理し、SYS_REFCURSORそれを呼び出すことができる必要があります。それはただSELECTステートメントをします。

CREATE OR REPLACE PROCEDURE some_procedure( p_rc OUT sys_refcursor )
AS
BEGIN
  -- You could use the CONCAT function rather than Oracle's string concatenation
  -- operator || but I would prefer the double pipes.
  OPEN p_rc
   FOR SELECT column1 || ' - ' || column2
         FROM myTable;
END;

CONCATまたは、SQLServerで独自の関数を定義することもできます。

于 2012-04-04T22:46:59.233 に答える
1

いいえ、ごめんなさい。

お気づきのとおり、文字列の連結はSQL-Serverで実装され+、Oracleではconcatまたはで実装されます||

ストアドプロシージャで厄介な文字列操作を行うことを避け、同じ構文を使用するインスタンスまたは別のインスタンスで独自の連結関数を作成するだけです。おそらくSQL-Serverなので、を使用できますconcat

別の方法は、接続するRDBMSに合格+するか、それに応じて変更することです。||

于 2012-04-04T22:48:49.940 に答える
1

どうやらSQLServer2012には、CONCAT()関数が含まれているようです。

http://msdn.microsoft.com/en-us/library/hh231515.aspx

于 2012-04-04T22:49:42.653 に答える
1

データベースに依存しないアプリケーションを作成しようとしている場合は、どちらかに固執する必要があります

  1. 非常に基本的なSQLに固執し、アプリケーションでこのようなことを行います。

  2. データベースごとに異なる抽象化を作成します。アプリケーションから何らかのスケールアウトを取得したい場合は、これがおそらく必要なパスです。

    ストアドプロシージャのパスをたどることはありません。おそらく動作させることができますが、1週間で「データベースX」をサポートする必要があることがわかり、そのデータベースにストアドプロシージャを次のように書き直す必要があります。良い。その痛みのレシピ。

于 2012-04-04T22:52:39.037 に答える