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

时间:2015-09-04 17:49:17

标签: sql-server oracle stored-procedures oracle11g

我正在尝试从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 ;
  1. 我使用%作为默认查询参数来返回SQL Server中的所有值 如果没有用户输入。我不确定我必须在Oracle中使用什么作为默认值来返回所有内容。

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

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

2 个答案:

答案 0 :(得分:2)

以下是您需要了解的Oracle存储过程 - 与SQL Server不同,您不能在任何编程块中执行SELECT ...,除非这是subselect或select... into...

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

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

答案 1 :(得分:0)

以下是使用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()) {
----
----
}