Проверка IBAN в PL / SQL - PullRequest
3 голосов
/ 18 октября 2011

Я пытаюсь найти какой-нибудь готовый код (да, я имею в виду teh codez) для проверки номера счета IBAN в PL / SQL.

Кто-нибудь знает о некоторых образцах? Я думаю, что кто-то должен был уже реализовать это ...

Спасибо

Ответы [ 4 ]

5 голосов
/ 05 декабря 2012

Этот, безусловно, не защищен авторским правом:

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;
/
2 голосов
/ 26 сентября 2013

Функция возвращает 1, если IBAN верен, и 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;
1 голос
/ 22 октября 2011

Быстрое поиск в Google бросает реализацию Александра Родичевского.Он защищен авторским правом, поэтому я не уверен, законно ли его использовать.В любом случае, найди это здесь .

0 голосов
/ 04 июля 2019
CREATE OR REPLACE FUNCTION generateIBAN(currency IN VARCHAR,check_number IN INTEGER, bank_identifier IN INTEGER, acc_number IN INTEGER)
RETURN VARCHAR
IS
       IBAN VARCHAR2(255);
BEGIN
DECLARE 
   country_code VARCHAR2(255);
   BEGIN
   country_code:=SUBSTR(currency,0,2);
   IBAN:=(country_code || check_number|| bank_identifier || acc_number );
   RETURN IBAN;
 END;   
END;
...