在 PL/SQL 中验证 IBAN
Posted
技术标签:
【中文标题】在 PL/SQL 中验证 IBAN【英文标题】:Validating IBAN in PL/SQL 【发布时间】:2011-12-10 02:39:19 【问题描述】:我正在尝试找到一些现成的代码(是的,我的意思是 teh codez
)来验证 PL/SQL 中的 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 - 这就是 *** 不赞成“仅链接”响应的原因。由于该线程有一个可接受的答案,我将删除它。以上是关于在 PL/SQL 中验证 IBAN的主要内容,如果未能解决你的问题,请参考以下文章