如何遍历 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
.
插图:
- NUMBER 个变量数据类型
- 您输入的值
- 结果 - 真的,缺少前导零
否则,它工作正常(这是 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
),您的代码就可以正常工作。
您还可以整理仅传递一次绑定变量并使用 CONSTANT
s 保存常量值的代码:
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
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
.
插图:
- NUMBER 个变量数据类型
- 您输入的值
- 结果 - 真的,缺少前导零
否则,它工作正常(这是 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
),您的代码就可以正常工作。
您还可以整理仅传递一次绑定变量并使用 CONSTANT
s 保存常量值的代码:
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