Trigger runs without errors but does not work - mysql

I created a trigger in mysql, it's no compilation error, but does nothing of what was proposed in it, is not the same as it was called.
Following code.
DELIMITER //
DROP TRIGGER BILHETAGEM_ACERTOS//
CREATE TRIGGER BILHETAGEM_ACERTOS
BEFORE INSERT ON bilhetagem FOR EACH ROW
BEGIN
SET new.bil_canal = LEFT(new.bil_canal,locate('-',new.bil_canal)-1);
SET #plano = 0;
SET #tarifa = 0;
SET #placa = 0;
SET #seq = 0;
SET #canal = 0;
SET #tronco = 0;
SET #troncoplaca = 0;
SET new.bil_gravacao = SUBSTRING(new.bil_gravacao,7);
SELECT SUBSTRING(new.bil_canal, 1, (LOCATE('/', new.bil_canal) -1)) INTO #placa;
IF (#placa = 'Khomp') THEN
SET #canal = RIGHT(new.bil_canal,LENGTH(new.bil_canal) - LOCATE('/', new.bil_canal));
SET #seq = LEFT(#canal, LOCATE('C', #canal) -1);
IF (LOCATE('-', #canal) > 0) THEN
SET #canal = LEFT(#canal, LOCATE('-', #canal) -1);
END IF;
SET #canal = RIGHT(#canal,(LENGTH(#canal) - LOCATE('C', #canal)));
SELECT tro_codigo INTO #tronco FROM troncos_placas where tropla_placa = #seq LIMIT 1;
SELECT tro_placa INTO #tipo FROM troncos where tro_codigo = #tronco LIMIT 1;
SELECT tro_nome INTO #tronco_nome FROM troncos where tro_codigo = #tronco LIMIT 1;
IF (#tipo = 'E1') THEN
SELECT tropla_codigo INTO #troncoplaca FROM troncos_placas where tro_codigo = #tronco LIMIT 1;
ELSE
SELECT tro_codigo INTO #tronco FROM troncos_placas where tropla_placa = #seq and tropla_codigo = #canal LIMIT 1;
SET #troncoplaca = #canal;
END IF;
ELSE
SELECT SUBSTRING(new.bil_canal, (LOCATE('/', new.bil_canal) +1)) INTO #canal;
SELECT tro_codigo INTO #tronco FROM troncos where tro_tipo = #placa and tro_apelido = #canal LIMIT 1;
SET #troncoplaca = 0;
END IF;
IF (LOCATE('B', new.ram_codigo)) THEN
SET new.ram_codigo = #tronco_nome;
END IF;
IF (LOCATE('GATW', new.ram_codigo)) THEN
SET new.ram_codigo = #tronco_nome;
END IF;
SET new.tro_codigo = #tronco;
SET new.tropla_codigo = #troncoplaca;
SELECT pla_codigo INTO #plano FROM ramal where ram_codigo = new.ram_codigo LIMIT 1;
IF #plano > 0 THEN
IF ((LEFT(new.bil_destino,1) > 0) and (LEFT(new.bil_destino,1) <= 5)) THEN
SELECT pla_vlrminutolocalfixo INTO #tarifa FROM planos where pla_codigo = #plano LIMIT 1;
ELSE
IF ((LEFT(new.bil_destino,1) > 5) and (LEFT(new.bil_destino,1) <= 9)) THEN
SELECT pla_vlrminutolocalcelular INTO #tarifa FROM planos where pla_codigo = #plano LIMIT 1;
ELSE
IF (LEFT(new.bil_destino,4) <> '0800') THEN
IF ((SUBSTRING(new.bil_destino,2,1) < 2) and (SUBSTRING(new.bil_destino,4,1) <= 5)) THEN
SELECT pla_vlrminutodddfixo_deestado INTO #tarifa FROM planos where pla_codigo = #plano LIMIT 1;
ELSE
SELECT pla_vlrminutodddfixo_foestado INTO #tarifa FROM planos where pla_codigo = #plano LIMIT 1;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
SET new.pla_codigo = #plano;
SELECT pla_tempo INTO #tempo FROM planos where pla_codigo = #plano LIMIT 1;
SELECT pla_cadencia INTO #cadencia FROM planos where pla_codigo = #plano LIMIT 1;
SET new.pla_tempo = #tempo;
SET new.pla_cadencia = #cadencia;
SET new.bil_tarifabase = #tarifa;
SET new.bil_tarifado = 'S';
SET #relseg = new.bil_duracao;
SET #reldata = DATE(new.bil_dataligacao);
IF ((LENGTH(new.bil_destino) > 4) AND (new.bil_duracao > 0) AND (new.bil_entradasaida <> 'E')) THEN
IF (new.bil_duracao <= #tempo) THEN
SET new.bil_vlrvenda = (#tarifa / 60) * #tempo;
ELSE
SET #valor = (#tarifa / 60) * #cadencia;
SET #tmp = (new.bil_duracao - #tempo);
SET #qtd = 1;
WHILE #tmp > 0 DO
SET #tmp = (#tmp - #cadencia);
SET #qtd = #qtd + 1;
END WHILE;
SET new.bil_vlrvenda = #tarifa + (#valor * #qtd);
END IF;
END IF;
IF (#tronco > 0) THEN
SELECT reltro_segundos INTO #segundos from relatorio_troncos where tro_codigo = #tronco and reltro_dataligacao = #reldata limit 1;
IF ((#segundos > 0) or (#segundos is not null)) THEN
UPDATE relatorio_troncos SET reltro_segundos = (#segundos + #relseg) WHERE tro_codigo = #tronco and reltro_dataligacao = new.bil_dataligacao;
ELSE
INSERT INTO relatorio_troncos (tro_codigo, reltro_dataligacao, reltro_segundos) values (#tronco, #reldata, #relseg);
END IF;
END IF;
END IF;
END//
DELIMITER ;``

Related

Result consisted of more than one row - Procedure

I got this error message:
Result consisted of more than one row
but I check my procedure again and again but I cannot find any problem:
DROP PROCEDURE IF EXISTS SP_Fetch_Returned_With_Serials;
CREATE PROCEDURE `SP_Fetch_Returned_With_Serials`()
BEGIN
DECLARE Num BIGINT UNSIGNED DEFAULT 0;
DECLARE __Product_Id bigint UNSIGNED DEFAULT NULL;
DECLARE __Serials varchar(255) DEFAULT NULL;
DECLARE done INT DEFAULT 0;
DECLARE cur CURSOR FOR
SELECT product_id, serials FROM tmp_table_returned_product_serial;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
START TRANSACTION ;
SET #Document_Id = 0 ;
SET #Product_Id = 0;
SET #Payment_Amount = 0;
OPEN cur;
read_loop:
LOOP
IF done
THEN
LEAVE read_loop;
END IF;
FETCH cur INTO __Product_Id,__Serials;
CALL SP_Separate_Numeric_Values(`__Serials`);
SET #Is_Returnable = 0;
SET #Level_Id = 0;
SET #Free_Day = 0;
SET #Penalty_Percent = 0;
SET #Factor_Type_Id = 0;
SET #Currency_Id = 0;
SET #Customer_Id = 0;
SET #Factor_Id = 0;
SET #Value = 0;
SET #Real_Fee = 0;
SET #Date_At = CURRENT_DATE();
SET #Diff_Days = 0;
SET #New_Factor_Id = 0;
SET #New_Detail_Factor_Id = 0;
SET #Receipt_Remit_Type_Id = 0;
SET #Return_Penalty_Percent = 0;
SET #Return_Penalty_Price = 0;
SET #Document_Number = 0;
SELECT id INTO #Factor_Type_Id FROM Tb_Factor_Types WHERE name = 'back_sale_factor';
SELECT COUNT(NV.Number) INTO #Value FROM Numeric_Values NV;
SELECT TP.is_returnable,
TU.level_id,
currency_id,
customer_id,
VF.id,
VF.product_id,
real_fee,
date_at
INTO #Is_Returnable,#Level_Id,#Currency_Id,#Customer_Id,#Factor_Id,#Product_Id,#Real_Fee,#Date_At
FROM Vw_Factor_Master_Details VF
INNER JOIN Tb_Factor_Detail_Serials TFDS ON TFDS.detail_id = VF.detail_id
INNER JOIN Tb_Products TP ON VF.product_id = TP.id
INNER JOIN Tb_Users TU ON TU.user_id = VF.customer_id
INNER JOIN Numeric_Values NV ON NV.Number = TFDS.serial_id;
IF (#Is_Returnable)
THEN
SET #Product_Title = '';
SET #Error_Msg = '';
SELECT IFNULL(TPT.title, TP.title_en) AS title INTO #Product_Title FROM Tb_Products TP
LEFT JOIN (SELECT title, product_id FROM Tb_Product_Translations WHERE locale = #Locale) TPT
ON TP.id = TPT.product_id WHERE product_id = #Product_Id;
SELECT message INTO #Error_Msg FROM Tb_Errors WHERE error_code = 1000028 AND locale = #Locale;
SET #Error_Msg = REPLACE(#Error_Msg, ':product', #Product_Title);
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = #Error_Msg;
END IF;
SELECT DATEDIFF(CURRENT_DATE(), #Date_At) INTO #Diff_Days;
SELECT MAX(`number`) INTO Num FROM Tb_Factors WHERE year_id = #Fiscal_Year AND type = 'sale_factor';
SET Num = ifnull(Num, 0) + 1;
SELECT JSON_EXTRACT(JSON_EXTRACT(TS.value, CONCAT('$.', #Level_Id)), '$.free_day')
INTO #Free_Day
FROM Tb_Settings TS
WHERE `key` = 'returned_product';
SELECT JSON_EXTRACT(JSON_EXTRACT(TS.value, CONCAT('$.', #Level_Id)), '$.penalty_percent')
INTO #Penalty_Percent
FROM Tb_Settings TS
WHERE `key` = 'returned_product';
IF (#Diff_Days > #Free_Day)
THEN
SET #Payment_Amount = #Payment_Amount + ((#Real_Fee - (#Real_Fee * #Penalty_Percent / 100)) * #Value);
SET #Return_Penalty_Percent = #Penalty_Percent;
SET #Return_Penalty_Price = #Real_Fee * #Penalty_Percent / 100;
END IF;
IF(#New_Factor_Id = 0)
THEN
INSERT INTO Tb_Factors (type, sale_place, product_type, company_id, branch_id, cash_desk_id, type_id, year_id,
currency_id, finaler_id, signature_id, customer_id, final_at, signature_at,
reference_factor_id, creator_id, number)
VALUES ('sale_factor', 'branch', 'product', #Company, #Branch_Id, NULL, #Factor_Type_Id, #Fiscal_Year,
#Currency_Id, #Auth_User, #Auth_User, #Customer_Id, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP(),
#Factor_Id, #Auth_User, Num);
SET #New_Factor_Id = LAST_INSERT_ID();
END IF;
INSERT INTO Tb_Factor_Details (product_id, value, real_fee, fee, factor_id, creator_id, return_penalty_percent,
return_penalty_price)
VALUES (#Product_Id, #Value, #Real_Fee, #Real_Fee, #New_Factor_Id, #Auth_User, #Penalty_Percent,
#Return_Penalty_Price);
SET #New_Detail_Factor_Id = LAST_INSERT_ID();
INSERT INTO Tb_Factor_Detail_Serials (serial_id, detail_id)
SELECT NV.Number, #New_Detail_Factor_Id FROM Numeric_Values NV;
SELECT id INTO #Receipt_Remit_Type_Id FROM Tb_Receipt_Remit_Types WHERE name = 'return_of_sales';
SET #Warehouse_Id = 0;
SELECT id INTO #Warehouse_Id FROM Tb_Warehouses WHERE warehouse_branch_id = #Branch_Id LIMIT 1;
IF(#Document_Id = 0)
THEN
SELECT document_number
FROM Tb_Documents
WHERE fiscal_year_id = #Fiscal_Year
ORDER BY document_number DESC
LIMIT 1
INTO #Document_Number;
SET #Document_Number = #Document_Number + 1;
INSERT INTO Tb_Documents (type, factor_id, warehouse_id, receipt_remit_type_id, fiscal_year_id, document_number,
creator_id)
VALUES ('receipt', #New_Factor_Id, #Warehouse_Id, #Receipt_Remit_Type_Id, #Fiscal_Year, #Document_Number,
#Auth_User);
SET #Document_Id = LAST_INSERT_ID();
END IF;
INSERT INTO Tb_Document_Details (product_id, value, confirmed_at, confirmed_by, creator_id, document_id)
VALUES (#Product_Id, #Value, CURRENT_TIMESTAMP(), #Auth_User, #Auth_User, #Document_Id);
SET #Document_Detail_Id = LAST_INSERT_ID();
INSERT INTO Tb_Detail_Serial_Numbers (serial_number_id, detail_id, origin_cost_center_id, confirmed_at,
confirmed_by)
SELECT NV.Number, #Document_Detail_Id,NULL,CURRENT_TIMESTAMP(),#Auth_User FROM Numeric_Values NV;
END LOOP;
CLOSE cur;
SET #Type_Id = 0;
SELECT id INTO #Type_Id FROM Tb_Payment_Types WHERE name = 'cash' LIMIT 1;
INSERT INTO Tb_Receive_Payment (model_type, model_id, factor_id, type_id, receive_amount, payment_amount,year_id,creator_id)
VALUES ('cashdesk', NULL, #New_Factor_Id, #Type_Id, 0, #Payment_Amount,#Fiscal_Year,#Auth_User);
SET #Payment_Id = LAST_INSERT_ID();
SELECT #Factor_Id as factor_id,#Payment_Id as payment_id,#Payment_Amount as payment_amount;
COMMIT;
END

How to two used while Syntax in Mysql Procecure

I would like to write two While Syntax.
The results I expect are as follows.
when 'H'
tagName1, tagName2, tagname3
when 'D'
tagName1, tagName2, tagname3
when 'M'
tagName1, tagName2, tagname3
when 'Y'
tagName1, tagName2, tagname3
But it didn't worked....
Below is the code that I wrote, while I play it only once.
Any advice, please..
DECLARE tagList varchar(255) DEFAULT 'tagName1,tagName2,tagName3';
DECLARE tagTypeList varchar(150) DEFAULT 'H,D,M,Y';
WHILE tagTypeList != '' DO
WHILE tagList != '' DO
SET tagNameArray = SUBSTRING_INDEX(tagList, ',', 1);
SET tagTypeArray = SUBSTRING_INDEX(tagTypeList, ',', 1);
IF(tagTypeArray = 'H') THEN
SET aDate = (SELECT (DATE_ADD(nDateTime, INTERVAL -1 HOUR)));
SET ago_Y = (SELECT DATE_FORMAT(aDate,'%Y'));
SET ago_M = (SELECT DATE_FORMAT(aDate,'%m'));
SET ago_D = (SELECT DATE_FORMAT(aDate,'%d'));
SET ago_H = (SELECT DATE_FORMAT(aDate,'%H'));
SET ago_W = (SELECT DATE_FORMAT(aDate,'%w'));
ELSEIF(tagTypeArray = 'D') THEN
SET aDate = (SELECT (DATE_ADD(nDateTime, INTERVAL -1 DAY)));
SET ago_Y = (SELECT DATE_FORMAT(aDate,'%Y'));
SET ago_M = (SELECT DATE_FORMAT(aDate,'%m'));
SET ago_D = (SELECT DATE_FORMAT(aDate,'%d'));
SET ago_H = 0;
SET ago_W = 0;
ELSEIF(tagTypeArray = 'M') THEN
SET aDate = (SELECT (DATE_ADD(nDateTime, INTERVAL -1 MONTH)));
SET ago_Y = (SELECT DATE_FORMAT(aDate,'%Y'));
SET ago_M = (SELECT DATE_FORMAT(aDate,'%m'));
SET ago_D = 0;
SET ago_H = 0;
SET ago_W = 0;
ELSEIF(tagTypeArray = 'Y') THEN
SET aDate = (SELECT (DATE_ADD(nDateTime, INTERVAL -1 YEAR)));
SET ago_Y = (SELECT DATE_FORMAT(aDate,'%Y'));
SET ago_M = 0;
SET ago_D = 0;
SET ago_H = 0;
SET ago_W = 0;
END IF;
SET selectValue = (SELECT tagvalue FROM datasource WHERE tagname = tagNameArray and tagtype = tagTypeArray and y=ago_Y and m=ago_M and d=ago_D and h=ago_H);
IF(selectValue IS NULL OR selectValue = '')
THEN
SET old_Value_3M = (Select LastValue from BwAnalogTable where TagName = tagNameArray and LogDate >= ago_3M order by LogDate desc, LogTime desc limit 1);
# Here Insert Querty
END IF;
IF LOCATE(',', tagList) > 0 THEN
SET tagList = SUBSTRING(tagList, LOCATE(',', tagList) + 1);
ELSE
SET tagList = '';
END IF;
END WHILE;
IF LOCATE(',', tagTypeList) > 0 THEN
SET tagTypeList = SUBSTRING(tagTypeList, LOCATE(',', tagTypeList) + 1);
ELSE
SET tagTypeList = '';
END IF;
END WHILE;
I have modified the code as shown below.
DECLARE done INT DEFAULT FALSE;
DECLARE tagType2 VARCHAR(255) DEFAULT '';
DECLARE tagName2 VARCHAR(255) DEFAULT '';
DECLARE tagType_Cur CURSOR for select tagType from tbtagtype;
DECLARE tagName_Cur CURSOR for select tagName from tbtaglist;
OPEN tagType_Cur;
LOOP1: LOOP
FETCH tagType_Cur INTO tagType2;
IF done THEN
CLOSE tagType_Cur;
LEAVE LOOP1;
END IF;
########## here insert your core query ###############
OPEN tagName_Cur;
LOOP2: LOOP
FETCH tagName_Cur INTO tagName2;
IF done THEN
CLOSE tagName_Cur;
SET done = FALSE;
LEAVE LOOP2;
END IF;
########## here insert your core query ###############
END LOOP LOOP2;
END LOOP LOOP1;

Rewrite MySQL Trigger to Postgres

guys!
I have a trigger in MySQL database:
CREATE DEFINER="root"#"127.0.0.1" TRIGGER `tai_actions_for_active_count` AFTER INSERT ON `actions` FOR EACH ROW BEGIN
DECLARE l_isnn TINYTEXT;
IF NEW.action_type IN ('CREATION', 'VERIFICATION', 'CLOSE') THEN
SET l_isnn = IF(NEW.isnn is NULL, '*', NEW.isnn);
IF NOT NEW.action_type = 'CLOSE' THEN
INSERT INTO subscriptions.`statistics_active_count`(`service_id`, `operator_id`, `isnn`, `active_count`)
VALUES (NEW.service_id, NEW.operator_id, l_isnn, 1)
ON DUPLICATE KEY UPDATE active_count = active_count + 1;
ELSE
SET #tai_actions_for_active_count = -1;
UPDATE subscriptions.`statistics_active_count` SET active_count = #tai_actions_for_active_count := active_count - 1
WHERE `service_id` = NEW.service_id AND `operator_id` = NEW.operator_id AND `isnn` = l_isnn;
IF #tai_actions_for_active_count = 0 THEN DELETE FROM subscriptions.`statistics_active_count` WHERE `active_count` = 0; END IF;
END IF;
END IF;
END
So I need to rewrite it to make it works in Postgres database. As there's ON DUPLICATE KEY UPDATE I'm using Postgres version 9.5 with UPSERT (ON CONFLICT (KEY) DO UPDATE).
So I poorly know SQL language can you tell me what I'm doing wrong? There's the Postgres PL code:
DECLARE
l_isnn TEXT;
tai_actions_for_active_count INTEGER;
BEGIN
IF NEW.action_type IN ('CREATION', 'VERIFICATION', 'CLOSE') THEN
IF NEW.isnn is NULL THEN
l_isnn := '*';
ELSE
l_isnn := NEW.isnn;
END IF;
IF NOT NEW.action_type = 'CLOSE' THEN
INSERT INTO "subscriptions.statistics_active_count"(service_id, operator_id, isnn, active_count)
VALUES (NEW.service_id, NEW.operator_id, l_isnn, 1)
ON CONFLICT(active_count) DO UPDATE SET active_count = active_count + 1;
ELSE
tai_actions_for_active_count := -1;
UPDATE "subscriptions.statistics_active_count" SET active_count = active_count - 1
-- (tai_actions_for_active_count := active_count - 1)
WHERE service_id = NEW.service_id AND operator_id = NEW.operator_id AND isnn = l_isnn;
UPDATE "subscriptions.statistics_active_count" SET tai_actions_for_active_count = active_count
WHERE service_id = NEW.service_id AND operator_id = NEW.operator_id AND isnn = l_isnn;
IF tai_actions_for_active_count = 0 THEN DELETE FROM "subscriptions.statistics_active_count" WHERE active_count = 0; END IF;
END IF;
END IF;
RETURN NULL;
END;
As I want to test this trigger I'm getting an error -- relation "subscriptions.statistics_active_count" does not exist
Can you help me with that code?
Finally I've got the solution. I guess :)
BEGIN
IF NEW.action_type IN ('CREATION', 'VERIFICATION', 'CLOSE') THEN
IF NEW.isnn IS NULL THEN
l_isnn := '*';
ELSE
l_isnn := NEW.isnn;
END IF;
IF NOT NEW.action_type = 'CLOSE' THEN
BEGIN
INSERT INTO subscriptions.statistics_active_count (service_id, operator_id, isnn, active_count)
VALUES (NEW.service_id, NEW.operator_id, l_isnn, 1);
EXCEPTION WHEN unique_violation THEN
UPDATE subscriptions.statistics_active_count SET active_count = active_count + 1
WHERE service_id = NEW.service_id and operator_id=NEW.operator_id;
END;
ELSE
tai_actions_for_active_count := -1;
WITH upd AS
(UPDATE subscriptions.statistics_active_count
SET active_count = active_count - 1
WHERE service_id = NEW.service_id AND operator_id = NEW.operator_id AND isnn = l_isnn;
RETURNING active_count)
SELECT *
FROM upd INTO tai_actions_for_active_count;
IF tai_actions_for_active_count = 0 THEN
DELETE FROM public.statistics_active_count
WHERE active_count = 0;
END IF;
END IF;
END IF;
END;

How to get data from table to variable with select in event?

I have the event
CREATE EVENT `start_insert_record_to_inout` ON SCHEDULE EVERY 10 SECOND STARTS '2014-07-12 12:07:00'
ON COMPLETION PRESERVE
ENABLE
COMMENT 'comment'
DO BEGIN
DECLARE `_count` INT DEFAULT 0;
DECLARE `_done` INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = 1;
SELECT `count` INTO `_count`
FROM state_execution
WHERE name = 'insert_record_to_inout' AND `type` = 'event'
LIMIT 1;
-- AND `type` = 'event';
IF _done THEN
INSERT INTO state_execution (`name`, `type`, `isUsed`,`count`) VALUES ('insert_record_to_inout', 'event','0',0);
END IF;
IF `_count` < 50 THEN
IF _done THEN
SET `_count` = 1;
SET _done = 0;
ELSE
SET `_count` = `_count` + 1;
END IF;
UPDATE state_execution SET `count` = `_count`
WHERE name = 'insert_record_to_inout' AND `type` = 'event';
call insert_record_to_inout();
SELECT `count` INTO `_count`
FROM state_execution
WHERE name = 'insert_record_to_inout' AND `type` = 'event'
LIMIT 1;
IF _done THEN
SET `_count` = 0;
ELSE
SET `_count` = `_count` - 1;
END IF;
UPDATE state_execution SET `count` = `_count` WHERE name = 'insert_record_to_inout' AND `type` = 'event';
END IF;
END
But this code
SELECT `count` INTO `_count`
FROM state_execution
WHERE name = 'insert_record_to_inout' AND `type` = 'event'
LIMIT 1;
not working. Please help me, thanks.

how to solve access denied into my mysql database

I don't know when I run the following code in phpMyAdmin
SET GLOBAL log_bin_trust_function_creators = 1;
-- ----------------------------
-- Function structure for `__mydiv`
-- ----------------------------
DROP FUNCTION IF EXISTS `__mydiv`;
DELIMITER ;;
CREATE FUNCTION `__mydiv`(`a` int, `b` int) RETURNS bigint(20)
BEGIN
return FLOOR(a / b);
END;;
DELIMITER ;
-- ----------------------------
-- Function structure for `__mymod`
-- ----------------------------
DROP FUNCTION IF EXISTS `__mymod`;
DELIMITER ;;
CREATE FUNCTION `__mymod`(`a` int, `b` int) RETURNS bigint(20)
BEGIN
return (a - b * FLOOR(a / b));
END;;
DELIMITER ;
-- ----------------------------
-- Function structure for `_gdmarray`
-- ----------------------------
DROP FUNCTION IF EXISTS `_gdmarray`;
DELIMITER ;;
CREATE FUNCTION `_gdmarray`(`m` smallint) RETURNS smallint(2)
BEGIN
CASE m
WHEN 0 THEN RETURN 31;
WHEN 1 THEN RETURN 28;
WHEN 2 THEN RETURN 31;
WHEN 3 THEN RETURN 30;
WHEN 4 THEN RETURN 31;
WHEN 5 THEN RETURN 30;
WHEN 6 THEN RETURN 31;
WHEN 7 THEN RETURN 31;
WHEN 8 THEN RETURN 30;
WHEN 9 THEN RETURN 31;
WHEN 10 THEN RETURN 30;
WHEN 11 THEN RETURN 31;
END CASE;
END;;
DELIMITER ;
-- ----------------------------
-- Function structure for `_jdmarray`
-- ----------------------------
DROP FUNCTION IF EXISTS `_jdmarray`;
DELIMITER ;;
CREATE FUNCTION `_jdmarray`(`m` smallint) RETURNS smallint(2)
BEGIN
CASE m
WHEN 0 THEN RETURN 31;
WHEN 1 THEN RETURN 31;
WHEN 2 THEN RETURN 31;
WHEN 3 THEN RETURN 31;
WHEN 4 THEN RETURN 31;
WHEN 5 THEN RETURN 31;
WHEN 6 THEN RETURN 30;
WHEN 7 THEN RETURN 30;
WHEN 8 THEN RETURN 30;
WHEN 9 THEN RETURN 30;
WHEN 10 THEN RETURN 30;
WHEN 11 THEN RETURN 29;
END CASE;
END;;
DELIMITER ;
-- ----------------------------
-- Function structure for `_jdmarray2`
-- ----------------------------
DROP FUNCTION IF EXISTS `_jdmarray2`;
DELIMITER ;;
CREATE FUNCTION `_jdmarray2`(`m` smallint) RETURNS smallint(2)
BEGIN
CASE m
WHEN 1 THEN RETURN 31;
WHEN 2 THEN RETURN 31;
WHEN 3 THEN RETURN 31;
WHEN 4 THEN RETURN 31;
WHEN 5 THEN RETURN 31;
WHEN 6 THEN RETURN 31;
WHEN 7 THEN RETURN 30;
WHEN 8 THEN RETURN 30;
WHEN 9 THEN RETURN 30;
WHEN 10 THEN RETURN 30;
WHEN 11 THEN RETURN 30;
WHEN 12 THEN RETURN 29;
END CASE;
END;;
DELIMITER ;
-- ----------------------------
-- Function structure for `pdate`
-- ----------------------------
DROP FUNCTION IF EXISTS `pdate`;
DELIMITER ;;
CREATE FUNCTION `pdate`(`gdate` datetime) RETURNS char(100) CHARSET utf8
BEGIN
DECLARE
i,
gy, gm, gd,
g_day_no, j_day_no, j_np,
jy, jm, jd INT DEFAULT 0; /* Can be unsigned int? */
DECLARE resout char(100);
DECLARE ttime CHAR(20);
SET gy = YEAR(gdate) - 1600;
SET gm = MONTH(gdate) - 1;
SET gd = DAY(gdate) - 1;
SET ttime = TIME(gdate);
SET g_day_no = ((365 * gy) + __mydiv(gy + 3, 4) - __mydiv(gy + 99, 100) + __mydiv (gy + 399, 400));
SET i = 0;
WHILE (i < gm) do
SET g_day_no = g_day_no + _gdmarray(i);
SET i = i + 1;
END WHILE;
IF gm > 1 and ((gy % 4 = 0 and gy % 100 <> 0)) or gy % 400 = 0 THEN
SET g_day_no = g_day_no + 1;
END IF;
SET g_day_no = g_day_no + gd;
SET j_day_no = g_day_no - 79;
SET j_np = j_day_no DIV 12053;
SET j_day_no = j_day_no % 12053;
SET jy = 979 + 33 * j_np + 4 * __mydiv(j_day_no, 1461);
SET j_day_no = j_day_no % 1461;
IF j_day_no >= 366 then
SET jy = jy + __mydiv(j_day_no - 1, 365);
SET j_day_no = (j_day_no - 1) % 365;
END IF;
SET i = 0;
WHILE (i < 11 and j_day_no >= _jdmarray(i)) do
SET j_day_no = j_day_no - _jdmarray(i);
SET i = i + 1;
END WHILE;
SET jm = i + 1;
SET jd = j_day_no + 1;
SET resout = CONCAT_WS ('-', jy, jm, jd);
IF (ttime <> '00:00:00') then
SET resout = CONCAT_WS(' ', resout, ttime);
END IF;
RETURN resout;
END;;
DELIMITER ;
-- ----------------------------
-- Function structure for `PMONTH`
-- ----------------------------
DROP FUNCTION IF EXISTS `PMONTH`;
DELIMITER ;;
CREATE FUNCTION `PMONTH`(`gdate` datetime) RETURNS char(100) CHARSET utf8
BEGIN
DECLARE
i,
gy, gm, gd,
g_day_no, j_day_no, j_np,
jy, jm, jd INT DEFAULT 0; /* Can be unsigned int? */
DECLARE resout char(100);
DECLARE ttime CHAR(20);
SET gy = YEAR(gdate) - 1600;
SET gm = MONTH(gdate) - 1;
SET gd = DAY(gdate) - 1;
SET ttime = TIME(gdate);
SET g_day_no = ((365 * gy) + __mydiv(gy + 3, 4) - __mydiv(gy + 99, 100) + __mydiv(gy + 399, 400));
SET i = 0;
WHILE (i < gm) do
SET g_day_no = g_day_no + _gdmarray(i);
SET i = i + 1;
END WHILE;
IF gm > 1 and ((gy % 4 = 0 and gy % 100 <> 0)) or gy % 400 = 0 THEN
SET g_day_no = g_day_no + 1;
END IF;
SET g_day_no = g_day_no + gd;
SET j_day_no = g_day_no - 79;
SET j_np = j_day_no DIV 12053;
set j_day_no = j_day_no % 12053;
SET jy = 979 + 33 * j_np + 4 * __mydiv(j_day_no, 1461);
SET j_day_no = j_day_no % 1461;
IF j_day_no >= 366 then
SET jy = jy + __mydiv(j_day_no - 1, 365);
SET j_day_no =(j_day_no - 1) % 365;
END IF;
SET i = 0;
WHILE (i < 11 and j_day_no >= _jdmarray(i)) do
SET j_day_no = j_day_no - _jdmarray(i);
SET i = i + 1;
END WHILE;
SET jm = i + 1;
SET jd = j_day_no + 1;
RETURN jm;
END;;
DELIMITER ;
-- ----------------------------
-- Function structure for `pmonthname`
-- ----------------------------
DROP FUNCTION IF EXISTS `pmonthname`;
DELIMITER ;;
CREATE FUNCTION `pmonthname`(`gdate` datetime) RETURNS varchar(100) CHARSET utf8
BEGIN
CASE PMONTH(gdate)
WHEN 1 THEN RETURN 'ÝÑæÑÏíä';
WHEN 2 THEN RETURN 'ÇÑÏíÈåÔÊ';
WHEN 3 THEN RETURN 'ÎÑÏÇÏ';
WHEN 4 THEN RETURN '撄';
WHEN 5 THEN RETURN 'ãÑÏÇÏ';
WHEN 6 THEN RETURN 'ÔåÑíæÑ';
WHEN 7 THEN RETURN 'ãåÑ';
WHEN 8 THEN RETURN 'ÂÈÇä';
WHEN 9 THEN RETURN 'ÂÐÑ';
WHEN 10 THEN RETURN 'Ïí';
WHEN 11 THEN RETURN 'Èåãä';
WHEN 12 THEN RETURN 'ÇÓÝäÏ';
END CASE;
END;;
DELIMITER ;
-- ----------------------------
-- Function structure for `pyear`
-- ----------------------------
DROP FUNCTION IF EXISTS `pyear`;
DELIMITER ;;
CREATE FUNCTION `pyear`(`gdate` datetime) RETURNS char(100) CHARSET utf8
BEGIN
DECLARE
i,
gy, gm, gd,
g_day_no, j_day_no, j_np,
jy, jm, jd INT DEFAULT 0; /* Can be unsigned int? */
DECLARE resout char(100);
DECLARE ttime CHAR(20);
SET gy = YEAR(gdate) - 1600;
SET gm = MONTH(gdate) - 1;
SET gd = DAY(gdate) - 1;
SET ttime = TIME(gdate);
SET g_day_no = ((365 * gy) + __mydiv(gy + 3, 4) - __mydiv(gy + 99, 100) + __mydiv(gy + 399, 400));
SET i = 0;
WHILE (i < gm) do
SET g_day_no = g_day_no + _gdmarray(i);
SET i = i + 1;
END WHILE;
IF gm > 1 and ((gy % 4 = 0 and gy % 100 <> 0)) or gy % 400 = 0 THEN
SET g_day_no = g_day_no + 1;
END IF;
SET g_day_no = g_day_no + gd;
SET j_day_no = g_day_no - 79;
SET j_np = j_day_no DIV 12053;
set j_day_no = j_day_no % 12053;
SET jy = 979 + 33 * j_np + 4 * __mydiv(j_day_no, 1461);
SET j_day_no = j_day_no % 1461;
IF j_day_no >= 366 then
SET jy = jy + __mydiv(j_day_no - 1, 365);
SET j_day_no = (j_day_no - 1) % 365;
END IF;
SET i = 0;
WHILE (i < 11 and j_day_no >= _jdmarray(i)) do
SET j_day_no = j_day_no - _jdmarray(i);
SET i = i + 1;
END WHILE;
SET jm = i + 1;
SET jd = j_day_no + 1;
RETURN jy;
END;;
DELIMITER ;
-- ----------------------------
-- Function structure for `pday`
-- ----------------------------
DROP FUNCTION IF EXISTS `pday`;
DELIMITER ;;
CREATE FUNCTION `pday`(`gdate` datetime) RETURNS char(100) CHARSET utf8
BEGIN
DECLARE
i,
gy, gm, gd,
g_day_no, j_day_no, j_np,
jy, jm, jd INT DEFAULT 0; /* Can be unsigned int? */
DECLARE resout char(100);
DECLARE ttime CHAR(20);
SET gy = YEAR(gdate) - 1600;
SET gm = MONTH(gdate) - 1;
SET gd = DAY(gdate) - 1;
SET ttime = TIME(gdate);
SET g_day_no = ((365 * gy) + __mydiv(gy + 3, 4) - __mydiv(gy + 99 , 100) + __mydiv(gy + 399, 400));
SET i = 0;
WHILE (i < gm) do
SET g_day_no = g_day_no + _gdmarray(i);
SET i = i + 1;
END WHILE;
IF gm > 1 and ((gy % 4 = 0 and gy % 100 <> 0)) or gy % 400 = 0 THEN
SET g_day_no = g_day_no + 1;
END IF;
SET g_day_no = g_day_no + gd;
SET j_day_no = g_day_no - 79;
SET j_np = j_day_no DIV 12053;
SET j_day_no = j_day_no % 12053;
SET jy = 979 + 33 * j_np + 4 * __mydiv(j_day_no, 1461);
SET j_day_no = j_day_no % 1461;
IF j_day_no >= 366 then
SET jy = jy + __mydiv(j_day_no - 1, 365);
SET j_day_no = (j_day_no-1) % 365;
END IF;
SET i = 0;
WHILE (i < 11 and j_day_no >= _jdmarray(i)) do
SET j_day_no = j_day_no - _jdmarray(i);
SET i = i + 1;
END WHILE;
SET jm = i + 1;
SET jd = j_day_no + 1;
RETURN jd;
END;;
DELIMITER ;
-- ----------------------------
-- Function structure for `_gdmarray2`
-- ----------------------------
DROP FUNCTION IF EXISTS `_gdmarray2`;
DELIMITER ;;
CREATE FUNCTION `_gdmarray2`(`m` smallint, `k` SMALLINT) RETURNS smallint(2)
BEGIN
CASE m
WHEN 0 THEN RETURN 31;
WHEN 1 THEN RETURN 28+k;
WHEN 2 THEN RETURN 31;
WHEN 3 THEN RETURN 30;
WHEN 4 THEN RETURN 31;
WHEN 5 THEN RETURN 30;
WHEN 6 THEN RETURN 31;
WHEN 7 THEN RETURN 31;
WHEN 8 THEN RETURN 30;
WHEN 9 THEN RETURN 31;
WHEN 10 THEN RETURN 30;
WHEN 11 THEN RETURN 31;
END CASE;
END;;
DELIMITER ;
-- ----------------------------
-- Function structure for `gdate`
-- ----------------------------
DROP FUNCTION IF EXISTS `gdate`;
DELIMITER ;;
CREATE FUNCTION `gdate`(`jy` smallint, `jm` smallint, `jd` smallint) RETURNS datetime
BEGIN
DECLARE
i, j, e, k, mo,
gy, gm, gd,
g_day_no, j_day_no, bkab, jmm, mday, g_day_mo, bkab1, j1
INT DEFAULT 0; /* Can be unsigned int? */
DECLARE resout char(100);
DECLARE fdate datetime;
SET bkab = __mymod(jy,33);
IF (bkab = 1 or bkab= 5 or bkab = 9 or bkab = 13 or bkab = 17 or bkab = 22 or bkab = 26 or bkab = 30) THEN
SET j=1;
end IF;
SET bkab1 = __mymod(jy+1,33);
IF (bkab1 = 1 or bkab1= 5 or bkab1 = 9 or bkab1 = 13 or bkab1 = 17 or bkab1 = 22 or bkab1 = 26 or bkab1 = 30) THEN
SET j1=1;
end IF;
CASE jm
WHEN 1 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 2 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 3 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 4 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 5 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 6 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 7 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 8 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 9 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 10 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 11 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 12 THEN IF jd > _jdmarray2(jm)+j or jd <= 0 THEN SET e=1; end IF;
END CASE;
IF jm > 12 or jm <= 0 THEN SET e=1; end IF;
IF jy <= 0 THEN SET e=1; end IF;
IF e>0 THEN
RETURN 0;
end IF;
IF (jm>=11) or (jm=10 and jd>=11 and j=0) or (jm=10 and jd>11 and j=1) THEN
SET i=1;
end IF;
SET gy = jy + 621 + i;
IF (__mymod(gy,4)=0) THEN
SET k=1;
end IF;
IF (__mymod(gy,100)=0) and (__mymod(gy,400)<>0) THEN
SET k=0;
END IF;
SET jmm=jm-1;
WHILE (jmm > 0) do
SET mday=mday+_jdmarray2(jmm);
SET jmm=jmm-1;
end WHILE;
SET j_day_no=(jy-1)*365+(__mydiv(jy,4))+mday+jd;
SET g_day_no=j_day_no+226899;
SET g_day_no=g_day_no-(__mydiv(gy-1,4));
SET g_day_mo=__mymod(g_day_no,365);
IF (k=1 and j=1) THEN
IF (g_day_mo=0) THEN
RETURN CONCAT_WS('-',gy,'12','30');
END IF;
IF (g_day_mo=1) THEN
RETURN CONCAT_WS('-',gy,'12','31');
END IF;
END IF;
IF (g_day_mo=0) THEN
RETURN CONCAT_WS('-',gy,'12','31');
END IF;
SET mo=0;
SET gm=gm+1;
while g_day_mo>_gdmarray2(mo,k) do
SET g_day_mo=g_day_mo-_gdmarray2(mo,k);
SET mo=mo+1;
SET gm=gm+1;
end WHILE;
SET gd=g_day_mo;
RETURN CONCAT_WS('-',gy,gm,gd);
END;;
DELIMITER ;
-- ----------------------------
-- Function structure for `gdatestr`
-- ----------------------------
DROP FUNCTION IF EXISTS `gdatestr`;
DELIMITER ;;
CREATE FUNCTION `gdatestr`(`jdat` char(10)) RETURNS datetime
BEGIN
DECLARE
i, j, e, k, mo,
gy, gm, gd,
g_day_no, j_day_no, bkab, jmm, mday, g_day_mo, jd, jy, jm,bkab1,j1
INT DEFAULT 0; /* ### Can't be unsigned int! ### */
DECLARE resout char(100);
DECLARE jdd, jyd, jmd, jt varchar(100);
DECLARE fdate datetime;
SET jdd = SUBSTRING_INDEX(jdat, '/', -1);
SET jt = SUBSTRING_INDEX(jdat, '/', 2);
SET jyd = SUBSTRING_INDEX(jt, '/', 1);
SET jmd = SUBSTRING_INDEX(jt, '/', -1);
SET jd = CAST(jdd as SIGNED);
SET jy = CAST(jyd as SIGNED);
SET jm = CAST(jmd as SIGNED);
SET bkab = __mymod(jy,33);
IF (bkab = 1 or bkab= 5 or bkab = 9 or bkab = 13 or bkab = 17 or bkab = 22 or bkab = 26 or bkab = 30) THEN
SET j=1;
end IF;
SET bkab1 = __mymod(jy+1,33);
IF (bkab1 = 1 or bkab1= 5 or bkab1 = 9 or bkab1 = 13 or bkab1 = 17 or bkab1 = 22 or bkab1 = 26 or bkab1 = 30) THEN
SET j1=1;
end IF;
CASE jm
WHEN 1 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 2 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 3 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 4 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 5 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 6 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 7 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 8 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 9 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 10 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 11 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
WHEN 12 THEN IF jd > _jdmarray2(jm)+j or jd <= 0 THEN SET e=1; end IF;
END CASE;
IF jm > 12 or jm <= 0 THEN SET e=1; end IF;
IF jy <= 0 THEN SET e=1; end IF;
IF e>0 THEN
RETURN 0;
end IF;
IF (jm>=11) or (jm=10 and jd>=11 and j=0) or (jm=10 and jd>11 and j=1) THEN
SET i=1;
end IF;
SET gy = jy + 621 + i;
IF (__mymod(gy,4)=0) THEN
SET k=1;
end IF;
IF (__mymod(gy,100)=0) and (__mymod(gy,400)<>0) THEN
SET k=0;
END IF;
SET jmm=jm-1;
WHILE (jmm > 0) do
SET mday=mday+_jdmarray2(jmm);
SET jmm=jmm-1;
end WHILE;
SET j_day_no=(jy-1)*365+(__mydiv(jy,4))+mday+jd;
SET g_day_no=j_day_no+226899;
SET g_day_no=g_day_no-(__mydiv(gy-1,4));
SET g_day_mo=__mymod(g_day_no,365);
IF (k=1 and j=1) THEN
IF (g_day_mo=0) THEN
RETURN CONCAT_WS('-',gy,'12','30');
END IF;
IF (g_day_mo=1) THEN
RETURN CONCAT_WS('-',gy,'12','31');
END IF;
END IF;
IF (g_day_mo=0) THEN
RETURN CONCAT_WS('-',gy,'12','31');
END IF;
SET mo=0;
SET gm=gm+1;
while g_day_mo>_gdmarray2(mo,k) do
SET g_day_mo=g_day_mo-_gdmarray2(mo,k);
SET mo=mo+1;
SET gm=gm+1;
end WHILE;
SET gd=g_day_mo;
RETURN CONCAT_WS('-',gy,gm,gd);
END;;
DELIMITER ;
Then I receive the error:
#1227 - Access denied; you need the SUPER privilege for this operation
I've changed all database command such as select delete alter, ... to yes into my MySQL database manager. I am using directAdmin v1.41.1.
I would try to GRANT permissions to that user ID and client IP and see if that helps.
http://dev.mysql.com/doc/refman/5.0/en/grant.html