I have a table, book_chapters given with following sample data;
chapter_name | chapter_number
A Dead Man | LVI
Imitation | IX
As seen the chapter number are given in Roman numerals. The goal is to get the output in the following form;
chapter_name|chapter_number| cnt
A Dead Man | LVI | 56
Imitation | IX | 9
Here is my attempt at the code;
DELIMITER $$
DROP FUNCTION IF EXISTS primitive $$
CREATE FUNCTION primitive (r VARCHAR(15)) RETURNS INT DETERMINISTIC
BEGIN
DECLARE result INT;
IF r = 'I' THEN
SET result =1;
ELSEIF r = 'V' THEN
SET result =5;
ELSEIF r='X' THEN
SET result=10;
ELSEIF r = 'L' THEN
SET result= 50;
ELSEIF r = 'C' THEN
SET result = 100;
ELSEIF r = 'D' THEN
SET result =500;
ELSEIF r = 'M' THEN
SET result = 1000;
END IF;
RETURN result;
END$$
DELIMITER;
DROP FUNCTION IF EXISTS chapter ;
DELIMITER $$
CREATE FUNCTION chapter(chaptername VARCHAR(20)) RETURNS INT DETERMINISTIC
BEGIN
DECLARE val INT;
DECLARE curr INT;
DECLARE idx VARCHAR(20);
DECLARE chapternum VARCHAR(20);
SET val=0;
SET curr=0;
SET idx='';
SET chapternum= chaptername;
WHILE CHAR_LENGTH(chapternum)>0 DO
SET idx=RIGHT(chapternum,1); /*traverse from the right side*/
SET curr=primitive(idx);
IF curr>=val THEN
SET val= curr+val;
ELSE
SET val= val-curr;
END IF;
SET chapternum=LEFT(chapternum,CHAR_LENGTH(chapternum)-1);/*delete the rightmost char*/
END WHILE;
RETURN val;
END$$
DELIMITER;
DROP PROCEDURE IF EXISTS sortBookChapters;
DELIMITER $$
CREATE PROCEDURE sortBookChapters()
BEGIN
WITH CTE1 AS(
SELECT chapter_name ,
chapter_number AS chaptername
FROM book_chapters
)
SELECT chapter_name, chaptername,chapter(chaptername) AS cnt
FROM CTE1;
END $$
My logic of converting roman to decimal seems to be working, will be happy to get some feedback if there are errors. But I am getting following syntax error right now;
ERROR 1064 (42000) in the pre-written template: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';
CREATE FUNCTION chapter(chaptername VARCHAR(20)) RETURNS INT DETERMINISTIC B' at line 27
Can I get some help to debug this syntax error?