将 SQL Server 存储过程转换为 Oracle 过程以从表中查询

     2023-03-29     136

关键词:

【中文标题】将 SQL Server 存储过程转换为 Oracle 过程以从表中查询【英文标题】:Convert SQL Server stored procedure to Oracle procedure to query from tables 【发布时间】:2015-11-30 22:55:09 【问题描述】:

我正在尝试从 SQL Server 迁移到 Oracle 数据库。我必须将我的存储过程从 SQL Server 移动到 Oracle,它使用 INNER JOIN 从多个表中进行查询。我想在这里澄清几件事。

SQL Server 存储过程:

[dbo].[QueryAll] 
    @score1_min int = 0,
    @score1_max int = 999,  
    @type1 varchar (1) = '%',
AS
BEGIN
    SET NOCOUNT ON;

    SELECT * 
    FROM FUNIJ1 uni
    INNER JOIN CAPI99 api99 on api99.application_id = uni.application_id
    INNER JOIN CAPI41 api41 on api41.application_id = uni.application_id
    INNER JOIN CAPI10 api10 on api10.application_id = uni.application_id
    WHERE 
        api10.score1 BETWEEN @score1_min AND @score1_max 
        AND uni.type1 LIKE @type1
END

还有我的 Oracle 程序

create or replace PROCEDURE QUERYALL 
(
  SCORE1_MIN IN NUMBER DEFAULT 0 
, SCORE1_MAX IN NUMBER DEFAULT 999 
, TYPE IN VARCHAR2 
) 
AS 
BEGIN
    SELECT *
    FROM FUNIJ1 uni
    INNER JOIN CAPI99 on CAPI99.APPLICATION_ID = uni.APPLICATION_ID
    INNER JOIN CAPI41 on CAPI41.APPLICATION_ID = uni.APPLICATION_ID
    INNER JOIN CAPI10 on CAPI10.APPLICATION_ID = uni.APPLICATION_ID
    WHERE 
        CAPI10.score1 BETWEEN score1_min AND score1_max 
        AND uni.type LIKE type
END REPOQUERYALL ;

    我使用 % 作为默认查询参数来返回 SQL Server 中的所有值 在没有用户输入的情况下。我不确定我必须在 Oracle 中使用什么作为默认值才能全部返回。

    列表项 Oracle 在 SELECT * 之后使用新术语 INTO。我不确定在这种情况下是否需要使用 INTO 或光标。我不知道哪个适合这里以及如何使用它。

    如果有人可以将此 SQL Server 传输到 Oracle 过程,我将不胜感激。我不确定我的 Oracle 是否 100% 正确。

【问题讨论】:

【参考方案1】:

这是您需要了解的有关 Oracle 存储过程的内容 - 与 SQL Server 不同,您不能只在任何编程块中执行 SELECT ...,除非这是子选择或 select... into...

如果目标是从过程中返回记录集,则在 Oracle 中,您必须添加一个 Sys_RefCursor 输出参数并使用您的 select 语句打开此引用游标。

您并不遥远 - check this example 。记住,当您执行 Open <cursor_name> FOR ... 时,FOR 之后的内容可以是动态 SQL 字符串或只是编译的 SQL。

【讨论】:

谢谢 T.S.因此,当我添加“RefCursor”时,这些 Oracle 示例也提到了 IN 参数。这是强制性的吗? 是的。如果要从Oracle 存储过程中返回数据,则需要声明Sys_refcursor 类型的output 参数才能返回此数据。另一种(类似的)方法是声明函数create or replace Function ... return sys_refcursor。但这确实是一回事。 Return 只是一种输出参数。所以,如果你使用存储过程,你可以返回多个引用游标。在 sql server 中,您可以简单地编写 select* from t1; select * from t2 - 您有 2 个结果集。在oracle中,对于每个select要返回的数据都需要sys_refcursor参数:Open p1..;Open p2 IN 参数仅在您需要它们将某些内容传递给 SP 时使用。引用光标必须是OUT @TS,我像这样修改了我的代码,但我仍然犯了一些错误'创建或替换 PROCEDURE QUERYALL ( -------- , o_Cursor OUT SYS_REFCURSOR ) AS BEGIN OPEN o_Cursor从 QCFUNIJ1 uni 中选择; INNER-------- ------------- END REPOQUERYALL ;' 我刚刚测试了它 - 它在 oracle create or replace procedure aa (pa in varchar2) as rc sys_refcursor; rec dual%rowtype; begin open rc for select * from dual where dummy like pa; fetch rc into rec; Dbms_Output.Put_Line(rec.dummy); end; / 测试中工作 --> begin EIDMADM.aa('%X'); end; / 所以,基本上,它在 LIKE 中可以正常工作,就像 SQL Server 一样。你现在面临语法问题,不是系统的【参考方案2】:

