【问题标题】:"Union" Multiple Select Query in Oracle Stored ProcedureOracle 存储过程中的“联合”多选查询
【发布时间】:2013-10-12 08:56:30
【问题描述】:

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

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 子句。 我是甲骨文的新手。请帮帮我。

【问题讨论】:

    标签: oracle stored-procedures


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

    【讨论】:

    • 所以如果你选择后一种选择,我需要做这么多声明是吗??
    • 是的,在后一个选项中,您需要为检索到的每一列声明一个变量。但是,该解决方案仅在您检索单行时才有效。由于您的问题的介绍谈到了 UNION,您可能会检索几行。那么你需要一种不同的方法。你想对检索到的数据做什么?
    • 是的,生成了多行。您能否解释一下这种方法。尝试从表中合并具有不同 TransitionActionType 和 Discriminator 列的表
    • 你想对检索到的数据做什么?
    • 合并比较数据
    【解决方案2】:

    因为 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多