我有一个程序,它的数据库必须同时支持 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 相同的方式返回记录集的过程服务器。
更新:在 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 上创建一个名称相同但实现不同的 View ,然后我可以在 View 上执行简单的select
。
最佳答案
如果您想继续创建存储过程,无论您使用的是什么框架,都应该能够或多或少地透明地处理带有 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;
或者,您可以在 SQL Server 中定义自己的 CONCAT
函数。
关于c++ - 使用相同的未修改查询连接 SQL Server 和 Oracle 中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10020284/