这是对我使用 Sys_Cursor 的代码。感谢@TS 的帮助,引导我找到这个答案。

create or replace PROCEDURE QUERYALL 
(
o_Cursor OUT SYS_REFCURSOR
) 
AS 
BEGIN
O_Cursor := NULL;

OPEN O_Cursor FOR
    SELECT * FROM FUNIJ1
    INNER JOIN CAPI99 on CAPI99.APPLICATION_ID = FUNIJ1 .APPLICATION_ID
    INNER JOIN CAPI41 on CAPI41.APPLICATION_ID = FUNIJ1 .APPLICATION_ID
    INNER JOIN CAPI10 on CAPI10.APPLICATION_ID = FUNIJ1 .APPLICATION_ID
    WHERE 
    ----
    ----
END QUERYALL;

当您在Java中使用此过程显示表格时,您需要将Sys_Cursor调用到Resultset中。

String sp= "CALL QUERYALL(?)"; // Procedure calling with Sys_Cursor
cst = con.prepareCall(sql);
cst.registerOutParameter(1, OracleTypes.CURSOR);
cst.executeUpdate();
rs = (ResultSet) cst.getObject(1);              
while(rs.next()) 
----
----

【讨论】:

将 SQL Server 存储过程转换为 Oracle 过程以从表中查询

】将SQLServer存储过程转换为Oracle过程以从表中查询【英文标题】:ConvertSQLServerstoredproceduretoOracleproceduretoqueryfromtables【发布时间】:2015-11-3022:55:09【问题描述】:我正在尝试从SQLServer迁移到Oracle数据库。我必须将我的存储过程从S... 查看详情

SQL Server 存储过程参数类型转换

】SQLServer存储过程参数类型转换【英文标题】:SQLServerStoredProcArgumentTypeConversion【发布时间】:2008-10-2200:21:22【问题描述】:假设我在一个表中有一堆varchar(6000)字段并且想要将它们更改为文本字段。参数为varchar(6000)类型的存储... 查看详情

如何将 SQL Server 存储过程迁移到 Mysql [关闭]

】如何将SQLServer存储过程迁移到Mysql[关闭]【英文标题】:HowtoMigrationSQLServerStoredProceduretoMysql[closed]【发布时间】:2016-08-2308:36:13【问题描述】:我正在使用esfdbmigrationtookit将SQLServer迁移到Mysql数据库,但是SQLServer中的存储过程在... 查看详情

将 SQL Server 存储过程重写为 MySQL(MariaDB)

】将SQLServer存储过程重写为MySQL(MariaDB)【英文标题】:RewriteSQLServerStoredProceduretoMySQL(MariaDB)【发布时间】:2019-01-2001:02:48【问题描述】:我需要将存储过程从MSSQLServer语法重写为MariaDB标准的MySQL。我已经为此苦苦挣扎了好几个小时... 查看详情

在 SQL Server 存储过程中将 varchar 转换为 int 时出错

】在SQLServer存储过程中将varchar转换为int时出错【英文标题】:ErrorconvertingvarchartointinSQLServerstoredprocedure【发布时间】:2013-10-3114:22:05【问题描述】:以下是我的存储过程。我收到一个错误,但我不明白到底是什么问题CREATEProc[dbo]... 查看详情

将用户定义表中的日期值传递给 SQL Server 2008 存储过程

】将用户定义表中的日期值传递给SQLServer2008存储过程【英文标题】:PassingDatevaluefromuserdefinedtabletoaSQLServer2008storedprocedure【发布时间】:2017-12-0117:38:08【问题描述】:将系统定义表中的日期值传递给从vb.net调用的存储过程会导致... 查看详情

需要将以下存储过程从 Oracle 转换为 SQL

