0

我正在尝试使用带有 MOD 条件的简单“WHILE LOOP”在屏幕上打印关联数组的奇数值。可能吗?我知道 PLS_INTEGER 只接受不接受十进制值(如 Java 上的 int 数据类型)。所以......我尝试了一个 NUMBER 计数器,但我收到了相同的结果。我该如何解决?. 谢谢

SET SERVEROUTPUT ON

DECLARE
  TYPE type_test IS TABLE OF VARCHAR2(45)
       INDEX BY PLS_INTEGER;
  t_test_5 type_test;

  v_counter_1 PLS_INTEGER;
  v_counter_2 NUMBER;
BEGIN                      
  t_test_5(1)  := 'Test1';
  t_test_5(2)  := 'Test2';
  t_test_5(3)  := 'Test3';
  t_test_5(4)  := 'Test4';
  t_test_5(5)  := 'Test5';
  t_test_5(6)  := 'Test6';
  t_test_5(7)  := 'Test7';
  t_test_5(8)  := 'Test8';
  t_test_5(9)  := 'Test9';
  t_test_5(10) := 'Test10';

  DBMS_OUTPUT.PUT_LINE('PLS_INTEGER COUNTER TEST');
  v_counter_1 := t_test_5.FIRST;
  WHILE MOD(v_counter_1, 2) <> 0
  LOOP
        DBMS_OUTPUT.PUT_LINE(t_test_5(v_counter_1));

        v_counter_1 := t_test_5.NEXT(v_counter_1);
  END LOOP;

  DBMS_OUTPUT.PUT_LINE('  ');
  DBMS_OUTPUT.PUT_LINE('NUMBER COUNTER TEST');
  v_counter_2 := t_test_5.FIRST;
  WHILE MOD(v_counter_2, 2) <> 0
  LOOP
        DBMS_OUTPUT.PUT_LINE(t_test_5(v_counter_2));

        v_counter_2 := t_test_5.NEXT(v_counter_2);
  END LOOP;
END;

我想在屏幕上检索值 1、3、5、7、9,但在这两种情况下我只检索值 1:

Procedimiento PL/SQL terminado correctamente.
PLS_INTEGER COUNTER TEST
Test1

NUMBER COUNTER TEST
Test1
4

2 回答 2

1

问题不在于变量的类型,而在于您的循环在不匹配的第一行结束MOD(v_counter_1, 2) <> 0,因此没有扫描所有行。

您需要的不是一个结束 whenMOD(v_counter_1, 2) = 0的循环,而是一个扫描所有行的循环,只需打印与您的条件匹配的唯一行的值:

DECLARE
  TYPE type_test IS TABLE OF VARCHAR2(45)
       INDEX BY PLS_INTEGER;
  t_test_5 type_test;

  v_counter_1 PLS_INTEGER;
  v_counter_2 NUMBER;
BEGIN                      
  t_test_5(1)  := 'Test1';
  t_test_5(2)  := 'Test2';
  t_test_5(3)  := 'Test3';
  t_test_5(4)  := 'Test4';
  t_test_5(5)  := 'Test5';
  t_test_5(6)  := 'Test6';
  t_test_5(7)  := 'Test7';
  t_test_5(8)  := 'Test8';
  t_test_5(9)  := 'Test9';
  t_test_5(10) := 'Test10';

  DBMS_OUTPUT.PUT_LINE('PLS_INTEGER COUNTER TEST');
  v_counter_1 := t_test_5.FIRST;
  WHILE v_counter_1 is not null
  LOOP
        if mod(v_counter_1, 2) != 0 then
            DBMS_OUTPUT.PUT_LINE(t_test_5(v_counter_1));
        end if;
        v_counter_1 := t_test_5.NEXT(v_counter_1);
  END LOOP;
END;

结果:

PLS_INTEGER COUNTER TEST
Test1
Test3
Test5
Test7
Test9
于 2017-01-11T15:50:26.520 回答
0

一旦计数器的值为偶数,您的 while 循环就会结束 - 所以一旦达到 2,循环就会结束。您想要的是遍历所有值但跳过偶数值:

WHILE ( v_counter_1 IS NOT NULL )
LOOP
  IF MOD( v_counter_1, 2 ) = 0 THEN
    v_counter_1 := t_test_5.NEXT(v_counter_1);
    CONTINUE;
  END IF;
  DBMS_OUTPUT.PUT_LINE(t_test_5(v_counter_1));
  v_counter_1 := t_test_5.NEXT(v_counter_1);
END LOOP;

如果您不打算使用稀疏数组,则不需要使用关联数组:

DECLARE
  TYPE type_test IS TABLE OF VARCHAR2(45);
  t type_test := type_test( 'Test1', 'Test2', 'Test3', 'Test4', 'Test5', 'Test6' );
BEGIN
  FOR i = 1 .. t.COUNT / 2 LOOP
    DBMS_OUTPUT.PUT_LINE(t(2*i-1));
  END LOOP;
END;
/
于 2017-01-11T15:50:52.703 回答