Перенос хранимых процедур Oracle в Postgresql - PullRequest
0 голосов
/ 01 января 2019

Как перенести эту часть хранимой процедуры Oracle

FOR t IN (WITH temp_transaction(str) AS (SELECT i_transaction_id FROM dual)

в функцию PostgreSQL?

Procedure sp_update
(
 i_mem_id IN WLVENDOR.REWARD_TRX_DETAIL.WL_MEM_ID%TYPE,
 i_rebate_detail_id  IN WLVENDOR.REWARD_TRX_DETAIL.WL_REBATE_DETAIL_ID%TYPE,
 i_transaction_id IN VARCHAR,
 i_limit_days IN NUMBER,
 o_rows_affected OUT NUMBER
)
IS
    err_msg   VARCHAR(500);
  BEGIN
   FOR t IN (WITH temp_transaction(str) AS (
     SELECT i_transaction_id FROM dual
   )
   SELECT CAST(regexp_substr(str, '(.*?)(,|$)', 1, level, NULL, 1) as Number) transactionId
   FROM temp_transaction
   CONNECT BY regexp_substr(str, '(.*?)(,|$)', 1, level) is not null) LOOP
    // UPDATE Statement
    END LOOP;
    SELECT COUNT(*) into o_rows_affected FROM WLVENDOR.REWARD_TRX_DETAIL WHERE wl_rebate_detail_id = i_rebate_detail_id;

END sp_update;

1 Ответ

0 голосов
/ 01 января 2019

Очевидно, что запрос выбора используется в oracle для разделения строки, разделенной запятыми, на строки.

В Postgres есть метод, использующий string_to_array для преобразования его в массив и функцию unnest для их преобразования.в строки.

Для вашего случая вы можете перебрать весь массив с помощью FOREACH

Итак, ваша процедура (функция postgres будет выглядеть примерно так:

create or replace function sp_update
..  --other 
..  --statements

DECLARE
    transactionId   numeric;
    ..--other declarations.
  BEGIN
   FOREACH transactionId IN ARRAY string_to_array(i_transaction_id,',')::numeric[] as
    LOOP
    -- UPDATE Statement
    END LOOP;
  .. --other statements
  ..
END $$;

Рекомендуемой альтернативой будет передача ARRAY нескольких идентификаторов вместо отправки через запятую i_transaction_id. Также попробуйте преобразовать запрос на обновление, чтобы он мог работать как single , а не использовать цикл.

...