】需要将以下存储过程从Oracle转换为SQL【英文标题】:NeedtoconvertbelowstoredprocedurefromOracletoSQL【发布时间】:2018-07-1908:10:06【问题描述】:我需要将下面的存储过程从Oracle转换为SQL,我尝试通过SqlSever迁移助手进行转换,但无法转... 查看详情

锁定 SQL Server 存储过程

】锁定SQLServer存储过程【英文标题】:LockinginaSQLServerStoredProcedure【发布时间】:2009-01-2018:17:50【问题描述】:我有一个存储过程,它根据某些标准操作整数表字段(表示序列号)-标准可以将该字段重置为零。在多用户环境中,... 查看详情

如何将存储过程转换为单个 SQL 语句

】如何将存储过程转换为单个SQL语句【英文标题】:HowcanitransformastoredprocedureintoasingleSQLstatment【发布时间】:2015-10-2420:58:14【问题描述】:我的数据库中有一个表,看起来像(表中可以有相同的元组):+-------------+---------+--------... 查看详情

C# 将 DateTime 转换为 Sql Server 2005 格式

】C#将DateTime转换为SqlServer2005格式【英文标题】:C#ConvertDateTimeToSqlServer2005Format【发布时间】:2010-02-2412:00:29【问题描述】:如何将此DateTime值转换为SqlServer2005不会对我大喊大叫的东西。2007-12-01T00:00:00+00:00(我只关心日期,而不... 查看详情

将 PL/SQL 脚本转换为存储过程

】将PL/SQL脚本转换为存储过程【英文标题】:ConvertaPL/SQLscripttoastoredprocedure【发布时间】:2012-05-3103:28:39【问题描述】:现在我正在将数据导入并转换到Oracle数据库中,如下所示:程序定期轮询特定文件夹,一旦找到文件,它就... 查看详情

需要 PL/SQL 存储过程将列转换为行

】需要PL/SQL存储过程将列转换为行【英文标题】:NeedPL/SQLstoredproceduretoconvertcolumnintorows【发布时间】:2020-12-1417:29:38【问题描述】:我有桌子-filenamedescriptionvalue----------------------------------------------------------------------rec_123Property 查看详情

将存储过程 PL/SQL 转换为 Java

】将存储过程PL/SQL转换为Java【英文标题】:ConvertingstoredproceduresPL/SQLtoJava【发布时间】:2015-10-1410:00:29【问题描述】:是否有人知道将PL/SQL转换为Java的开源工具。或者,如果您对准备制作此工具有任何建议。【问题讨论】:为... 查看详情

MS Access 查询转换为 Sql Server

】MSAccess查询转换为SqlServer【英文标题】:MSAccessQueriesConversiontoSqlServer【发布时间】:2014-06-2012:58:50【问题描述】:我正在将大量访问查询转换为sqlserver存储过程。所以sql需要满足t-sql标准。例如IIF等是否有可以将大访问查询转... 查看详情

如何仅使用 javascript 将图像转换为字节数组以将图像存储在 sql server 上?

...仅使用javascript将图像转换为字节数组以将图像存储在sqlserver上?【英文标题】:Howtoconvertimagetobytearrayusingjavascriptonlytostoreimageonsqlserver?【发布时间】:2012-03-0418:16:01【问题描述】:我正在努力使用客户端脚本将图像转换为字节数... 查看详情

使用 RODBC 将 SQL 存储过程结果转换为 data.frame 格式

】使用RODBC将SQL存储过程结果转换为data.frame格式【英文标题】:GettingSQLstoredprocedureresultsintodata.frameformatusingRODBC【发布时间】:2011-12-0919:42:33【问题描述】:我正在使用RODBC包在我的SQL服务器中查询结果。在我的SQLServerMgmt中执行... 查看详情

SQL Server 将整数转换为二进制字符串

】SQLServer将整数转换为二进制字符串【英文标题】:SQLServerConvertintegertobinarystring【发布时间】:2008-09-2413:27:46【问题描述】:我想知道在SQL中是否有一种简单的方法可以将整数转换为其二进制表示,然后将其存储为varchar。例如5... 查看详情

将 UTC 中的 SQL Server 日期时间转换为特定时区

】将UTC中的SQLServer日期时间转换为特定时区【英文标题】:ConvertSQLServerdatetimeinUTCtospecifictimezone【发布时间】:2017-06-0111:35:49【问题描述】:我需要将存储为UTC的日期时间转换为特定时区,存储在另一列中。例如,给定这张表:... 查看详情