CREATE DEFINER=`root`#`localhost` PROCEDURE `GetStateList`(IN _CountryName VARCHAR(255))
BEGIN
DECLARE #CCode VARCHAR(50)
SET #CCode = (SELECT CountryID from countrylist where CountryName = _CountryName);
SELECT #CCode;
END
You need to redefine the Delimiter to something else (eg: $$) other than ;. At the end, reset the limiter back to ;. Also, a semicolon was missing in the Declare statement:
DELIMITER $$
CREATE DEFINER=`root`#`localhost` PROCEDURE `GetStateList`(IN _CountryName VARCHAR(255))
BEGIN
DECLARE #CCode VARCHAR(50); -- semicolon was missing here
SET #CCode = (SELECT CountryID
from countrylist
where CountryName = _CountryName);
SELECT #CCode;
END$$
DELIMITER ;
Related
I did these SQL statements in oracle
create or replace procedure teacherlist(lists out SYS_REFCURSOR )
is
begin
open lists for
select teacherid,teachername,status,email,contact,address
from teacher;
end;
but now I have to do the same stored procedure in MySQL for PHPMyAdmin, which I did it like this:
DELIMITER $$
CREATE PROCEDURE `teacherlist`(OUT `v_stuid` VARCHAR(10), OUT `v_teachername` VARCHAR(100), OUT `v_status` VARCHAR(20), OUT `v_email` VARCHAR(40), OUT `v_contact` VARCHAR(20), OUT `v_address` VARCHAR(100))
begin
DECLARE v_teacherid varchar(10);
DECLARE v_teachername varchar(100);
DECLARE v_status varchar(20);
DECLARE v_email varchar(40);
DECLARE v_contact varchar(20);
DECLARE v_address varchar(100);
DECLARE My_Cursor CURSOR FOR
select teacherid,teachername,status,email,contact,address
from teacher;
OPEN My_Cursor;
FETCH My_Cursor INTO v_teacherid,v_teachername,v_status,v_email,v_contact,v_address;
CLOSE My_Cursor;
END$$
DELIMITER ;
which I'm not sure right or wrong because when I execute the procedure it did not give me any output.
There is no direct equivalent of Oracle Database REF CURSOR in MySQL.
The easiest solution is probably something like:
DELIMITER $$
CREATE PROCEDURE teacherlist()
BEGIN
select teacherid,teachername,status,email,contact,address
from teacher;
END$$
DELIMITER ;
And using call statement to use the result set.
I have 3 tables called tipo_produto & tipo_veiculo and tipo_produto_veiculo
Basicaly, a procedure called addTipo_produto that inserts values into tipo_produto and then selects tipo_produto to get the last ID where the values match but it returns null and it's impossible because I just added the value before
DELIMITER //
Create procedure addTipo_produto(
IN p_tipo_produto varchar(50),
IN p_tipo_veiculo varchar(50)
)
begin
DECLARE id_tipo_veiculo INT;
DECLARE id_tipo_produto INT;
INSERT INTO `tipo_produto`(`tipo_produto`) VALUES(p_tipo_produto);
SELECT `id_tipo_veiculo` INTO id_tipo_veiculo FROM `tipo_veiculo` WHERE `tipo_veiculo` LIKE p_tipo_veiculo;
SELECT `id_tipo_produto` INTO id_tipo_produto FROM `tipo_produto` WHERE `tipo_produto` LIKE p_tipo_produto;
INSERT INTO `tipo_produto_veiculo`(`id_tipo_produto`, `id_tipo_veiculo`) VALUES((SELECT(id_tipo_produto)), (SELECT(id_tipo_veiculo)));
end//
DELIMITER ;
Entire code:
https://pastebin.com/0qWgtusK
Fixed code:
DELIMITER //
Create procedure addTipo_produto(
IN p_tipo_produto varchar(50),
IN p_tipo_veiculo varchar(50)
)
begin
DECLARE _id_tipo_veiculo INT;
DECLARE _id_tipo_produto INT;
INSERT INTO `tipo_produto`(`tipo_produto`) VALUES(p_tipo_produto);
SET _id_tipo_veiculo = (SELECT `id_tipo_veiculo` FROM `tipo_veiculo` WHERE `tipo_veiculo` LIKE p_tipo_veiculo);
SELECT `id_tipo_produto` INTO _id_tipo_produto FROM `tipo_produto` WHERE `tipo_produto` LIKE p_tipo_produto;
INSERT INTO `tipo_produto_veiculo`(`id_tipo_produto`, `id_tipo_veiculo`) VALUES(_id_tipo_produto, _id_tipo_veiculo);
end//
DELIMITER ;
Thanks everyone
I have altered one line because only insert statement was for tipo_produto table.
Hope rest can be done by you.
DELIMITER //
Create procedure addTipo_produto(
IN p_tipo_produto varchar(50),
IN p_tipo_veiculo varchar(50)
)
begin
DECLARE id_tipo_veiculo INT;
DECLARE id_tipo_produto INT;
INSERT INTO `tipo_produto`(`tipo_produto`) VALUES(p_tipo_produto);
SELECT LAST_INSERT_ID() INTO id_tipo_veiculo;
SELECT `id_tipo_produto` INTO id_tipo_produto FROM `tipo_produto` WHERE `tipo_produto` LIKE p_tipo_produto;
INSERT INTO `tipo_produto_veiculo`(`id_tipo_produto`, `id_tipo_veiculo`) VALUES(id_tipo_produto, id_tipo_veiculo);
end//
DELIMITER ;
I am bit confused with Mysql syntax. I want to check for NULL the value of ExtractValue(xml, '//order[1]/quantity[$#i]') function. It can be assign to variable or this action can be skipped. I tried this and there is syntax error:
DELIMITER $$
DROP PROCEDURE IF EXISTS `sp_test_for_null`$$
CREATE PROCEDURE `sp_test_for_null`()
BEGIN
DECLARE xml VARCHAR(1000);
SET xml = '';
DECLARE test VARCHAR(1000);
SET test = (SELECT ExtractValue(xml, '//order[1]/quantity[$#i]');
IF (test IS NULL) THEN SELECT 1; END IF;
END$$
DELIMITER ;
CALL sp_test_for_null;
I'd try this (note that all DECLAREs are at the beginning:
DELIMITER $$
DROP PROCEDURE IF EXISTS `sp_test_for_null`$$
CREATE PROCEDURE `sp_test_for_null`()
BEGIN
DECLARE xml VARCHAR(1000);
DECLARE test VARCHAR(1000);
SET xml = '';
SET test = (SELECT ExtractValue(xml, '//order[1]/quantity[$#i]');
SELECT ISNULL(test, 1, 0);
END$$
DELIMITER ;
CALL sp_test_for_null;
So, below is the function i'm writing(in MySQL) and I get a syntax error at the last "RETURN" line (RETURN d_count). I'm sure it's some simple thing, but I can't figure it out.
Thanks!
DELIMITER $$
CREATE FUNCTION dept_count (dept_name VARCHAR(20))
RETURNS INT DETERMINISTIC
BEGIN
DECLARE d_count INT;
SELECT COUNT(*) into d_count
FROM instructor
WHERE instructor.dept_name=dept_name
RETURN d_count;
END $$
You should separate SELECT and RETURN with semicolon ; :
DELIMITER $$
CREATE FUNCTION dept_count (dept_name VARCHAR(20))
RETURNS INT DETERMINISTIC
BEGIN
DECLARE d_count INT;
SELECT COUNT(*) into d_count
FROM instructor
WHERE instructor.dept_name=dept_name;
RETURN d_count;
END $$
Having trouble getting this to apply in MySQL Workbench 5.2.15
DELIMITER //
CREATE
DEFINER=`potts`#`%`
FUNCTION
`potts`.`fn_create_category_test` (test_arg VARCHAR(50))
RETURNS int
BEGIN
DECLARE new_id int;
SET new_id = 8;
RETURN new_id;
END//
The actual function will have a lot more between BEGIN and END but as it stands, even this 3 liner won't work.
Thanks!
DELIMITER $$
CREATE FUNCTION `fn_create_category_test` (test_arg varchar(50))
RETURNS INT
BEGIN
DECLARE new_id int;
set new_id=8;
return new_id;
END $$
DELIMITER ;
Works fine for me, try getting rid of DEFINER?