阿里云
发表主题 回复主题
  • 364阅读
  • 8回复

nested table中*.delete与占位符的疑问。

级别: 论坛版主
发帖
131
云币
622



DECLARE

  TYPE ntd IS TABLE OF PLS_INTEGER;

  nt ntd;

  first_value NUMBER;

  last_value NUMBER;



BEGIN

  nt := NTD(1,2,3,4,5,6,7,8,9,10);

  DBMS_OUTPUT.PUT_LINE('nt''s COUNT is: ' || nt.COUNT);

  --输出nt.first和nt.last的value

  first_value := nt.FIRST;

  last_value := nt.LAST;

  DBMS_OUTPUT.PUT_LINE(CHR(10) || 'nt''s FIRST value: ' || first_value || CHR(10) || 'nt''s LAST value: ' || last_value);

  DBMS_OUTPUT.PUT_LINE(CHR(13));


  --循环打印nt

  FOR n IN nt.FIRST .. nt.LAST LOOP

    nt(n) := n;

    DBMS_OUTPUT.PUT_LINE(n || ' nt''s value: ' || nt(n));

  END LOOP;

--标1

  --删除nt中1-10的元素

  nt.delete(1,10);

  DBMS_OUTPUT.PUT_LINE(CHR(10) || nt.COUNT);

--标2

  --输出nt.first和nt.last的value

  first_value := nt.FIRST;

  last_value := nt.LAST;

  DBMS_OUTPUT.PUT_LINE(CHR(10) || 'nt''s FIRST value: ' || first_value || CHR(10) || 'nt''s LAST value: ' || last_value);

--标3

  --为nt(10)赋值并输出

  nt(10) := 10;

  DBMS_OUTPUT.PUT_LINE(CHR(10) || nt(10));

  DBMS_OUTPUT.PUT_LINE(nt.COUNT);


  first_value := nt.FIRST;

  last_value := nt.LAST;

  DBMS_OUTPUT.PUT_LINE(CHR(10) || 'nt''s FIRST value: ' || first_value || CHR(10) || 'nt''s LAST value: ' || last_value);

END;

/

打印结果:

nt's COUNT is: 10


nt's FIRST value: 1

nt's LAST value: 10


1 nt's value: 1

2 nt's value: 2

3 nt's value: 3

4 nt's value: 4

5 nt's value: 5

6 nt's value: 6

7 nt's value: 7

8 nt's value: 8

9 nt's value: 9

10 nt's value: 10


0

--标2的输出:

nt's FIRST value:

nt's LAST value:


10

1


nt's FIRST value: 10

nt's LAST value: 10



问题:

DELETE删除元素后会保留占位符,其中"标1"处删除了1-10的嵌套表中的元素,占位符还在,但是"标2"处的FIST和LAST却无法获得下标,那么在不知道嵌套表

大小的情况下,怎样知道嵌套表中有多少没有元素,但却有占位符的地方的个数和这些占位符的位置呢?

最想知道的就是这里的占位符对代码 对数据库有什么影响?需要去用trim处理掉吗?





级别: *
发帖
*
云币
*





