2014-02-06 6 views
0

База данных Oracle 11G. У нас есть приложение C#, которое говорит с пакетом PL/SQL, который отправляет пользователю электронное письмо, если выполняется ряд критериев. В этом примере используется таблица PERSON & таблица НАЗНАЧЕНИЯ.Поддержка синтаксиса для пакета базы данных

Здесь логика в настоящее время мы имеем:

create or replace 
PACKAGE BODY email_send_pkg 
IS 
PROCEDURE sp_email_reminder(p_HOURS IN NUMBER, 
            p_message_cur IN OUT MessageCur) 
IS 
BEGIN 
    OPEN p_message_cur 
    FOR 
SELECT a.person_id, 
     a.appoint_no, 
     a.appoint_date_time,   
     p.name, 
     p.forename, 
     p.surname, 
     p.email_addre, 
     l.location_name, 
     NVL(l.address1, ''), 
     NVL(l.address2, ''), 
     NVL(l.address3, '') 

    FROM appointment a, 
     person p, 
     location l 
    WHERE a.appoint_date_time > SYSDATE -- only send email for appointments in the future 
    AND (sa.appoint_date_time - ((1/24) * p_HOURS)) < SYSDATE 
    AND a.cancel_date IS NULL -- only send email for appointment that have NOT been cancelled 
    AND a.resched_date IS NULL -- only send email for appointment that have NOT been rescheduled 
    AND p.person_id = a.person_id -- check correct record on PERSON table & APPOINTMENT table 
    AND l.location_id = a.location_id -- check correct record on PERSON table & APPOINTMENT table 
    AND email_addre IS NOT NULL -- only send email if email data exists for the person in question 

    AND NOT EXISTS --avoid duplicate record 
     (SELECT * 
      FROM email_message em 
     WHERE em.appoint_no = a.appoint_no 
      AND em.message_type_id = 1 -- (type: example; appointment reminder) 
    ) 
ORDER BY appoint_date_time ASC; 
END sp_email_reminder; 

Предполагая, что все критерии соблюдены, мы затем добавить данные в таблицу, которая опрашиваемого позже в C# приложение для разослать электронные письма.

Мне нужно реализовать дополнительную логику, чтобы сделать еще несколько проверок. Я достаточно незнакомый с PL/SQL, и, конечно, это синтаксис и вам нужен совет по добавлению логики.

В настоящее время, если человек обнаруживает свое назначение, и в настоящее время система не хранит их электронную почту, их просят на прием. После добавления в базу данных (PERSON & таблицы PERSON_AUDIT обновлены) Приложение C# будет опросить, увидеть новое добавленное письмо и отправить электронное письмо лицу, которое уже сидит в приемной для этой встречи .... Что очевидно немного глупо & ненужным.

Итак, мне нужно вставить некоторую логику по строкам: ЕСЛИ EMAIL_ADDRE НЕ БОЛЬШЕ NULL в таблице PERSON_AUDIT на вопрос APPOINT_DATE, затем DONT отправляет электронное письмо.

Я также хотел бы, чтобы электронные письма никогда не отправлялись по субботам или воскресеньям или в праздничные дни, например, в Рождество. (НО все же дайте им уведомление за 72 часа). Я думаю, что решение для этого было бы создать простую таблицу db, полную исключенных дат, и проверить на это, но я не знаю, как реально реализовать это с моими текущими знаниями PL/SQL.

Любые советы по синтаксису или комментариям по текущей логике были бы замечательными! Спасибо.

Решение: (спасибо Starfighter)

AND NOT EXISTS 
    ( SELECT * 
     FROM audituser.person_a pu 
     WHERE pu.b_person_id = sa.person_id 
     AND pu.b_email <> pu.a_email 
     AND TRUNC(pu.a_last_upd_datetime) = TRUNC(sa.appoint_date) 
     AND pu.a_email IS NOT NULL 
    ) 

ответ

1

Попробуйте добавить следующий код в конце вашего запроса:

and not exists (
    -- Avoid sending updates if person record changes on appointment date 
    select 'X' 
    from person_audit pa 
    where a.person_id = pa.person_id 
    -- Trunc is currently doing same day... 
    -- this can be tweaked to look at range of minutes or hours 
    and trunc(appoint_date_time) trunc(last_upt_date_time) 
    and pa.email_address is not null 
) 

Это должно эффективно пропускать любые записи, в которых обновляются люди запись (и адрес электронной почты не является нулевым) в (или после) даты назначения.

+0

Удивительный, я получил это в конце концов, немного отличается, но ваш ответ велик. Благодарю. OP отредактирован. – GrumP

Смежные вопросы