Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果一个参数在具有单个参数的函数中有多个值,如何从pl/sql函数获取数据_Sql_Oracle_Function_Plsql_Parameter Passing - Fatal编程技术网

如果一个参数在具有单个参数的函数中有多个值,如何从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

我正在用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_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;