我想到的方法就是EXTEND一下,这样就可以知道*.LAST了,知道了LAST当然就知道嵌套表有多大,那么FIRST也容易确定,PLSQL有*.delete/*.trim/*.count等等的方式有没有类似直接确定嵌套表大小的函数呢?

另外还是 这里的占位符对代码 对数据库有什么影响?需要处理掉吗?


DECLARE

  TYPE ntd IS TABLE OF PLS_INTEGER;

  nt ntd;

  first_value NUMBER;

  last_value NUMBER;

BEGIN

  nt := NTD(1,2,3,4,5,6,7,8,9,10);

  DBMS_OUTPUT.PUT_LINE('nt''s COUNT is: ' || nt.COUNT);

  

  --输出nt.first和nt.last的value

  first_value := nt.FIRST;

  last_value := nt.LAST;

  DBMS_OUTPUT.PUT_LINE(CHR(10) || 'nt''s FIRST value: ' || first_value || CHR(10) || 'nt''s LAST value: ' || last_value);

  DBMS_OUTPUT.PUT_LINE(CHR(13));


  --输出nt.first和nt.last的value

  first_value := nt.FIRST;

  last_value := nt.LAST;

  DBMS_OUTPUT.PUT_LINE(CHR(10) || 'nt''s FIRST value: ' || first_value || CHR(10) || 'nt''s LAST value: ' || last_value);

  

  nt.DELETE(1,11);

  

  DBMS_OUTPUT.PUT_LINE(CHR(10) || 'nt''s COUNT is: ' || nt.COUNT);


  --输出nt.first和nt.last的value

  first_value := nt.FIRST;

  last_value := nt.LAST;

  DBMS_OUTPUT.PUT_LINE(CHR(10) || 'nt''s FIRST value: ' || first_value || CHR(10) || 'nt''s LAST value: ' || last_value);


  nt(5) := 5;

  DBMS_OUTPUT.PUT_LINE(CHR(10) || 'nt(5): ' || nt(5));

  

  nt.EXTEND;

  

  first_value := nt.FIRST;

  last_value := nt.LAST;

  DBMS_OUTPUT.PUT_LINE(CHR(10) || 'nt''s FIRST value: ' || first_value || CHR(10) || 'nt''s LAST value: ' || last_value);

END;

/


输出结果:

nt's COUNT is: 10


nt's FIRST value: 1

nt's LAST value: 10


nt's FIRST value: 1

nt's LAST value: 10


nt's COUNT is: 0


nt's FIRST value:

nt's LAST value:


nt(5): 5


nt's FIRST value: 5

nt's LAST value: 11

级别: *
发帖
*
云币
*


你原来集合赋值,用集合定义的构造函数赋值,其下标是连续的,DELETE之后,集合就变成稀疏的集合,下标不连续,

你所谓的占位符,其实就是指间隔的地方,这个留着对数据库没有影响,对于稀疏集合的访问,可以这样:


SQL> DECLARE

  2    TYPE ntd IS TABLE OF PLS_INTEGER;

  3    nt ntd;

  4    first_value NUMBER;

  5    last_value NUMBER;

  6    l_idx number;

  7  BEGIN

  8    nt := NTD(1,2,3,4,5,6,7,8,9,10);

  9    DBMS_OUTPUT.PUT_LINE('nt''s COUNT is: ' || nt.COUNT);

10  

11    --输出nt.first和nt.last的value

12    first_value := nt.FIRST;

13    last_value := nt.LAST;

14    DBMS_OUTPUT.PUT_LINE(CHR(10) || 'nt''s FIRST value: ' || first_value || CHR(10) || 'nt''s LAST value: ' || last_value);

15    DBMS_OUTPUT.PUT_LINE(CHR(13));

16  

17  

18    nt.DELETE(1,11);

19  

20    DBMS_OUTPUT.PUT_LINE(CHR(10) || 'nt''s COUNT is: ' || nt.COUNT);

21  

22    --输出nt.first和nt.last的value

23    first_value := nt.FIRST;

24    last_value := nt.LAST;

25    DBMS_OUTPUT.PUT_LINE(CHR(10) || 'nt''s FIRST value: ' || first_value || CHR(10) || 'nt''s LAST value: ' || last_value);

26  

27    nt(5) := 5;

28    DBMS_OUTPUT.PUT_LINE(CHR(10) || 'nt(5): ' || nt(5));

29  

30    nt.EXTEND;

31  

32    first_value := nt.FIRST;

33    last_value := nt.LAST;

34    DBMS_OUTPUT.PUT_LINE(CHR(10) || 'nt''s FIRST value: ' || first_value || CHR(10) || 'nt''s LAST value: ' || last_value);

35  

36    DBMS_OUTPUT.PUT_LINE(CHR(10));

37  

38    l_idx := nt.first;

39    while l_idx is not null loop

40      dbms_output.put_line('l_ldx: '||l_idx||','||'nt value:'||nt(l_idx));

41      l_idx := nt.NEXT(l_idx);

42    end loop;

43  

44  END;

45  /

nt's COUNT is: 10


nt's FIRST value: 1

nt's LAST value: 10




nt's COUNT is: 0


nt's FIRST value:

nt's LAST value:


nt(5): 5


nt's FIRST value: 5

nt's LAST value: 11



l_ldx: 5,nt value:5

l_ldx: 11,nt value:

PL/SQL procedure successfully completed


SQL>
级别: *
发帖
*
云币
*



nested table中*.delete与占位符的疑问。-占位符
级别: *
发帖
*
云币
*


嵌套表中有多少没有元素,你可以用  nt.count 判断
级别: *
发帖
*
云币
*


SQL> DECLARE

  2    TYPE ntd IS TABLE OF number;

  3    nt ntd;

  4    first_value NUMBER;

  5    last_value NUMBER;

  6  

  7    l_idx number;

  8  

  9    l_nt2 ntd:=ntd();

10  BEGIN

11    nt := NTD(1,2,3,4,5,6,7,8,9,10);

12    DBMS_OUTPUT.PUT_LINE('nt''s COUNT is: ' || nt.COUNT);

13  

14    --输出nt.first和nt.last的value

15    first_value := nt.FIRST;

16    last_value := nt.LAST;

17    DBMS_OUTPUT.PUT_LINE(CHR(10) || 'nt''s FIRST value: ' || first_value || CHR(10) || 'nt''s LAST value: ' || last_value);

18    DBMS_OUTPUT.PUT_LINE(CHR(13));

19  

20  

21    nt.DELETE(1,11);

22  

23    DBMS_OUTPUT.PUT_LINE(CHR(10) || 'nt''s COUNT is: ' || nt.COUNT);

24  

25    --输出nt.first和nt.last的value

26    first_value := nt.FIRST;

27    last_value := nt.LAST;

28    DBMS_OUTPUT.PUT_LINE(CHR(10) || 'nt''s FIRST value: ' || first_value || CHR(10) || 'nt''s LAST value: ' || last_value);

29  

30    nt(5) := 5;

31    DBMS_OUTPUT.PUT_LINE(CHR(10) || 'nt(5): ' || nt(5));

32  

33    nt.EXTEND;

34  

35    first_value := nt.FIRST;

36    last_value := nt.LAST;

37    DBMS_OUTPUT.PUT_LINE(CHR(10) || 'nt''s FIRST value: ' || first_value || CHR(10) || 'nt''s LAST value: ' || last_value);

38  

39    DBMS_OUTPUT.PUT_LINE(CHR(10));

40  

41  

42    --将集合nt传给l_nt2变为连续

43    l_idx := nt.first;

44    while l_idx is not null loop

45      dbms_output.put_line('l_ldx: '||l_idx||','||'nt value:'||nt(l_idx));

46      l_nt2.extend;

47      l_nt2(l_nt2.last) := nt(l_idx);

48      l_idx := nt.NEXT(l_idx);

49    end loop;

50  

51    for i in l_nt2.first .. l_nt2.last loop

52       dbms_output.put_line(l_nt2(i));

53    end loop;

54  

55  

56  END;

57  /

nt's COUNT is: 10


nt's FIRST value: 1

nt's LAST value: 10




nt's COUNT is: 0


nt's FIRST value:

nt's LAST value:


nt(5): 5


nt's FIRST value: 5

nt's LAST value: 11



l_ldx: 5,nt value:5

l_ldx: 11,nt value:

5


PL/SQL procedure successfully completed


SQL>
级别: *
发帖
*
云币
*


加菲猫已经演示了遍历稀疏集合的经典办法。

补充一下如果你想判断某个位置有没有定义元素,可以用EXISTS方法。
级别: *
发帖
*
云币
*




我想知道的是又多少没有元素,但是存在占位符的这样的占位符有多少?这个怎么确认?
级别: *
发帖
*
云币
*


牛逼的所罗门,已经无心研究这些东西了,除非碰到再看nested table中*.delete与占位符的疑问。-c 占位符
发表主题 回复主题
« 返回列表
«12345678910»
共10页
上一主题下一主题

限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
验证问题: 30 - 19 = ?
上一个 下一个

      版权声明

      开发者论坛为你提供“nested table中*.delete与占位符的疑问。”的内容,论坛中还有更多关于 valuevalueslastlwi firstNT 的内容供你使用,该内容是网友上传,与开发者论坛无关,如果需要删除请联系zixun-group@service.aliyun.com,工作人员会在5个工作日内回复您。