C++ SQL Server和Oracle中具有相同未修改查询的Concat字符串
我有一个程序,必须支持Oracle和SQL Server的数据库。 在某个时刻,我必须执行一个查询,其中我希望在select语句中连接两列 在SQL Server中,这是通过+运算符完成的C++ SQL Server和Oracle中具有相同未修改查询的Concat字符串,c++,sql-server,oracle,qt,C++,Sql Server,Oracle,Qt,我有一个程序,必须支持Oracle和SQL Server的数据库。 在某个时刻,我必须执行一个查询,其中我希望在select语句中连接两列 在SQL Server中,这是通过+运算符完成的 select column1 + ' - ' + column2 from mytable 甲骨文这是用concat完成的 select concat(concat(column1, ' - '), column2) from mytable 我正在寻找一种方法来利用这两个数据库,因此我的代码对这两个数据
select column1 + ' - ' + column2 from mytable
甲骨文这是用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\u REFCURSOR
的函数,不能用简单的
exec myfunction
并返回SQL Server中的表
最后,解决方案是在两个RDBMs上创建一个名称相同但实现不同的视图,然后我可以在视图上执行一个简单的
select
。如果您想继续创建存储过程,无论您使用什么框架,都应该能够或多或少透明地处理带有OUT
参数的Oracle存储过程,该参数是SYS\u REFCURSOR
,并将其调用为只执行SELECT
语句的SQL Server存储过程
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
函数。如果要继续创建存储过程,无论您使用什么框架,都应该能够或多或少透明地处理带有OUT
参数的Oracle存储过程,该参数是SYS\u REFCURSOR
,并将其调用为只执行SELECT
语句的SQL Server存储过程
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
函数。不,对不起
正如您所注意到的,字符串连接是在SQL Server中通过+
和Oracle中通过concat
或|
实现的
我将避免在存储过程中进行一些讨厌的字符串操作,而只需在一个或另一个使用相同语法的实例中创建您自己的连接函数。可能是SQL Server,因此您可以使用concat
另一种选择是通过+
或|
,具体取决于您连接到的RDBMS。不,对不起
正如您所注意到的,字符串连接是在SQL Server中通过+
和Oracle中通过concat
或|
实现的
我将避免在存储过程中进行一些讨厌的字符串操作,而只需在一个或另一个使用相同语法的实例中创建您自己的连接函数。可能是SQL Server,因此您可以使用concat
另一种方法是根据您连接到的RDBMS传递
+
或|
。显然,在SQL Server 2012中,它们包含了一个CONCAT()函数:
显然,在SQL Server 2012中,它们包含了一个CONCAT()函数:
如果您试图创建一个与数据库无关的应用程序,您应该坚持以下两种方法之一
如果您试图创建一个与数据库无关的应用程序,那么您应该坚持以下两种方法之一
我尝试了这两种方法,但都不允许在编译代码中保留相同的常量文本SQL字符串。最后,我找到的解决方案是创建一个视图。我尝试了这两种方法,但都不允许我在编译的代码中保留相同的常量文本SQL字符串。最后,我找到的解决方案是创建一个视图。