2013-06-20 37 views
-1

我有一個Oracle存儲過程 - 從Java 1.6代碼調用。有一條消息發送給一個號碼,號碼可以對其進行回覆。我的問題是UNION部分不起作用。 我想要一行返回消息並回復一行。目前發生的情況是存儲的proc返回2行。第一行只有消息。第二排將它們組合在一起。我只想要第二排。Oracle UNION不工作

這裏是我的存儲過程:

create or replace 
    FUNCTION "LIST_ALL_MSGS_SERVICE" (
gvi_service_code_in  in varchar2, 
start_date_in   in varchar2, 
end_date_in   in varchar2 
) 
    return types.cursorType 
    is 
    msg_cursor types.cursorType; 
    l_msg_code message.gvi_message_code%type; 
    l_start_date date; 
    l_end_date date; 

    BEGIN 
    IF start_date_in IS NULL THEN 
     raise_application_error(-20054, 'start_date missing'); 
    END IF; 
    IF end_date_in IS NULL THEN 
     raise_application_error(-20054, 'end_date missing'); 
    END IF; 

/* Set end date */ 

    l_end_date := to_date(end_date_in, 'yyyy-mm-dd hh24:mi:ss'); 

/* Set start date */ 
    l_start_date := to_date(start_date_in, 'yyyy-mm-dd hh24:mi:ss'); 


/* Use cursor to select messages */ 
BEGIN 
    OPEN msg_cursor FOR 
     SELECT 
     m.message_id, 
      m.gvi_message_code sort_gvi_message_code, 
       m.recipient, 
       m.originator, 
       m.content, 
       mct.message_channel_type, 
       to_char(m.message_date, 'yyyy-mm-dd hh24:mi:ss'), 
       mst.description, 
       null, 
       null, 
     m.gvi_datafeed_name 
     FROM message m, 
      message_channel_type mct, 
       message_status_type mst, 
     message_status ms 
    WHERE TRIM(UPPER(m.gvi_service_code)) = gvi_service_code_in 
    AND m.gvi_message_code = ms.gvi_message_code 
    AND m.message_date >= l_start_date 
      AND m.message_date <= l_end_date 
    AND m.message_channel_type_id = mct.message_channel_type_id 
      AND ms.message_status_type_id = mst.message_status_type_id 
    AND ms.message_status_type_id = 
    (SELECT MAX(ms2.message_status_type_id) 
    FROM message_status ms2 
     WHERE ms2.gvi_message_code = m.gvi_message_code) 

UNION 
SELECT 
     m.message_id, 
       m.gvi_message_code sort_gvi_message_code, 
       m.recipient, 
       m.originator, 
       m.content, 
       mct.message_channel_type, 
       to_char(m.message_date, 'yyyy-mm-dd hh24:mi:ss'), 
       mst.description, 
       em.gvi_external_message_code, 
       em.content, 
     m.gvi_datafeed_name 
     FROM message m, 
      external_message em, 
      ext_msg_status_type emst, 
       message_channel_type mct, 
       message_status_type mst, 
     message_status ms 
    WHERE TRIM(UPPER(m.gvi_service_code)) = gvi_service_code_in 
    AND m.gvi_message_code = ms.gvi_message_code 
    AND m.gvi_message_code = em.gvi_message_code 
    AND TRIM(UPPER(emst.ext_msg_status_type)) = 'REPLY' 
    AND em.ext_msg_status_type_id = emst.ext_msg_status_type_id 
    AND m.message_date >= l_start_date 
      AND m.message_date <= l_end_date 
    AND m.message_channel_type_id = mct.message_channel_type_id 
      AND ms.message_status_type_id = mst.message_status_type_id 
     AND ms.message_status_type_id = 
    (SELECT MAX(ms2.message_status_type_id) 
    FROM message_status ms2 
     WHERE ms2.gvi_message_code = m.gvi_message_code) 
    ORDER BY sort_gvi_message_code; 

END; 

RETURN msg_cursor; 
    commit; 
    END list_all_msgs_service; 
+0

你爲什麼工會;如果沒有回覆,你是否試圖單獨顯示最初的信息,並且如果有信息和回覆一起出現? –

+0

這是正確的。如果有消息沒有回覆 - 只有消息必須顯示。如果有回覆消息 - 消息和回覆必須顯示固定標籤 – lulu88

+1

,這與Java無關 – jwenting

回答

2

工會工作時,它發現在selects不同的值,如果有一個答覆。它只是沒有做你想做的。你可以在聯合的第一部分添加一個and not exists()子句,所以如果下半部分不會返回任何東西,但它會更容易,並且重複使用外連接的次數要少得多 - 所以你只有一個單select並沒有union

SELECT m.message_id, 
      m.gvi_message_code sort_gvi_message_code, 
      m.recipient, 
      m.originator, 
      m.content, 
      mct.message_channel_type, 
      to_char(m.message_date, 'yyyy-mm-dd hh24:mi:ss'), 
      mst.description, 
      em.gvi_external_message_code, 
      em.content, 
      m.gvi_datafeed_name 
    FROM message m 
    JOIN message_status ms 
     ON m.gvi_message_code = ms.gvi_message_code 
    JOIN message_status_type mst 
     ON ms.message_status_type_id = mst.message_status_type_id 
    JOIN message_channel_type mct 
     ON m.message_channel_type_id = mct.message_channel_type_id 
LEFT JOIN external_message em 
     ON m.gvi_message_code = em.gvi_message_code 
LEFT JOIN ext_msg_status_type emst 
     ON em.ext_msg_status_type_id = emst.ext_msg_status_type_id 
     AND TRIM(UPPER(emst.ext_msg_status_type)) = 'REPLY' 
    WHERE TRIM(UPPER(m.gvi_service_code)) = gvi_service_code_in 
     AND m.message_date >= l_start_date 
     AND m.message_date <= l_end_date 
     AND ms.message_status_type_id = 
      (SELECT MAX(ms2.message_status_type_id) 
      FROM message_status ms2 
      WHERE ms2.gvi_message_code = m.gvi_message_code) 
ORDER BY sort_gvi_message_code; 

未經檢驗,效果顯着。左外連接表示如果沒有回覆,則em.gvi_external_message_codeem.content的值將爲null,這是您希望從現有工會的第一部分獲得的值。我認爲。

+0

剛剛測試過這個,它的工作原理 - 你是一個該死的天才!哈:)非常感謝你! – lulu88