— [FILENAME] db07020065.sql
— [AUTHOR] Christian Chandra
— [WEBSITE] http://blog.christianchandra.com
— [HAL] Tugas Database Administrator
— [JUDUL] Store Procedure Angka Menjadi Bilangan
DROP DATABASE IF EXISTS db07020065;
CREATE DATABASE db07020065;
USE db07020065;
SET
@hasil = ”;
— setting max recursive untuk store procedure (default: 0)
SET @@global.max_sp_recursion_depth=255;
SET @@session.max_sp_recursion_depth=255;
DELIMITER $$
DROP PROCEDURE IF EXISTS angkabilangan$$
CREATE PROCEDURE angkabilangan(IN i_angka BIGINT, OUT o_hasil TEXT)
BEGIN
DECLARE i BIGINT DEFAULT 0;
DECLARE cetak TEXT default ”;
DECLARE tmp TEXT default ”;
DECLARE counts BIGINT DEFAULT 0;
DECLARE lengthangka INT DEFAULT 0;
— hitung banyak digit i_angka
SET lengthangka := LENGTH(i_angka);
— siapkan data yang dibutuhkan
DROP TABLE IF EXISTS tbdasar;
DROP TABLE IF EXISTS tbangka;
DROP TABLE IF EXISTS tbsatuan;
CREATE TEMPORARY TABLE tbdasar(indek INT,dasar VARCHAR(50));
INSERT INTO tbdasar VALUES
(1,’satu’),
(2,’dua’),
(3,’tiga’),
(4,’empat’),
(5,’lima’),
(6,’enam’),
(7,’tujuh’),
(8,’delapan’),
(9,’sembilan’);
CREATE TEMPORARY TABLE tbangka(indek INT,angka INT);
INSERT INTO tbangka VALUES
(0,1000000000),
(1,1000000),
(2,1000),
(3,100),
(4,10),
(5,1);
CREATE TEMPORARY TABLE tbsatuan(indek INT,satuan VARCHAR(100));
INSERT INTO tbsatuan VALUES
(0,’milyar’),
(1,’juta’),
(2,’ribu’),
(3,’ratus’),
(4,’puluh’),
(5,”);
IF i_angka = 0 THEN
SET cetak := ‘nol’;
ELSEIF i_angka < 1000000000000 THEN
WHILE i_angka <> 0 DO
SET counts = FLOOR(i_angka / (SELECT angka FROM tbangka WHERE indek=i));
IF counts > 9 THEN
CALL angkabilangan(counts,tmp);
SET cetak := CONCAT(cetak,”,tmp);
SET cetak := CONCAT(cetak,”,(SELECT satuan FROM tbsatuan WHERE indek=i));
ELSE
IF counts > 0 AND counts < 10 THEN
SET cetak := CONCAT(cetak,
‘ ‘,
(SELECT dasar FROM tbdasar WHERE indek=counts),
‘ ‘,
(SELECT satuan FROM tbsatuan WHERE indek=i));
END IF;
END IF;
— DEBUG counts ! xxx xxx xx x x x
/* SET cetak = CONCAT(cetak,
‘ ‘,
counts,
‘[‘,
i_angka,
‘/’,
(SELECT angka FROM tbangka WHERE indek=i),
‘]’
);*/
SET i_angka = i_angka – ((SELECT angka FROM tbangka WHERE indek=i) * counts);
SET i = i + 1;
END WHILE;
— ubah satu ratus dsb menjadi seratus
SET cetak = REPLACE(cetak,”satu belas”,”sebelas”);
SET cetak = REPLACE(cetak,”satu puluh”,”sepuluh”);
SET cetak = REPLACE(cetak,”satu ratus”,”seratus”);
IF lengthangka = 4 THEN
SET cetak = REPLACE(cetak,”satu ribu”,”seribu”);
END IF;
— ubah belasan
SET cetak = REPLACE(cetak,”sepuluh satu”,”sebelas”);
SET cetak = REPLACE(cetak,”sepuluh dua”,”dua belas”);
SET cetak = REPLACE(cetak,”sepuluh tiga”,”tiga belas”);
SET cetak = REPLACE(cetak,”sepuluh empat”,”empat belas”);
SET cetak = REPLACE(cetak,”sepuluh lima”,”lima belas”);
SET cetak = REPLACE(cetak,”sepuluh enam”,”enam belas”);
SET cetak = REPLACE(cetak,”sepuluh tujuh”,”tujuh belas”);
SET cetak = REPLACE(cetak,”sepuluh delapan”,”delapan belas”);
SET cetak = REPLACE(cetak,”sepuluh sembilan”,”sembilan belas”);
— SET cetak = ‘angka bisa dihitung’;
ELSE
SET cetak := ‘Inputan terlalu besar’;
END IF;
— return value ke o_hasil
SET o_hasil = cetak;
END;
$$
DELIMITER ;