65 lines
1.7 KiB
SQL
65 lines
1.7 KiB
SQL
--#SET TERMINATOR @
|
|
|
|
SET SERVEROUTPUT ON@
|
|
|
|
CREATE OR REPLACE FUNCTION CHECK_SEDOL (
|
|
IN TEXT VARCHAR(6)
|
|
) RETURNS VARCHAR(7)
|
|
BEGIN
|
|
DECLARE TYPE SEDOL AS CHAR(1) ARRAY [6];
|
|
--declare text varchar(6) default 'B12345';
|
|
DECLARE WEIGHT SEDOL;
|
|
DECLARE I SMALLINT;
|
|
DECLARE SENTENCE VARCHAR(256);
|
|
DECLARE CHAR_AT CHAR(1);
|
|
DECLARE OUTPUT CHAR(1);
|
|
DECLARE SUM SMALLINT;
|
|
DECLARE CHECK SMALLINT;
|
|
DECLARE INVALID_CHAR CONDITION FOR SQLSTATE '22004' ;
|
|
DECLARE STMT STATEMENT;
|
|
|
|
-- Converts all to upper.
|
|
SET TEXT = UPPER (TEXT);
|
|
-- CALL DBMS_OUTPUT.PUT_LINE(TEXT);
|
|
-- Checks the characters.
|
|
SET I = 1;
|
|
WHILE (I <= 6) DO
|
|
SET CHAR_AT = SUBSTR(TEXT, I, 1);
|
|
-- CALL DBMS_OUTPUT.PUT_LINE('Char ' || CHAR_AT);
|
|
SET SENTENCE = 'SET ? = (SELECT SEDOL FROM (SELECT ''' || CHAR_AT
|
|
|| ''' SEDOL FROM SYSIBM.SYSDUMMY1) WHERE SEDOL IN (''B'',''C'',''D'',''F'',''G'',''H'',''J'','
|
|
|| '''K'',''L'',''M'',''N'',''P'',''Q'',''R'',''S'',''T'',''V'',''W'',''X'',''Y'',''Z'',''0'','
|
|
|| '''1'',''2'',''3'',''4'',''5'',''6'',''7'',''8'',''9''))';
|
|
PREPARE STMT FROM SENTENCE;
|
|
EXECUTE STMT INTO OUTPUT;
|
|
IF (OUTPUT IS NULL) THEN
|
|
SIGNAL INVALID_CHAR;
|
|
END IF;
|
|
SET I = I + 1;
|
|
END WHILE;
|
|
|
|
-- Assigns weight
|
|
SET WEIGHT[1] = '1';
|
|
SET WEIGHT[2] = '3';
|
|
SET WEIGHT[3] = '1';
|
|
SET WEIGHT[4] = '7';
|
|
SET WEIGHT[5] = '3';
|
|
SET WEIGHT[6] = '9';
|
|
|
|
-- Process the SEDOL.
|
|
SET SUM = 0;
|
|
SET I = 1;
|
|
WHILE (I <= 6) DO
|
|
SET CHAR_AT = SUBSTR(TEXT, I, 1);
|
|
IF (ASCII(CHAR_AT) > 65) THEN
|
|
SET SUM = SUM + WEIGHT[I] * (ASCII(CHAR_AT) - 64 + 9);
|
|
ELSE
|
|
SET SUM = SUM + WEIGHT[I] * CHAR_AT;
|
|
END IF;
|
|
SET I = I + 1;
|
|
END WHILE;
|
|
SET CHECK = MOD((10 - MOD(SUM, 10)), 10);
|
|
CALL DBMS_OUTPUT.PUT_LINE(CHECK);
|
|
RETURN TEXT || CHECK;
|
|
END @
|