Issue handling with MySQL trigger - mysql

This is my trigger for show error handling :
DELIMITER //
CREATE TRIGGER NOTA_PENJUALAN_INS BEFORE INSERT ON nota_penjualan FOR EACH ROW
BEGIN
DECLARE VDATE DATETIME;
If (NEW.INVENTORY_OUT_ID IS NOT NULL) then
CALL STATUS_INV_OUT(NEW.INVENTORY_OUT_ID);
SELECT (a.DOCUMENT_DATE) INTO VDATE
FROM inventory_out a
INNER JOIN NOTA_PENJUALAN b ON a.INVENTORY_OUT_ID=b.INVENTORY_OUT_ID
WHERE b.NOTA_PENJUALAN_ID=NEW.NOTA_PENJUALAN_ID;
End IF;
IF(VDATE > NEW.DOCUMENT_DATE) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'sorry can not exceed the date that has been specified';
END IF;
END
//
It displays:
And does not display my ShowMessage.

Related

MySQL trigger unknow syntax error if statement

I have this trigger and it says a syntax error
delimiter //
Create Trigger sal_check
Before Update On emp
For Each Row
Begin
IF (new.sal > (old.sal * 1.1)) Then
signal sqlstate '45000' set message_text = 'The increase to salary is too high';
End IF;
END
//
delimiter ;

Cannot call Stored procedure Error code 1305

The database is about exam scheduling and this is the main stored procedure which is about scheduling courses on a given date.
I created the procedure but when I try to call it says the procedure is not found.
I've looked through the code but can't find syntax errors, the procedure itself does not have compilation errors, (but that may be because I have to use delimiters?)
DELIMITER $$
CREATE PROCEDURE schedule_course(IN in_code CHAR(3), IN in_date DATE)
BEGIN
DECLARE complete BOOLEAN DEFAULT FALSE;
DECLARE module_code CHAR(3);
DECLARE module_c CURSOR FOR
SELECT course_code FROM module WHERE course_code = in_code;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET complete = TRUE;
IF (DAYOFWEEK(in_date) = 6 OR 7) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE TEXT = 'Cannot schedule start date on a weekend'
END IF;
OPEN module_c;
mainloop : LOOP
FETCH NEXT FROM module_c INTO module_code;
IF complete THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE TEXT = 'Something something'
END IF;
INSERT INTO SESSION (`code`, `date`, room)
VALUES
(module_code, in_date, NULL)
LEAVE mainloop;
END LOOP;
DELIMITER ;
CALL schedule_course(WSD, CURDATE())
Error Code: 1305. PROCEDURE cameron.schedule_course does not exist
Mysql 8 show a lot of errors.
I corrected them, the logic is sound but of course you have to check it,
DELIMITER $$
CREATE DEFINER=`root`#`localhost` PROCEDURE schedule_course(IN in_code CHAR(3), IN in_date DATE)
BEGIN
DECLARE complete BOOLEAN DEFAULT FALSE;
DECLARE module_code CHAR(3);
DECLARE module_c CURSOR FOR
SELECT course_code FROM module WHERE course_code = in_code;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET complete = TRUE;
IF (DAYOFWEEK(in_date) = 6 OR DAYOFWEEK(in_date) = 7) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Cannot schedule start date on a weekend';
END IF;
OPEN module_c;
mainloop : LOOP
FETCH NEXT FROM module_c INTO module_code;
IF complete THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Something something';
END IF;
INSERT INTO SESSION (`code`, `date`, room)
VALUES
(module_code, in_date, NULL);
LEAVE mainloop;
END LOOP;
CLOSE module_c;
END;
DELIMITER ;
seems you have not an end (END $$)
DELIMITER $$
CREATE PROCEDURE schedule_course(IN in_code CHAR(3), IN in_date DATE)
BEGIN
DECLARE complete BOOLEAN DEFAULT FALSE;
DECLARE module_code CHAR(3);
DECLARE module_c CURSOR FOR
SELECT course_code FROM module WHERE course_code = in_code;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET complete = TRUE;
IF (DAYOFWEEK(in_date) = 6 OR 7) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE TEXT = 'Cannot schedule start date on a weekend'
END IF;
OPEN module_c;
mainloop : LOOP
FETCH NEXT FROM module_c INTO module_code;
IF complete THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE TEXT = 'Something something'
END IF;
INSERT INTO SESSION (`code`, `date`, room)
VALUES
(module_code, in_date, NULL)
LEAVE mainloop;
END LOOP;
END $$
DELIMITER ;

