Oracle存储过程中的“联合”多选查询

时间:2013-10-05 10:40:54

标签: oracle stored-procedures

我试图在“存储过程”下面“联合”多个选择语句

Create or replace PROCEDURE procedure1
as
BEGIN
SELECT b.EntityName,
     c.StateLaneName,
              c.ConsiderEntityOwnership,
              a.InitialState,
     d.StateName,
     e.EventName,
     1              AS Discriminator,     
     NULL               AS TransitionSeq,
     NULL               AS TransitionName,
     k.WorkflowActionSeq        AS ActionSeq,
     l.ActionName           AS ActionName,
     l.ClassPath            AS ClassPath,
     NULL               AS MessageKey,
     NULL               AS NextStateName

   FROM Workflow a,
     Entity b,
     WorkflowStateLane c,
     WorkflowState d,
     WorkflowEvent e,
     WorkflowEventAction k,
     WorkflowAction l

WHERE a.WorkflowEntityId        = b.EntityId
      AND a.WorkflowStateLaneId     = c.WorkflowStateLaneId
      AND a.WorkflowStateId     = d.WorkflowStateId
      AND a.WorkflowEventId     = e.WorkflowEventId
      AND a.WorkflowId          = k.WorkflowId
      AND k.WorkflowActionId        = l.WorkflowActionId
      AND k.TransitionActionType        = 1

UNION

(SELECT b.EntityName,
     c.StateLaneName,
              c.ConsiderEntityOwnership,
              a.InitialState,
     d.StateName,
     e.EventName,
     2              AS Discriminator,    
     NULL               AS TransitionSeq,
     NULL               AS TransitionName,
     k.WorkflowActionSeq        AS ActionSeq,
     l.ActionName           AS ActionName,
     l.ClassPath            AS ClassPath,
     NULL               AS MessageKey,
     NULL               AS NextStateName

   FROM Workflow a,
     Entity b,
     WorkflowStateLane c,
     WorkflowState d,
     WorkflowEvent e,
     WorkflowEventAction k,
     WorkflowAction l

WHERE a.WorkflowEntityId        = b.EntityId
      AND a.WorkflowStateLaneId     = c.WorkflowStateLaneId
      AND a.WorkflowStateId     = d.WorkflowStateId
      AND a.WorkflowEventId     = e.WorkflowEventId
      AND a.WorkflowId          = k.WorkflowId
      AND k.WorkflowActionId        = l.WorkflowActionId
      AND k.TransitionActionType        = 2);
END proceure1;

当我编译时,我收到了一个错误 PLS-00428:此select函数中需要一个INTO子句。 我是Oracle的新手。请帮帮我。

2 个答案:

答案 0 :(得分:1)

在PL / SQL中,SELECT查询的结果需要在某处。所以你要么在循环中使用它:

FOR rec in (
    SELECT a, b FROM t
) LOOP
   -- do something with rec.a and rec.b
END LOOP;

或者您必须使用INTO子句将其分配给变量:

DECLARE
  l_a NUMBER;
  l_b VARCHAR2(2000);
BEGIN
  SELECT a, b INTO l_a, l_b FROM t;
  -- do something with l_a and l_b
END;

如果在TOAD或SQL Developer中运行它,您的SELECT语句可能没问题。但是在PL / SQL中,你需要应用上面两种模式中的一种。

答案 1 :(得分:0)

因为select-union将输出多行,所以你需要使用open for,如下所示:

Create or replace PROCEDURE procedure1 (
  p_cursor out sys_refcursor
) as
BEGIN
open p_cursor for
SELECT b.EntityName,
     c.StateLaneName,
              c.ConsiderEntityOwnership,
              a.InitialState,
     d.StateName,
     e.EventName,
     1              AS Discriminator,     
     NULL               AS TransitionSeq,
     NULL               AS TransitionName,
     k.WorkflowActionSeq        AS ActionSeq,
     l.ActionName           AS ActionName,
     l.ClassPath            AS ClassPath,
     NULL               AS MessageKey,
     NULL               AS NextStateName

   FROM Workflow a,
     Entity b,
     WorkflowStateLane c,
     WorkflowState d,
     WorkflowEvent e,
     WorkflowEventAction k,
     WorkflowAction l

WHERE a.WorkflowEntityId        = b.EntityId
      AND a.WorkflowStateLaneId     = c.WorkflowStateLaneId
      AND a.WorkflowStateId     = d.WorkflowStateId
      AND a.WorkflowEventId     = e.WorkflowEventId
      AND a.WorkflowId          = k.WorkflowId
      AND k.WorkflowActionId        = l.WorkflowActionId
      AND k.TransitionActionType        = 1

UNION

(SELECT b.EntityName,
     c.StateLaneName,
              c.ConsiderEntityOwnership,
              a.InitialState,
     d.StateName,
     e.EventName,
     2              AS Discriminator,    
     NULL               AS TransitionSeq,
     NULL               AS TransitionName,
     k.WorkflowActionSeq        AS ActionSeq,
     l.ActionName           AS ActionName,
     l.ClassPath            AS ClassPath,
     NULL               AS MessageKey,
     NULL               AS NextStateName

   FROM Workflow a,
     Entity b,
     WorkflowStateLane c,
     WorkflowState d,
     WorkflowEvent e,
     WorkflowEventAction k,
     WorkflowAction l

WHERE a.WorkflowEntityId        = b.EntityId
      AND a.WorkflowStateLaneId     = c.WorkflowStateLaneId
      AND a.WorkflowStateId     = d.WorkflowStateId
      AND a.WorkflowEventId     = e.WorkflowEventId
      AND a.WorkflowId          = k.WorkflowId
      AND k.WorkflowActionId        = l.WorkflowActionId
      AND k.TransitionActionType        = 2);
END proceure1;