我正在尝试从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%正确。
答案 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()) {
----
----
}