如何在 PLS_INTEGER 数据类型的 WHILE LOOP 中使用 MOD 函数?
How can I use MOD function within WHILE LOOP with PLS_INTEGER data type?
我正在尝试使用具有 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
问题不在于您的变量类型,而在于您的循环在与 MOD(v_counter_1, 2) <> 0
不匹配的第一行结束,因此没有扫描所有行。
您需要的不是在 MOD(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
只要计数器的值为偶数,您的 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;
/
我正在尝试使用具有 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
问题不在于您的变量类型,而在于您的循环在与 MOD(v_counter_1, 2) <> 0
不匹配的第一行结束,因此没有扫描所有行。
您需要的不是在 MOD(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
只要计数器的值为偶数,您的 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;
/