如何迁移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;
答案 0 :(得分:0)
显然,在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 $$;
建议的替代方法是传递多个ID的ARRAY
而不是发送逗号分隔的i_transaction_id
。另外,请尝试将更新查询转换为能够以单个语句运行,而不是使用循环。