如何遍历 Oracle 中的二进制字符串?

How to iterate over binary string in Oracle?

enter image description here

declare

str varchar2(2000) := :inputstr;
v_len number;
currChar CHAR(1);

begin
                v_len := length(str);
                for i in 1..v_len
                Loop
                        currChar  := substr(str,i,1);
                        if currChar = 1 then
              dbms_output.put_line('curr index' || i);
                        end if;
                End loop;
end;

当我将 '000111000' 作为 IN_STRING 变量的输入传递时,它会修剪字符串并且表现非常 unusually.Please 建议一些迭代二进制字符串的好方法,例如 this.I 我期待上述操作输出为 4,5,6。

编辑1: 请不要直接输入字符串 str varchar2(2000) := '000111000'; 而是像我上面提到的那样从绑定变量输入它。

不应该表现异常,除非 in_string 变量的数据类型是 NUMBER(那么前导零没有任何意义)- 切换到 VARCHAR2.

插图:

  1. NUMBER 个变量数据类型
  2. 您输入的值
  3. 结果 - 真的,缺少前导零


否则,它工作正常(这是 SQL*Plus 所以我使用了替换变量):

SQL> DECLARE
  2     v_length  NUMBER (10);
  3     v_out     VARCHAR2 (20);
  4  BEGIN
  5     v_length := LENGTH ( '&&in_string');
  6
  7     FOR i IN 1 .. v_length
  8     LOOP
  9        v_out := SUBSTR ( '&&in_string', i, 1);
 10        DBMS_OUTPUT.PUT_LINE (v_out);
 11     END LOOP;
 12  END;
 13  /
Enter value for in_string: 00111000
0
0
1
1
1
0
0
0

PL/SQL procedure successfully completed.

另一个选项(如果您对此感兴趣)不需要 PL/SQL:

SQL>     SELECT SUBSTR ( '&&in_string', LEVEL, 1) val
  2        FROM DUAL
  3  CONNECT BY LEVEL <= LENGTH ( '&&in_string');

V
-
0
0
1
1
1
0
0
0

8 rows selected.

SQL>

只要您传入 VARCHAR2 数据类型(而不是 NUMBER),您的代码就可以正常工作。

您还可以整理仅传递一次绑定变量并使用 CONSTANTs 保存常量值的代码:

VARIABLE in_string VARCHAR2;

DECLARE
  c_string CONSTANT VARCHAR2(200) := :in_string;
  c_length CONSTANT PLS_INTEGER := LENGTH(c_string);
  v_out    CHAR(1);
BEGIN
  FOR i IN 1..c_length
  LOOP
    v_out := SUBSTR(c_string,i,1) ;
    DBMS_OUTPUT.PUT_LINE(v_out);
  END LOOP;
END;
/

输出:

0
0
1
1
1
0
0
0

db<>fiddle here