# # Modulus-10 in PostgreSQL 'plpgsql'. # # Tested on: Postgresql 7.x, 8.x # # (Modulus-10 is used for Credit Card number validation, # in Swedish social security numbers, bank account numbers, # organization numbers and more...) # # # Usage: SELECT modulo10( '' ); # # 26th of December, 2005 # http://netilium.org/~mad/ # Martin Adolfsson # CREATE OR REPLACE FUNCTION _modulo10 ( INT4, INT4, TEXT ) RETURNS INT4 AS ' DECLARE VAL INT4; BEGIN IF length($3) < 1 THEN RETURN (($2+(10-($2%10)))-$2)%10; ELSE SELECT INTO VAL (substring($3,1,1)::INT4)*($1+1); IF VAL > 9 THEN VAL := VAL - 9; END IF; RETURN _modulo10( ($1+1)%2, $2+VAL, substring( $3, 2 ) ); END IF; END ' LANGUAGE 'plpgsql'; CREATE OR REPLACE FUNCTION modulo10 ( TEXT ) RETURNS INT4 AS 'SELECT _modulo10( 1, 0, $1 );' LANGUAGE 'sql';