【问题标题】:Validating IBAN in PL/SQL在 PL/SQL 中验证 IBAN
【发布时间】:2011-12-10 02:39:19
【问题描述】:

我正在尝试找到一些现成的代码(是的,我的意思是 teh codez)来验证 PL/SQL 中的 IBAN 帐号。

有人知道一些样品吗?我认为应该有人已经实现了...

谢谢

【问题讨论】:

    标签: oracle validation plsql iban


    【解决方案1】:

    我的修改

    CREATE OR REPLACE FUNCTION MOHF.fn_CheckIBAN(
          pIBAN IN VARCHAR2
        ) RETURN varchar2 IS
          lResult     INTEGER;
          IBAN        VARCHAR2(256);
          IBAN_Digits VARCHAR2(256);
          l_mod       NUMBER;
          lTmp        VARCHAR2(8);
          lSCnt       INTEGER := 5;
          i           INTEGER := 1;
    
    ---
    FUNCTION fn_GetIBANDigits RETURN VARCHAR2 AS
            lChar   VARCHAR2(1);
            lNumber INTEGER;
            lString VARCHAR2(255);
          BEGIN
            FOR i IN 1..LENGTH(IBAN) LOOP
              lChar := SUBSTR(IBAN, i, 1);
              BEGIN
                lNumber := ASCII(lChar);
                IF lNumber > 47 AND lNumber < 58 THEN
                  -- It's number 0 ... 9
                  lString := lString || TO_CHAR(lNumber - 48);
                ELSE
                  lString := lString || TO_CHAR(lNumber - 55);
                END IF;
              END;
            END LOOP;
            RETURN lString; 
            exception  when others then return ( null);
          END fn_GetIBANDigits;
    
    ---
    
         BEGIN
          IBAN := SUBSTR(pIBAN, 5) || SUBSTR(pIBAN, 1, 4);
    
          IBAN_Digits := fn_GetIBANDigits;
    
          LOOP
            lTmp := SUBSTR(IBAN_Digits, i, lSCnt);
            EXIT WHEN lTmp IS NULL;
    
            IF l_mod IS NULL THEN
              l_mod := MOD( TO_NUMBER(lTmp), 97);
            ELSE
              l_mod := MOD(TO_NUMBER( TO_CHAR(l_mod) || lTmp), 97);
            END IF;
    
            i := i + lSCnt;
          END LOOP;
    
          IF l_mod = 1 THEN
            lResult := 1;
          ELSE
            lResult := 0;
          END IF;
    
          RETURN(lResult);
          exception  when others then return ( IBAN); 
        END fn_CheckIBAN;
    /
    

    【讨论】:

    • 您可能想明确指出您的答案与上一个答案的不同之处。
    【解决方案2】:

    如果 IBAN 正确则函数返回 1,如果不正确则返回 0

    CREATE OR REPLACE 
    
        FUNCTION fn_CheckIBAN(
          pIBAN IN VARCHAR2
        ) RETURN INTEGER IS
          lResult     INTEGER;
          IBAN        VARCHAR2(256);
          IBAN_Digits VARCHAR2(256);
          l_mod       NUMBER;
          lTmp        VARCHAR2(8);
          lSCnt       INTEGER := 5;
          i           INTEGER := 1;
    
    ---
    
          FUNCTION fn_GetIBANDigits RETURN VARCHAR2 AS
            lChar   VARCHAR2(1);
            lNumber INTEGER;
            lString VARCHAR2(255);
          BEGIN
            FOR i IN 1..LENGTH(IBAN) LOOP
              lChar := SUBSTR(IBAN, i, 1);
              BEGIN
                lNumber := ASCII(lChar);
                IF lNumber > 47 AND lNumber < 58 THEN
                  -- It's number 0 ... 9
                  lString := lString || TO_CHAR(lNumber - 48);
                ELSE
                  lString := lString || TO_CHAR(lNumber - 55);
                END IF;
              END;
            END LOOP;
            RETURN lString;
          END fn_GetIBANDigits;
    
    ---
    
         BEGIN
          IBAN := SUBSTR(pIBAN, 5) || SUBSTR(pIBAN, 1, 4);
    
          IBAN_Digits := fn_GetIBANDigits;
    
          LOOP
            lTmp := SUBSTR(IBAN_Digits, i, lSCnt);
            EXIT WHEN lTmp IS NULL;
    
            IF l_mod IS NULL THEN
              l_mod := MOD( TO_NUMBER(lTmp), 97);
            ELSE
              l_mod := MOD(TO_NUMBER( TO_CHAR(l_mod) || lTmp), 97);
            END IF;
    
            i := i + lSCnt;
          END LOOP;
    
          IF l_mod = 1 THEN
            lResult := 1;
          ELSE
            lResult := 0;
          END IF;
    
          RETURN(lResult);
        END fn_CheckIBAN;
    

    【讨论】:

      【解决方案3】:

      这个肯定没有版权:

      declare
      as_iban varchar2(34);
      ln_iban number(36, 0);
      begin
          as_iban := 'enter your IBAN here';
      
          ln_iban := to_number(substr(as_iban, 5));
          ln_iban := ln_iban * 100 + (ascii(substr(as_iban, 1, 1)) - 55);
          ln_iban := ln_iban * 100 + (ascii(substr(as_iban, 2, 1)) - 55);
          ln_iban := ln_iban * 100 + to_number(substr(as_iban, 3, 2));
          ln_iban := ln_iban mod 97;
      
          if ln_iban is null or ln_iban <> 1 then 
              raise_application_error(-2e4, 'invalid IBAN: ' || as_iban);
          end if; 
      end;
      /
      

      【讨论】:

      • 欢迎来到 Stack Overflow!不要只发布一段代码,请解释为什么这段代码可以解决所提出的问题。没有解释,这不是答案。
      【解决方案4】:

      快速的谷歌搜索引发了 Alexandre Rodichevski 的一个实现。它受版权保护,所以我不确定使用它是否合法。无论如何,find it here

      【讨论】:

      • 死链接请修复:)
      • @GOXR3PLUS - 这就是 StackOverflow 不赞成“仅链接”响应的原因。由于该线程有一个可接受的答案,我将删除它。
      猜你喜欢
      • 2012-01-12
      • 2019-04-06
      • 2014-01-25
      • 2015-11-19
      • 2014-03-22
      • 2017-10-03
      • 2014-02-19
      • 2016-11-08
      • 1970-01-01
      相关资源
      最近更新 更多