0

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

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:此选择函数中应有 INTO 子句。我是甲骨文的新手。请帮我。

4

2 回答 2

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 中,您需要应用上述两种模式之一。

于 2013-10-05T11:06:43.007 回答
0

因为选择联合将输出多行,所以您需要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;
于 2013-12-30T02:08:59.523 回答