Saturday, November 20, 2010

Oracle PL/SQL: ISBN10 Validator

Another little function to make sure you've got a valid ISBN10 before you attempt to convert it.
create or replace
FUNCTION "VALIDATE_ISBN10" (
ISBN10 IN VARCHAR2
) RETURN NUMBER IS

v_checksum NUMBER := 0;
v_digit NUMBER := 0;
v_pos NUMBER := 1;
v_rem NUMBER;

BEGIN
IF (LENGTH(ISBN10) != 10)
THEN RETURN 0;
END IF;

WHILE (v_pos <= 9) LOOP
v_digit := substr(ISBN10,(v_pos),1);
v_checksum := v_checksum + (v_pos * v_digit);
v_pos := v_pos + 1;
END LOOP;
v_rem := mod(v_checksum,11);

IF (v_rem = 10 AND 'X' = substr(ISBN10,10,1))
THEN RETURN 1;
END IF;

IF (v_rem < 10 AND TO_NUMBER(substr(ISBN10,10,1)) = v_rem)
THEN RETURN 1;
END IF;

return 0;
exception when value_error then
return 0;
END VALIDATE_ISBN10;

No comments: