在PL / SQL变量中循环不是游标

J. *_*dam 1 oracle plsql

我正在尝试运行以下循环:

DECLARE
v_banknumber varchar2(9) := '123456789';
v_counter number := 9;
v_result number;
begin
for i in v_banknumber 
loop
    v_result := v_counter * TO_NUMBER(i) + v_result;
    v_counter := v_counter - 1;
 end loop;
 end;
Run Code Online (Sandbox Code Playgroud)

我在第2行出现错误:

Error report -
ORA-06550: line 6, column 10:
PLS-00456: item 'V_BANKNUMBER' is not a cursor
ORA-06550: line 6, column 1:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
Run Code Online (Sandbox Code Playgroud)

如果我读得很好,似乎应该可以。在座的任何人都可以解释我为什么不起作用?

必须将第一个数字乘以9,第二个数字乘以8,第三个数字乘以7,依此类推,并将其总和保存在结果变量中。

Bob*_*ica 5

大概你想做的是

DECLARE
  v_banknumber varchar2(9) := '123456789';
  v_counter number := 9;
  v_result number := 0;
begin
  for i in 1..LENGTH(v_banknumber)
  loop
    v_result := v_counter * TO_NUMBER(SUBSTR(v_banknumber, i, 1)) + v_result;
    v_counter := v_counter - 1;
   end loop;
 end;
Run Code Online (Sandbox Code Playgroud)

得出的结果为165。

祝你好运。

编辑

或者您真的可以使用游标:

DECLARE
  v_banknumber varchar2(9) := '123456789';
  v_counter number := 9;
  v_result number := 0;
begin
  for aRow in (SELECT LEVEL AS I FROM DUAL CONNECT BY LEVEL <= LENGTH(v_banknumber)) 
  loop
    v_result := v_counter * TO_NUMBER(SUBSTR(v_banknumber, aRow.I, 1)) + v_result;
    v_counter := v_counter - 1;
   end loop;
 end;
Run Code Online (Sandbox Code Playgroud)

结果为165。

编辑#2

或者,因为没有像杀伤力这样的杀伤力,您可以在SQL中完成所有操作:

WITH cteBank_number AS (SELECT '123456789' AS BANK_NUMBER FROM DUAL),
     cteI AS (SELECT LEVEL AS I
                FROM DUAL d
                CROSS JOIN cteBank_number b
                CONNECT BY LEVEL <= LENGTH(b.BANK_NUMBER)),
     cteNums AS (SELECT TO_NUMBER(SUBSTR(b.BANK_NUMBER, LENGTH(b.BANK_NUMBER)-i.I+1, 1)) AS DIGIT,
                        i.I AS I,
                        TO_NUMBER(SUBSTR(b.BANK_NUMBER, LENGTH(b.BANK_NUMBER)-i.I+1, 1)) * i.I AS NUM
                   FROM cteBank_number b
                   CROSS JOIN cteI i)
SELECT SUM(NUM)
  FROM cteNums n;
Run Code Online (Sandbox Code Playgroud)

结果仍然产生165。