【问题标题】:How to delete NULL elements from nested table in oracleoracle如何从嵌套表中删除NULL元素
【发布时间】:2021-10-01 20:49:29
【问题描述】:

我使用nested_table_type_variable.extend() 来扩展我的嵌套表,然后我将值分配给扩展空间。然而,在我的处理结束时,我看到我的表中添加了许多空白空间,我希望将它们删除。您能否帮助了解我如何从oracle plsql 的嵌套表中删除empty space 行?

【问题讨论】:

  • 请发布您的代码或其简化版本,以证明您遇到的问题。目前我们所能做的就是提供猜测,这只是在浪费大家的时间。

标签: oracle plsql collections


【解决方案1】:

注意:NULL 列表中的值不是空格。当您使用 DELETE 从集合中删除索引时,您会得到空格。

如何从嵌套表中删除空白行?

如果您想删除已删除的元素和NULL 元素,那么您可以编写一个过程来压缩列表:

CREATE PROCEDURE compact_list(
  list IN OUT INT_LIST
)
IS
  i   PLS_INTEGER;
  idx PLS_INTEGER;
  cnt PLS_INTEGER;
BEGIN
  idx := list.FIRST;
  cnt := list.COUNT;
  i   := 1;
  LOOP
    EXIT WHEN i > cnt;
    
    IF list(idx) IS NULL THEN
      cnt := cnt - 1;
    ELSE
      list(i) := list(idx);
      i := i + 1;
    END IF;
    
    idx := list.NEXT(idx);
  END LOOP;

  IF list.COUNT > cnt THEN
    list.TRIM(list.COUNT - cnt);
  END IF;
END;
/

其中,对于示例列表:

DECLARE
  list INT_LIST := INT_LIST(1,2,3,4,5,6,7,NULL,9);
BEGIN
  list.DELETE(3);
  list.DELETE(5);
  list.DELETE(6);

  compact_list(list);
  
  FOR i IN 1 .. list.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE(i || ': ' || list(i));
    NULL;
  END LOOP;
END;
/

压缩列表删除已删除的值和输出:

1: 1
2: 2
3: 4
4: 7
5: 9

如果你想要一个函数,而不是一个过程,那么:

CREATE FUNCTION compact_list_fn(
  i_list IN INT_LIST
) RETURN INT_LIST DETERMINISTIC
IS
  o_list INT_LIST := INT_LIST();
  i      PLS_INTEGER;
  idx    PLS_INTEGER;
  cnt    PLS_INTEGER;
BEGIN
  idx := i_list.FIRST;
  cnt := i_list.COUNT;
  i   := 1;
  LOOP
    EXIT WHEN i > cnt;
    
    IF i_list(idx) IS NULL THEN
      cnt := cnt - 1;
    ELSE
      o_list.EXTEND();
      o_list(i):= i_list(idx);
      i := i + 1;
    END IF;
    
    idx := i_list.NEXT(idx);
  END LOOP;

  RETURN o_list;
END;
/

db小提琴here

【讨论】:

    猜你喜欢
    • 2017-06-03
    • 2012-04-03
    • 2021-07-17
    • 2019-07-13
    • 2017-03-02
    • 1970-01-01
    • 2022-07-19
    • 2011-07-14
    • 1970-01-01
    相关资源
    最近更新 更多