PLSQL - IN 子句使用具有多个值的变量

PLSQL - IN clause using variable with multiple values

我正在循环语句并提取 ID 并将其放入变量中:

declare
  l_id  NUMBER;

BEGIN

     FOR i IN 1..l_row_count
        loop
            l_id := to_number(apex_json.get_varchar2(p_path => 'rows[%d].id', 
                                                        p0 => i, p_values => l_values
                                                        )
                                );
     end loop:

我正在尝试获取所有 ID,然后 运行 一个 select 语句,其中将在 where 语句中使用此 ID 列表。所以完整的代码看起来像这样:

    declare
      l_id  NUMBER;
      l_id_list [SOME_TYPE_NOT_SURE];
    
    BEGIN
    
         FOR i IN 1..l_row_count
            loop
                l_id := to_number(apex_json.get_varchar2(p_path => 'rows[%d].id', 
                                                            p0 => i, p_values => l_values
                                                            )
                                    );
                //somehow add l_id to the l_id_list
 
         end loop:

        SELECT * FROM mytable WHERE someid IN (l_id_list);

END;

我无法让它工作。我不是 PLSQL 专家,但我尝试使用数组或尝试将 l_id_list 连接为字符串,但我无法让它工作。基本上我想做的就是创建一个包含所有 ID 的列表,然后 运行 一个 select 语句来查看这些 ID 是否存在于另一个 table.

在您的情况下,l_id_list 的类型必须全局声明为 collection-type。本地定义的类型不能用作集合,因此不能在 in-clause.

中使用
 declare
      l_id  NUMBER;
      l_id_list [SOME_GLOBAL_COLLECTION_TYPE];
    
    BEGIN
    
         FOR i IN 1..l_row_count
            loop
                l_id := to_number(apex_json.get_varchar2(p_path => 'rows[%d].id', 
                                                            p0 => i, p_values => l_values
                                                            )
                                    );
                //somehow add l_id to the l_id_list
 
         end loop:

        SELECT * FROM mytable WHERE someid IN (select * from table(l_id_list));
END;

全局声明类型:

CREATE TYPE number_list IS TABLE OF NUMBER;

然后您可以初始化列表,然后在循环的每次迭代中,EXTEND 列表并分配值,最后使用 MEMBER OF 运算符或 IN使用子查询和 table 集合表达式:

DECLARE
  l_id_list NUMBER_LIST := NUMBER_LIST();
BEGIN
  FOR i IN 1..l_row_count
  LOOP
    l_id_list.EXTEND;
    l_id_list(l_id_list.COUNT) := to_number(
                                    apex_json.get_varchar2(
                                      p_path   => 'rows[%d].id', 
                                      p0       => i,
                                      p_values => l_values
                                    )
                                  );
  END LOOP;

  SELECT *
  -- BULK COLLECT INTO ...
  FROM   mytable
  WHERE  someid MEMBER OF l_id_list;

  -- or

  SELECT *
  -- BULK COLLECT INTO ...
  FROM   mytable
  WHERE  someid IN (SELECT COLUMN_VALUE FROM TABLE(l_id_list));
END;