2013-10-05 45 views
0

我想「聯盟」多個SELECT語句在下面的存儲過程「聯盟」多重選擇查詢在Oracle存儲過程

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的新手。請幫幫我。

回答

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; 

你的SELECT語句可能是罰款或SQL Developer。但是在PL/SQL中,你需要應用上面兩種模式中的一種。

+0

所以如果u去選擇後者,我需要做這麼多的聲明是它? – user2380844

+0

是的,在後一選項中,您需要爲檢索的每個列聲明一個變量。但是,該解決方案僅適用於檢索單行的情況。由於你的問題的介紹談到UNION,你可能會檢索幾行。那麼你需要一個不同的方法。你想利用檢索到的數據做什麼? – Codo

+0

是生成多行。你能解釋一下這種方法嗎?嘗試使用表中的不同TransitionActionType和Discriminator列的聯合表 – user2380844

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;