-1

Java 1.6 コードから呼び出される Oracle Stored Proc があります。番号に送信されるメッセージがあり、その番号はそれに返信できます。私の問題は、UNION 部分が機能していないことです。メッセージで 1 行を返し、1 行で返信する必要があります。現時点で何が起こっているかは、ストアド プロシージャが 2 行を返すことです。1 行目はメッセージのみです。2行目はそれらを組み合わせたものです。2行目だけ欲しい。

これが私のストアドプロシージャです:

  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;
4

1 に答える 1

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_codeおよびem.content値が になることを意味しますnull。これは、既存の結合の最初の部分から必要なものです。おもう。

于 2013-06-20T09:53:37.150 に答える