如果一个参数在具有单个参数的函数中有多个值,如何从pl/sql函数获取数据
我正在用pl/sql开发一个过程,从函数中执行的游标获取数据集。例如: 功能:如果一个参数在具有单个参数的函数中有多个值,如何从pl/sql函数获取数据,sql,oracle,function,plsql,parameter-passing,Sql,Oracle,Function,Plsql,Parameter Passing,我正在用pl/sql开发一个过程,从函数中执行的游标获取数据集。例如: 功能: f_process_data(id_process IN NUMBER, id_product IN NUMBER) 返回: v_result_cursor sys_refcursor; 但问题是,在搜索光标时,我需要同时发送多个id_产品。大概是这样的: v_sausage := 1240; v_ham := 1260; LOOP IF v_count = v_sausage OR v_coun
f_process_data(id_process IN NUMBER, id_product IN NUMBER)
返回:
v_result_cursor sys_refcursor;
但问题是,在搜索光标时,我需要同时发送多个id_产品。大概是这样的:
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;
id_产品:1240(香肠)
id_产品:1260(火腿)
?如何在功能中发送(或获取)多个产品
我知道有一个循环是可能的,但是怎么做呢
像这样的(?):
我希望v_id和v_id_产品已经记录在一个集合中,包括id_产品1240和1260的结果
但是,如果业务规则发生变化,并且不仅仅是两种产品,那么100或1000种产品如何
注意:光标从功能上无法修改,必须逐个发送id_产品
CURSOR cu_get_value_products IS
SELECT value FROM supplies WHERE id = p_id and id_product = p_id_product;
为了一次发送多个要处理的产品,请在数据库中创建名为ProductList的用户定义表类型。然后,您可以将产品列表作为参数发送到存储过程中。在信息有限的情况下,下面是我想到的。我仍然不知道您在问题中提到的静态游标在您的
f\u process\u data()
函数中定义了什么。因为我不知道这个函数的完整代码,所以我只编写了自己的代码,并将游标声明为SYS_REFCURSOR,因为这是函数返回的内容
请让我知道这是否有效,或者我是否遗漏了一些重要信息。我觉得我缺少关键信息,无法为您提供有用的解决方案
我创建的名为Products的实体模型表包含以下列和数据。参见图
可能重复@reymagnus您希望如何设置产品参数的格式?如。。。你喜欢什么?如果产品ID为,是否希望参数为逗号分隔的列表<代码>1001100210582105作为VARCHAR2?在首先使用产品ID建立一个数组/集合之后,是否要将该数组/集合作为函数传递到
f\u process\u data()
?您的问题有很多解决方案。@代码新手函数中的光标一次只能得到一个id\u产品,并且不可能更改。@reymagnus好的,那么您想要什么呢。。。是为进入f_process_data()函数的每个产品_ID运行游标。如果是这种情况,您将不再返回ref_游标,而需要返回其他内容。如果您无法更改正在使用的光标。因此,我现在的问题是,您能否更改f_process_data()函数的返回类型,改为返回要分析的数据集合?@Code新手该函数调用另一个函数,该函数调用另一个打开光标的函数,类似于f_open_cursor(查询)返回sys_refcursor,仅在此函数内:打开游标进行查询;我发布的示例与之类似,但由于保护了这些代码,因此与原始示例不完全相同,很抱歉-u-,但是,如果函数和游标一次只接收一个参数值,它是如何工作的?我不熟悉列表作为pl/sql函数中的参数,目前…不要使用函数或游标。函数或游标的使用不是可选的,因为这些对象不能修改或删除,必须使用它们。全局存储过程调用函数f_process_data,该函数执行一个游标,就是这样。根据您的要求,我能够创建此解决方案,而无需更改您的函数-函数f_process_data(p_id_进程编号,p_id_产品编号)返回SYS_REFCURSOR
。。。除了我添加的p\u
,因为我喜欢以那种方式引用我的参数。你是对的。光标是静态的,这是我可以应用的解决方案。非常感谢。我已经尝试实现了这一点,并得到了这个错误:ORA-01001:无效游标。它在进入第二个循环之前崩溃。一旦我有权访问数据库,我将显示我的代码。@reymagnus确保光标没有被关闭。如果您试图从以前关闭的游标中提取,这是一种获得错误“无效游标”的方法。
DECLARE
/* Store Ref Cursor returned by f_process_data() Function */
v_result_cursor SYS_REFCURSOR;
/* Declare Record so we can store the data FETCHed from the Cursor */
rec_products products%ROWTYPE;
/* Declare a couple Product Variables for Proof of Concept */
v_sausage NUMBER;
v_ham NUMBER;
/* Store output */
n_id NUMBER;
v_id_product VARCHAR2(100);
/* Declare Type of TABLE NUMBER */
TYPE nt_type IS TABLE OF NUMBER;
/* Create Array/Table/Collection of type nt_type to store product ids */
nt_product_ids nt_type;
/* Returns a Ref Cursor based on the product_id used as Input to this function */
FUNCTION f_process_data(p_id_process IN NUMBER, p_id_product IN NUMBER)
RETURN SYS_REFCURSOR
AS
/* Declare Ref Cursor that will be Returned */
rc_result_cursor SYS_REFCURSOR;
BEGIN
/* Open Ref Cursor based on Product ID parameter */
OPEN rc_result_cursor FOR SELECT * FROM products WHERE item_id = p_id_product;
RETURN rc_result_cursor;
END f_process_data
;
BEGIN
/* Set Product Variables to IDs */
v_sausage := 2002;
v_ham := 2009;
/* Store product ids into a Number Table so we can Loop thru it */
nt_product_ids := nt_type (v_sausage,v_ham);
FOR r IN nt_product_ids.FIRST .. nt_product_ids.LAST
LOOP
/* Get Ref Cursor using SINGLE Product ID */
v_result_cursor := f_process_data(1, nt_product_ids(r));
LOOP
FETCH v_result_cursor INTO rec_products;
n_id := rec_products.item_id;
v_id_product := rec_products.item;
EXIT WHEN v_result_cursor%NOTFOUND;
dbms_output.put_line('Product_id: ' || n_id);
dbms_output.put_line('Product: ' || v_id_product);
END LOOP; /* Cursor Loop */
/* Close Cursor */
CLOSE v_result_cursor;
END LOOP; /* Product IDs Loop */
EXCEPTION WHEN OTHERS
THEN CLOSE v_result_cursor;
END;