0

所以这里是一个问题:编写代码以获取 id 并确定校验位是否正确

更新代码:

    Set SERVEROUTPUT ON
 DECLARE
      val_num NUMBER := '&user_input';
      holder NUMBER := 0;
      y NUMBER := 0;
      conv_string VARCHAR2(20);
   BEGIN
     conv_string := to_char(val_num*10);
     for x in 1..length(conv_string) loop
       y := to_number(substr(conv_string, -x, 1));
       if mod(x,2) = 0 then
         y := y * 2;
        if y > 9 then
         y := y - 9;
        end if;
       end if;
      holder := holder + y;
    end loop;
    dbms_output.put_line ('Check is '||(11-Mod(holder, 11)));
 END luhn;
   /
 SET SERVEROUTPUT ON

回报是:

SQL> @ loop
Enter value for user_input: 036532
old   2:       val_num NUMBER := '&user_input';
new   2:       val_num NUMBER := '036532';
Check is 2

应该是6

4

2 回答 2

3

实际执行前

SET SERVEROUTPUT ON

使 SQL*Plus 能够获取数据库输出缓冲区。

这是解决方案:https ://community.oracle.com/thread/837639?start=0&tstart=0

于 2015-12-09T03:12:31.650 回答
0

luhn 算法有很多不同的变体,因此查看这些实现和您在评论中的(我认为不完整)描述,我认为这可能与您正在寻找的内容非常接近,并根据 036532 给出正确的校验和你最初的问题。

希望对您有所帮助

Set SERVEROUTPUT ON
 DECLARE
      val_num number := '036532';
      holder NUMBER := 0;
      y NUMBER := 0;
      conv_string VARCHAR2(20);
   BEGIN
     conv_string := to_char(val_num);
     FOR X IN 1..LENGTH(CONV_STRING) LOOP
       Y := TO_NUMBER(SUBSTR(CONV_STRING, -X, 1));
       IF ((X+1) > 10) THEN 
          Y := Y * 10;
       ELSE
          Y := Y * (X + 1);
       END IF;
       IF (Y >= 10) THEN 
          HOLDER := HOLDER + TO_NUMBER(substr(TO_CHAR(Y), 1, 1)) +  TO_NUMBER(substr(TO_CHAR(Y), 2, 1));
       ELSE
          HOLDER := HOLDER + Y;
       END IF;
     END LOOP;

         HOLDER :=  MOD(HOLDER, 11);
         Holder := 11 - mod(holder, 11);
     dbms_output.put_line ('Check is '|| holder);
 END luhn;
   /
 SET SERVEROUTPUT ON 
于 2015-12-10T00:14:38.250 回答