Sql server 将Sql Server存储过程迁移到Oracle PL/Sql

Sql server 将Sql Server存储过程迁移到Oracle PL/Sql,sql-server,oracle,stored-procedures,Sql Server,Oracle,Stored Procedures,在我进行一些特定于oracle的更改之前,下面的存储过程适用于SQL Server。 现在,这个存储过程也必须适用于Oracle 我使用的Oracle Sql开发人员在打开游标后的一行抱怨 不知何故,Oracle不喜欢我将select语句和union都“分组”,并对整个结果进行排序 我错了什么?我只知道一点oracle存储过程 create or replace PROCEDURE GetWorkflowStatusForMatrix( p_ApplicationId IN varcha

在我进行一些特定于oracle的更改之前,下面的存储过程适用于SQL Server。 现在,这个存储过程也必须适用于Oracle

我使用的Oracle Sql开发人员在打开游标后的一行抱怨

不知何故,Oracle不喜欢我将select语句和union都“分组”,并对整个结果进行排序

我错了什么?我只知道一点oracle存储过程

create or replace
PROCEDURE GetWorkflowStatusForMatrix(
    p_ApplicationId IN varchar2,    
    CURSOR_ OUT sys_refcursor
)
AS
BEGIN   
    OPEN CURSOR_ FOR
    (
  select ApplicationId || ModuleId || UNIT_ID as StatusKey, UNIT_ID, ApplicationId, ModuleId, Owner, "Level", Action, "Comment", LastModifiedUser, LastModifiedDate 
    from WorkflowStatus where ApplicationId = p_ApplicationId

    union

    select distinct e.ApplicationId + WorkflowId + UnitId as StatusKey, UnitId, e.ApplicationId, WorkflowId, w.Owner, 'Level1', 'Working', EventType, UserId, EventDateTime as LastModifiedDate
    from EventLog e
    join WorkflowStatus w on w.ApplicationId = e.ApplicationId and w.ModuleId = e.WorkflowId and w.UNIT_ID = e.UnitId
    where e.ApplicationId = p_ApplicationId and w.Owner <> '' and w.Action = 'Created'
    )
    order by LastModifiedDate DESC;
END;

您需要详细了解如何在Oracle中定义游标-这将对您有所帮助


谢谢,但是我有其他的存储过程,它们可以工作。我没有太多时间,我更感兴趣的是我上面的问题是什么,而不是现在做的最佳实践oracle…:这是行不通的,除非你学会如何在Oracle中实现这一点。我不会为你做你的工作…好吧,如果你说它不起作用,到底什么是不起作用的?我已经让它起作用了。这个错误涵盖了另一个重要的错误,当我删除这个错误时,它删除了第一个错误-是否确实要在查询的第二部分中添加Id,而不是像在第一部分中那样连接它们?
create or replace
PROCEDURE GetWorkflowStatusForMatrix(
    p_ApplicationId IN varchar2,    
    CURSOR_ OUT sys_refcursor
)
AS
BEGIN   
  OPEN CURSOR_ FOR
    select ApplicationId || ModuleId || UNIT_ID as StatusKey, UNIT_ID, ApplicationId, ModuleId, Owner, "Level", Action, "Comment", LastModifiedUser, LastModifiedDate 
  from WorkflowStatus where ApplicationId = p_ApplicationId
  union
  select distinct e.ApplicationId + WorkflowId + UnitId as StatusKey, UnitId, e.ApplicationId, WorkflowId, w.Owner, 'Level1', 'Working', EventType, UserId, EventDateTime as LastModifiedDate
from EventLog e
join WorkflowStatus w on w.ApplicationId = e.ApplicationId and w.ModuleId = e.WorkflowId and w.UNIT_ID = e.UnitId
where e.ApplicationId = p_ApplicationId and w.Owner <> '' and w.Action = 'Created'

order by LastModifiedDate DESC;
END;