首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >11- PL/SQL中的证明方法

11- PL/SQL中的证明方法
EN

Stack Overflow用户
提问于 2016-05-03 20:42:27
回答 2查看 578关注 0票数 0

荷兰银行帐户由9位数字组成,例如:1334.36.915。为了检查银行账户是否有效,我们使用所谓的‘11-proef’(11-测试)。在此测试中,将每个数字与其在row.The中的位置相乘,并将乘法的结果相加。

代码语言:javascript
复制
(1*9)+(3*8)+(3*7)+(4*6)+(3*5)+(6*4)+(9*3)+(1*2)+(5*1) = R

这个结果必须能被11整除。这意味着除法的余数必须是0。如果R可以被11整除,那么银行帐号是有效的!

有人能帮我回答这个问题吗?

EN

回答 2

Stack Overflow用户

发布于 2016-05-03 21:16:33

荷兰银行账号不再由9位数字组成,我们现在使用Iban号码。如果您想对其进行检查,则应该查看https://en.wikipedia.org/wiki/International_Bank_Account_Number#Validating_the_IBAN并实现该检查。

现在,你仍然可以检查最后9或10位数的11位数,但不能保证将来仍然适用于新的银行账户。

如果你仍然想做一个11-check,你可以创建一个这样的函数:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION elfproof (accountnummer IN varchar2)
   RETURN VARCHAR2
AS
      multiplier int:= 10;
      outcome varchar2(10);
      total int := 0;
BEGIN
   FOR i IN 1 .. 9
   LOOP

     multiplier := multiplier - 1;
      total := total + (multiplier * TO_NUMBER (SUBSTR (accountnummer, i, 1)));

   END LOOP;

   IF MOD (total, 11) = 0
   THEN
      outcome := 'good';
   ELSE
      outcome := 'bad';
   END IF;

   return outcome;
END;
票数 1
EN

Stack Overflow用户

发布于 2016-05-03 21:46:22

这给出了除法的剩余部分为11:

代码语言:javascript
复制
SELECT 
    MOD (SUM (TO_NUMBER (SUBSTR (str, LEVEL, 1)) * (10 - LEVEL)), 11) remdiv11
FROM 
    (
        SELECT 
            REPLACE ('1334.36.915', '.') str 
        FROM 
            DUAL
    ) d
CONNECT BY LEVEL <= LENGTH (str)

和IBAN检查;):

代码语言:javascript
复制
SELECT 
    DECODE (MOD (TO_NUMBER (LISTAGG (n, '') WITHIN GROUP (ORDER BY l)), 97), 1, 'OK', 'Fail') AS iban_check
FROM 
    (
        SELECT 
            TO_CHAR (CASE 
                        WHEN ASCII (c) >= 65 THEN ASCII (c) - 55 
                        ELSE ASCII (c) - 48 END) n, c, l
        FROM 
            (    
                SELECT 
                    SUBSTR (str, LEVEL, 1) c, LEVEL l
                FROM 
                    (
                        SELECT 
                            SUBSTR (s, 5) || SUBSTR (s, 1, 4) str
                        FROM 
                            (
                                SELECT 
                                    REPLACE ('GB82 WEST 1234 5698 7654 32', ' ') s 
                                FROM
                                    DUAL
                            )
                    )
                CONNECT BY LEVEL <= LENGTH (str)
            )
    )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37004486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档