Может ли Postgres сделать это? (В частности, без функции () конструкция)? - PullRequest
1 голос
/ 23 марта 2010

У меня есть несколько оракулов, которые я портирую. Сегодня я наткнулся на этот код, который выглядит как «процедурный» язык, но не объявлен в функции или чем-то еще ... Мой вопрос: может ли Postgres обрабатывать это в этой форме? В какой форме это должно быть?

DECLARE
BEGIN
   IF :start_time IS NULL OR
      :start_date IS NULL OR
      :end_time IS NULL OR
      :end_date IS NULL  THEN
         INSERT INTO ARPSPACE_AVAILABILITY
            (ARP_ARPSPACE_NM, ASA_TIME_ID, ASA_START_DT, ASA_END_DT)
         SELECT :arpspace_name,
                 1,
                 ASP.ASP_START_DT,
                 ASP.ASP_STOP_DT
           FROM ASP 
          WHERE EXISTS
             (SELECT ARP.ARP_ARPSPACE_NM
                FROM ARPSPACE ARP
               WHERE ARP.ARP_ARPSPACE_NM = :arpspace_name);
   END IF;
END;

Ответы [ 3 ]

2 голосов
/ 24 марта 2010

Нет, пока без объявления функции. В версии 9.0 (скоро в бета-версии) это будет возможно: http://developer.postgresql.org/pgdocs/postgres/sql-do.html

1 голос
/ 24 марта 2010

Почему бы не сделать это (при условии: метки являются подготовленными параметрами запроса)?

     INSERT INTO ARPSPACE_AVAILABILITY
        (ARP_ARPSPACE_NM, ASA_TIME_ID, ASA_START_DT, ASA_END_DT)
     SELECT :arpspace_name,
             1,
             ASP.ASP_START_DT,
             ASP.ASP_STOP_DT
       FROM ASP 
      WHERE EXISTS
         (SELECT ARP.ARP_ARPSPACE_NM
            FROM ARPSPACE ARP
           WHERE ARP.ARP_ARPSPACE_NM = :arpspace_name)
      AND  (:start_time IS NULL OR
            :start_date IS NULL OR
            :end_time IS NULL OR
            :end_date IS NULL);
1 голос
/ 23 марта 2010

Короткий ответ - да, , если , вы можете объявить функцию. Подробнее см. plpgsql в руководстве.

...