Why is this mysql trigger given an error?

i'm trying to translate my oracle trigger to mysql but i'm getting an error. This is my mysql trigger:
delimiter //
CREATE TRIGGER z_asdsdas BEFORE UPDATE ON PRODUCT
FOR EACH ROW
BEGIN
DECLARE v_result INT;
SET v_result = 0;
IF 'BETWEEN' = 'BETWEEN' THEN
IF NEW.PRIJS >= 1 AND NEW.PRIJS <= 10 THEN
SET v_result = 1;
END IF;
ELSE
IF NEW.PRIJS < 1 OR NEW.PRIJS > 10 THEN
SET v_result = 1;
END IF;
END IF;
IF v_result = 0 THEN
signal sqlstate -20000 set msgtext = 'error here...';
END IF;
END //
DELIMITER ;
I gave the mysql trigger static values first to test if it should work. This is my oracle trigger:
CREATE OR REPLACE TRIGGER BRG_<code>_<attribute_table>_TRG
BEFORE DELETE OR INSERT OR UPDATE
ON <attribute_table>
FOR EACH ROW
DECLARE
L_OPER VARCHAR2(3);
L_ERROR_STACK VARCHAR2(4000);
BEGIN
IF INSERTING
THEN
L_OPER := 'INS';
ELSIF UPDATING
THEN
L_OPER := 'UPD';
END IF;
DECLARE
L_PASSED BOOLEAN := TRUE;
BEGIN
IF L_OPER IN ('INS', 'UPD')
THEN
IF '<operator>' = 'BETWEEN' THEN
L_PASSED := :NEW.<attribute_column> <GreaterOrEqual> <range_min> AND :NEW.<attribute_column> <LessOrEqual> <range_max>;
ELSE
L_PASSED := :NEW.<attribute_column> <LessThen> <range_min> OR :NEW.<attribute_column> <GreaterThen> <range_max>;
END IF;
IF NOT L_PASSED
THEN
raise_application_error(-20000, '<error>');
END IF;
END IF;
END;
END;
The compiler is gives red lines at the if-statements and a message: syntax error at line 17. Any idea what i'm doing wrong? Mysql is pretty new for me.
Try to correct the line signalling:
...
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'error here...';
...

Mysql triggers with multiple values

How can i do the same with username value in one trigger?
Thanks
DELIMITER //
CREATE TRIGGER notnullnameandsurname BEFORE INSERT ON guests FOR EACH ROW
BEGIN
IF new.name = "" then
SIGNAL SQLSTATE '45000';
END IF;
END //
How about using or?
DELIMITER //
CREATE TRIGGER notnullnameandsurname BEFORE INSERT ON guests FOR EACH ROW
BEGIN
IF new.name = '' or new.username = '' then
SIGNAL SQLSTATE '45000';
END IF;
END //

SQL duplicate trigger

I have simple project for database classes there i have shop database which implement such logic: for each customer in order table we have order with type = 'CART' when customer confirm his order his order change it type to 'ORDER' and we create a new CART for our customer.
Now i want to write trigger that allows me to control that each customer has only one CART.
I write something like this
DELIMITER $$
USE `newshop`$$
CREATE
DEFINER=`root`#`localhost`
TRIGGER `newshop`.`cart_check`
BEFORE INSERT ON `newshop`.`order`
FOR EACH ROW
BEGIN
DECLARE msg VARCHAR(255);
DECLARE count_pn INTEGER;
SELECT count(*) INTO count_pn FROM newshop.order
where newshop.order.type = NEW.type
and NEW.user_id = newshop.order.user_id
and NEW.type = 'CART'
or NEW.type = 'cart'
LIMIT 1;
if count_pn > 0 THEN
BEGIN
set msg = 'Oh no';
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
end;
ELSE
BEGIN
set msg = 'Oh yeah';
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
END;
END IF;
END$$
then when i try to insert into table new order with type cart for user with id = 1, that already has a cart - this trigger doesn't allow me to do this and if i try to add a cart for another user, that doesn't have cart - this trigger also doesn't allow me to do this.
In else, you also have the SIGNAL SQLSTATE=45000, which is unhandled exception, it will cause return as failed.
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;