Created
November 5, 2019 23:25
-
-
Save NielsLiisberg/1a2e9c221a23df1fed964dca7da33e1e to your computer and use it in GitHub Desktop.
SQL modulus 10 LUHN check and calculation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
------------------------------------------------------- | |
-- Implements LUHN modulus 10 for credit card checksum | |
-- Niels Liisberg | |
------------------------------------------------------- | |
create or replace function qusrsys.modulus10 (inString varchar(32)) | |
returns int | |
language sql | |
reads sql data | |
returns null on null input | |
no external action | |
deterministic | |
set option dbgview = *source , output=*print | |
begin atomic | |
declare len int default 0; | |
declare checksum int default 0; | |
declare d int default 0; | |
declare parity int default 0; | |
set len = length(inString); | |
set parity = mod ( len , 2); | |
while len > 0 do | |
set d = int(substring(inString , len ,1)); | |
if mod (len , 2) <> parity then | |
set d = d *2; | |
if d > 9 then | |
set d = d -9; | |
end if; | |
end if; | |
set checksum = checksum + d; | |
set len = len - 1; | |
end while; | |
return mod ( checksum , 10 ) ; | |
end; | |
create or replace function qusrsys.modulus10calculate (inString varchar(32)) | |
returns int | |
language sql | |
reads sql data | |
returns null on null input | |
no external action | |
deterministic | |
set option dbgview = *source , output=*print | |
begin atomic | |
declare len int default 0; | |
declare checksum int default 0; | |
declare d int default 0; | |
declare parity int default 0; | |
set checksum = qusrsys.modulus10( inString concat '0'); | |
if checksum = 0 then | |
return 0; | |
else | |
return 10 - checksum; | |
end if; | |
end; | |
create or replace function qusrsys.modulus10validate (inString varchar(32)) | |
returns int | |
language sql | |
reads sql data | |
returns null on null input | |
no external action | |
deterministic | |
set option dbgview = *source , output=*print | |
begin atomic | |
declare len int default 0; | |
declare checksum int default 0; | |
declare d int default 0; | |
declare parity int default 0; | |
set checksum = qusrsys.modulus10( inString); | |
if checksum = 0 then | |
return 1; | |
else | |
return 0; | |
end if; | |
end; | |
-- This returns 0 | |
values ( | |
qusrsys.modulus10('8527530000345267') | |
); | |
-- This returns 7 | |
values ( | |
qusrsys.modulus10calculate('852753000034526') | |
); | |
-- This returns 1 | |
values ( | |
qusrsys.modulus10validate('8527530000345267') | |
) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment