2012-04-04 42 views
0

我有一個程序必須支持Oracle和SQL Server的數據庫。 在某些時候,我必須執行一個查詢,我想在select語句中連接兩列。具有相同未修改查詢的SQL Server和Oracle中的Concat字符串

在SQL Server中,這是用+操作

select column1 + ' - ' + column2 from mytable 

和Oracle這樣做與CONCAT做

select concat(concat(column1, ' - '), column2) from mytable 

我正在尋找一種方式來充分利用他們兩個,所以我代碼有兩個數據庫的單個SQL查詢文字字符串,我可以避免醜陋的構造,我需要檢查我連接的DBMS。我的第一本能是將不同的查詢封裝到一個存儲過程中,因此每個DBMS都可以擁有它們自己的查詢實現,但是我無法在Oracle中創建返回記錄集的過程,方式與SQL Server的確。

更新:創建SQL Server中的concat函數,因爲SQL Server要求業主在調用函數時,以指定不與Oracle兼容的查詢:

select dbo.concat(dbo.concat(column1), ' - '), column2) from mytable 

我花了一段時間來在SQL Server中創建自己的concat函數後找出它。

在另一方面,看起來像在Oracle中SYS_REFCURSOR功能不能用一個簡單的

exec myfunction 

被調用,返回表中的SQL Server。

最後,解決方案是在兩個RDBM上創建一個名稱相同但視圖不同的視圖,然後我可以在視圖上執行一個簡單的select

回答

2

如果你想要創建一個存儲過程的路徑,你使用的任何框架應該能夠或多或少透明地處理一個OUT參數爲SYS_REFCURSOR的Oracle存儲過程,然後像你一樣調用它SQL Server存儲過程只會執行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; 

或者,您可以在SQL Server中定義自己的CONCAT函數。

+0

我試了兩個,但都不讓我在編譯的代碼中保留相同的常量字面值SQL字符串。最後我發現的解決方案是創建一個視圖。 – Correa 2012-04-05 05:16:56

1

不,對不起。

正如您所注意到的,字符串concoudaion是在SQL-Server中用+和Oracle用concat||實現的。

我會避免在存儲過程中做一些討厭的字符串操作,並簡單地在一個實例中創建自己的連接函數,或者使用相同的語法創建自己的連接函數。可能是SQL-Server,所以你可以使用concat

另一種方法是通過+||,具體取決於您連接的RDBMS。

1

如果你想創建一個數據庫無關的應用程序,你應該堅持要麼

  1. 棒到非常基本的SQL,並在你的應用程序中做這樣的事情。
  2. 創建不同的數據庫不同的抽象。如果你希望得到任何形式的規模您的應用程序,這是你可能需要採取的路徑。

    我不會下去的存儲過程的路徑,你也許可以得到它的工作,但卻星期,你會發現你需要支持「數據庫X」,那麼你需要重寫你的存儲過程在那個數據庫中也是如此。它是一個痛苦的祕訣。

相關問題