带有字符串而不是整数的 while 循环

Posted

技术标签:

【中文标题】带有字符串而不是整数的 while 循环【英文标题】:While loops with Strings not Integers 【发布时间】:2019-10-17 01:40:47 【问题描述】:

我无法找到有关 oracle plSQL while 在线字符串循环的任何信息。一切似乎都是整数。在进行研究时,我觉得我了解 plSQL 中 while 循环的整数方面,但我访问过的网站没有涉及或有使用字符串的 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 循环打印单个字符甚至整个字符串;或者可能为我指出正确的方向,即在哪里研究带有在线字符串的循环示例。

谢谢。

【问题讨论】:

Documentation for loops。遗憾的是,没有for s in ('x', 'y', 'z') loop 构造。 【参考方案1】:

您可以完全基于字符编写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】:

是的,它可以使用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.

【讨论】:

我猜整数计数器 c1 的使用有点违背 OP 的要求...循环“使用字符串”而不是整数?【参考方案3】:

您可以在 WHILE 循环中直接使用 SUBSTR,如下所示:

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>

干杯!!

【讨论】:

以上是关于带有字符串而不是整数的 while 循环的主要内容,如果未能解决你的问题,请参考以下文章

while循环 和 运算符

while循环 和 运算符

如何在while循环中读取带有空格的字符串(Java)

为什么for循环中的迭代器是字符串而不是整数?

带有空主体的while循环检查易失性整数-这是啥意思?

LINUX shell 遇到的问题。 我想计算1+2+3+4.到100