Хотя циклы со строками не целые - PullRequest
1 голос
/ 17 октября 2019

У меня проблемы с поиском какой-либо информации о oracle plSQL во время работы в сети. Все, кажется, целое число. Во время моего исследования я чувствую, что понимаю целочисленный аспект циклов while в plSQL, но ни один из сайтов, которые я посетил, не затрагивал и не имел примеров циклов while, использующих строки.

Например: я могу использовать цикл For дляпечатать отдельные буквы из слова ' text ', но что помешает мне использовать цикл While для получения того же результата?

DECLARE
  c1 Number:= 1;
  c2 Varchar2(4);
BEGIN
  FOR c1 in 1..4
  LOOP
    SELECT substr('text' , c1 , 1 ) into c2 from dual;
    dbms_output.put_line(c2);
  END LOOP;
END;

Если кто-то может объяснить, как можно напечатать отдельный символ или даже всю строку с помощью цикла while;или, возможно, укажет мне правильное направление с точки зрения того, где исследовать пример, пока он работает в сети.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 17 октября 2019

Вы можете написать цикл WHILE, полностью основанный на символах - не нужно никаких счетчиков. Как то так:

declare
  txt varchar2(100);
begin
  txt := 'my text';
  while txt is not null loop
    dbms_output.put_line(substr(txt, 1, 1));  -- or whatever else you need to do
    txt := substr(txt, 2);
  end loop;
end;
/


m
y

t
e
x
t


PL/SQL procedure successfully completed.
2 голосов
/ 17 октября 2019

Да, это может быть записано с использованием цикла WHILE. Важнейшая вещь - это функция length и счетчик. Кроме того, вам не нужен запрос выбора.

SET SERVEROUTPUT ON

DECLARE
     c1 NUMBER := 1;
     txt VARCHAR2(20) := 'text';
BEGIN
     WHILE c1 <= length(txt) LOOP  
          dbms_output.put_line(substr(txt,c1,1));
          c1 := c1 + 1; --increment the counter
     END LOOP;
END;
/

Результат

t
e
x
t

PL/SQL procedure successfully completed.
0 голосов
/ 17 октября 2019

Вы можете использовать SUBSTR в цикле WHILE напрямую следующим образом:

SQL>
SQL> set serverout on
SQL> DECLARE
  2      C1   NUMBER := 1;
  3      C2   VARCHAR2(10) := 'TEXT';
  4  BEGIN
  5      WHILE SUBSTR(C2, C1, 1) IS NOT NULL LOOP
  6          DBMS_OUTPUT.PUT_LINE(SUBSTR(C2, C1, 1));
  7          C1 := C1 + 1;
  8      END LOOP;
  9  END;
 10  /
T
E
X
T

PL/SQL procedure successfully completed.

SQL>

Cheers !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...