c++ - 使用相同的未修改查询连接 SQL Server 和 Oracle 中的字符串

标签 c++ sql-server oracle qt

我有一个程序,它的数据库必须同时支持 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/

相关文章:

c++ - 关闭表单后启用按钮

c++ - 我是否需要在我的 for 循环中使用小于 (<) 运算符来进行自动矢量化?

sql-server - 恢复备份前的尾部日志备份消息警告

oracle - 我可以用来防止行被插入到 Oracle 表中的侵入性最小的锁定机制是什么?

django 多数据库路由不适用于多个模式

java - Oracle 嵌套表作为 Mybatis 存储过程的输入参数

c++ - 在 openmp 中,omp_get_thread_num 是否绑定(bind)到物理线程?

c++ - 为什么此代码会出现 'expression syntax' 错误?

java - EclipseLink Native API 无法与 SQLserver 一起使用

sql-server - SQL Server 中奇怪的比较结果