function - PL/SQL : ORA-00932: inconsistent datatypes: expected NUMBER got USER_NAME. VARCHAR_ARRAY

标签 function plsql varray

下面是我创建的一个函数,用于接受 varchar2 项数组并返回该记录的内部 pk,即每条记录的一个 NUMBER。我正在努力获得正确的语法,以将 VARCHAR_ARRAY 类型的数组传递给游标中的简单 SQL 查询,并返回 NUMBER_ARRAY 类型的变量。错误位于第 8,42 行,即传递给函数的 FROM table_name WHERE column_name IN VARCHAR_ARRAY 。请帮我解决这个错误,因为我正在学习 plsql。

  create or replace TYPE VARCHAR_ARRAY AS VARRAY(1000000) OF VARCHAR2(1000);
   /

  create or replace TYPE NUMBER_ARRAY AS VARRAY(1000000) OF NUMBER;
   /

  create or replace Function GET_PRODUCT_ID_ARR(V_PRODUCT_NUM_ARR IN VARCHAR_ARRAY)
  RETURN NUMBER_ARRAY 
  IS
     product_id_list number_array := number_array(); 
     CURSOR c1
     IS 
     SELECT cat_map_id 
     FROM mn_cat_map WHERE product_num IN (V_PRODUCT_NUM_ARR) and catalog_type = 'INT';
  v_output NUMBER;   
  BEGIN
      OPEN c1; 
      LOOP
          fetch c1 into product_id_list;
          EXIT WHEN c1%notfound;
          product_id_list.extend;
          product_id_list(product_id_list.count)  := v_output;
         dbms_output.put_line('Product ('||v_output ||'):'||product_id_list(v_output));
      END LOOP;
  Close c1;
  RETURN product_id_list;
  END;
  /

最佳答案

有两个问题:

  1. 您必须将 varray 转换为表:

    CURSOR c1
    IS 
    SELECT cat_map_id 
    FROM mn_cat_map 
    WHERE product_num IN (select column_value from table(V_PRODUCT_NUM_ARR))
      and catalog_type = 'INT';
    
  2. 获取之后添加批量收集:

    LOOP
      fetch c1 bulk collect into product_id_list limit 100;
      EXIT WHEN c1%notfound;
      product_id_list.extend;
      product_id_list(product_id_list.count)  := v_output;
      dbms_output.put_line('Product ('||v_output ||'):'||product_id_list(v_output));
      END LOOP;
    

如果您编写limit 100,则每个循环将在product_id_list中放入100条记录。您可以省略 limit 子句,在这种情况下,您将在一次获取中获取所有记录。

编辑
如何查看结果:

declare 
  myarray varchar_array; 
  my_num_array number_array;
begin 
  myarray := varchar_array(); 
  myarray.extend(2);
  myarray(1) := '151043'; 
  myarray(2) := '2895'; 
  my_num_array := GET_PRODUCT_ID_ARR(myarray);
  for i in 1 .. my_num_array.count loop
    dbms_output.put_line(my_num_array(i)); 
  end loop; 
end;
/

关于function - PL/SQL : ORA-00932: inconsistent datatypes: expected NUMBER got USER_NAME. VARCHAR_ARRAY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41032235/

相关文章:

arrays - 如何在 Oracle 中最好地存储数组?

sql - Oracle PL/SQL : How to DEREF from a VARRAY of REFs?

c++ - LuaPlus:如何让函数返回一个表?

使用 Boost 函数和 C++ 类方法的 C++ 回调

javascript - JavaScript 中 id 计算器的更高效版本

javascript - 如何获取等于 10 的输入并执行在屏幕上显示“awesome”的功能

string - 在PLSQL中提取URL路径段字符串

oracle - PL/SQL - 如何在 IN 子句中使用数组

Oracle 用户定义的 varchar 的 vararray 聚合函数

sql - PL/SQL : SELECT INTO raises ORA-00947