【发布时间】:2019-10-11 06:59:15
【问题描述】:
我正在 pl/sql 中开发一个从函数中执行的游标获取数据集的过程。例如:
功能:
f_process_data(id_process IN NUMBER, id_product IN NUMBER)
返回:
v_result_cursor sys_refcursor;
但问题是,在搜索光标时,我需要同时发送多个 id_product。像这样的:
id_product:1240(香肠) id_product: 1260 (火腿)
¿如何在函数中发送(或获取)多个产品?
我知道循环是可能的,但是怎么做呢?
类似这样的东西(?):
v_sausage := 1240;
v_ham := 1260;
LOOP
IF v_count = v_sausage OR v_count = v_ham THEN
v_result_cursor := f_process_data(1, p_id_product);
END IF;
FETCH v_result_cursor
INTO v_id, v_id_product;
EXIT WHEN v_result_cursor%NOTFOUND;
END LOOP;
我预计 v_id 和 v_id_product 已记录在一个集合中,其中包括 id_product 1240 和 1260 的结果。
但是,如果业务规则发生变化并且不仅仅是 2 个产品,那么 100 或 1000 个产品呢?
注意:函数中的光标不可修改,id_product必须一一发送。
CURSOR cu_get_value_products IS
SELECT value FROM supplies WHERE id = p_id and id_product = p_id_product;
【问题讨论】:
-
@reymagnus 您希望如何格式化产品参数?如...你的偏好是什么?如果产品 ID,您希望参数是逗号分隔的列表吗?
1001,1002,1058,2105作为 VARCHAR2?在首次使用产品 ID 构建该集合后,您是否想将数组/集合作为函数传递给您的f_process_data()?您的问题有很多解决方案。 -
@Code新手函数中的光标按时间只得到一个id_product,无法更改。
-
@reymagnus 好的,那么您想要的是……为进入 f_process_data() 函数的每个 Product_ID 运行光标。如果是这种情况,您将不再返回 ref_cursor 并且需要返回其他内容。如果您无法更改光标。所以我现在的问题是,你能改变你的 f_process_data() 函数的返回类型,而不是返回你想要解析的数据的集合吗?
-
@Code Novice 该函数调用另一个函数,该函数调用另一个打开游标的函数,例如 f_open_cursor(query) 返回 sys_refcursor 并且仅在此函数内部: OPEN cursor FOR query;与我发布的示例相似,但由于保护这些代码,因此与原始示例不完全相同,对此感到抱歉-_-
标签: sql oracle function plsql parameter-passing