0

我有一个程序,它的数据库必须同时支持 Oracle 和 SQL Server。在某些时候,我必须执行一个查询,我想在 select 语句中连接 2 列。

在 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 函数不会使查询与 Oracle 兼容,因为 SQL Server 要求在调用函数时指定所有者:

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

在 SQL Server 中创建自己的 concat 函数后,我花了一段时间才弄清楚。

另一方面,看起来 Oracle 中的一个函数SYS_REFCURSOR不能用简单的方法调用

exec myfunction

并像在 SQL Server 中一样返回表。

最后,解决方案是在两个 RDBM 上创建一个名称相同但实现不同的视图,然后我可以select在视图上做一个简单的操作。

4

4 回答 4

2

如果您想沿着创建存储过程的路径前进,那么您使用的任何框架都应该能够或多或少透明地处理带有OUT参数的 Oracle 存储过程,SYS_REFCURSOR并像 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;

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

于 2012-04-04T22:46:59.233 回答
1

不,谢谢。

正如您所注意到的,字符串连接是在 SQL-Server+和 Oracle 中实现的concator ||

我会避免在存储过程中进行一些讨厌的字符串操作,而只需在一个实例中创建自己的连接函数,或者在另一个使用相同语法的实例中创建连接函数。可能是 SQL-Server,因此您可以使用concat.

另一种方法是通过+||取决于您连接到的 RDBMS。

于 2012-04-04T22:48:49.940 回答
1

显然,在 SQL Server 2012 中,它们包含了一个 CONCAT() 函数:

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

于 2012-04-04T22:49:42.653 回答
1

如果您尝试创建与数据库无关的应用程序,您应该坚持

  1. 坚持使用非常基本的 SQL 并在您的应用程序中执行类似的操作。

  2. 为不同的数据库创建不同的抽象。如果您希望从您的应用程序中获得任何类型的扩展,那么这就是您可能需要采取的途径。

    我不会走存储过程路径,你可能可以让它工作,但是一周你会发现你需要支持“数据库 X”,然后你需要在那个数据库中重写你的存储过程为出色地。它是痛苦的秘诀。

于 2012-04-04T22:52:39.037 回答