I'm trying to do a DROP CREATE stored procedure in MySQL.
The first block of code runs just fine.
DELIMITER //
-- IMPORTANT: Change to ecom_prod
USE ecom_dev;
DROP PROCEDURE IF EXISTS `usp_getDetails`;
The second block gives an error in statement #2 near --DROP CREATE Procedure
DROP PROCEDURE IF EXISTS usp_getDetails; at line 1
DELIMITER //
-- IMPORTANT: Change to ecom_prod
USE ecom_dev;
-- DROP CREATE Procedure
DROP PROCEDURE IF EXISTS `usp_getDetails`;
The only difference is the addition of extra comments. I can't understand how the extra comment is causing this error.
Any and all help is welcome
Once the DELIMITER is changed to something other than semicolon, the new delimiter should be used in place of the semicolon.
For example:
DELIMITER $$
-- IMPORTANT: Change to ecom_prod
USE ecom_dev$$
DROP PROCEDURE IF EXISTS `usp_getDetails`$$
DELIMITER ;
I'm not sure how your code is working with the semicolons. I don't think the issue has anything to do with the comments. But I haven't tested it. I always have a blank line preceding and following DELIMITER. And the only time I ever use DELIMITER is when I'm issuing a CREATE <stored_program_type>.
Related
Very new to the environment, I have a question about a line that's added to the end of my code. The guide I'm following is:
http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/
If anyone has a better one regarding MySQL stored procedures, I'm all ears.
Before I ask, this is the environment I'm using:
OS: Windows 7 / WAMP (MySQL 5.5.24) / MySQL Workbench
I'm instructed to define a delimiter; in my case I'm sticking with the default '$$.'
The stored procedure I created is:
DELIMITER $$
CREATE PROCEDURE test.`p2` ()
LANGUAGE SQL
DETERMINISTIC
COMMENT 'Adds "nson" to first and last names in the record.'
BEGIN
SELECT 'Hello World';
END $$
When I apply this stored procedure and I get the review screen, I see a new line of code added;
At the bottom:
DELIMITER ;
This lats line; is it added because the DELIMITER statement announces a block within which the defined delimiters ($$) can be used and thus closes the block in the end?
When using the builtin procedure editor, MySQL Workbench adds a few extra commands:
USE `test`; // <----------
DROP procedure IF EXISTS `p2`; // <----------
DELIMITER $$
USE `test`$$ // <----------
CREATE PROCEDURE test.`p2` ()
LANGUAGE SQL
DETERMINISTIC
COMMENT 'Adds "nson" to first and last names in the record.'
BEGIN
SELECT 'Hello World';
END $$
DELIMITER ; // <----------
Those commands are not strictly related to the stored procedures syntax, they're merely a commodity—other MySQL clients (such as HeidiSQL or the official command line utility) will not add them. The last delimiter change is probably a reset to avoid problems in future statements on the same connection.
You need to change the delimiter in order to instruct the client about where the procedure code starts and end. The problem is that the procedure body is normally a collection of SQL statements so omitting the delimiter change would make MySQL think that you are attempting to run a series of statements, the first of which would be this:
CREATE PROCEDURE test.`p2` ()
LANGUAGE SQL
DETERMINISTIC
COMMENT 'Adds "nson" to first and last names in the record.'
BEGIN
SELECT 'Hello World';
With DELIMITER $$ you are telling MySQL that your full statement goes from CREATE to END. It's just syntactic sugar: DELIMITER is not even a SQL keyword. HeidiSQL, for instance, provides a GUI with a text box where you write the procedure body, thus you don't need the DELIMITER workaround.
I am trying to understand, why delimiter used with stored procedure in mysql?
but i couldn't.
DELIMITER //
CREATE PROCEDURE GetAllProducts()
BEGIN
SELECT * FROM products;
END //
DELIMITER ;`
Mysql's default delimiter is ; which is used for one statement in the command line , something as
select * from users ;
When you write a trigger or stored procedure to execute the entire code mysql needs to understand that its a block of code/query.
If no delimiter is provided then when mysql encounters any ; inside the store procedure or trigger it will think that as one statement and will try to execute it. So we need to provide a delimiter for store procedure or trigger and make mysql understand that anything within that delimiter is one complete set of code.
So in your example
SELECT * FROM products;
it will be a part of the complete statement when there is a delimiter other than ; is provided at the beginning.
I have the following piece of statement entered into MySQL5.6 Command Line Client. However, the following error was received. I haven't even been able to add in END// Delimiter; after the select statement.
At the same time, i was wondering after the stored procedure has been created successfully, how do i CALL the stored procedure without the command line but using java codes.
Kindly assist. Greatly appreciated!
give space between delimiter and //. After your select statement write end; on next line and // at last line (after end; in next new line)
delimiter //
create procedure GetUStocks()
Begin
Select * From buystocks;
end;
//
mysql> delimiter //
mysql> CREATE PROCEDURE GetUStocke()
-> BEGIN
-> SELECT * FROM buystocks ;
-> END//
You need a space between DELIMITER and the symbol you are changing the delimiter to.
mysql> DELIMITER //
The clue that it worked should be that you get another mysql> prompt instead of the "unfinished command" prompt ->.
Re your comment, if you need to call a stored procedure from a Java application, refer to the manual on callable statements: http://dev.mysql.com/doc/refman/5.6/en/connector-j-usagenotes-statements-callable.html
Well, seriously, I was Shocked and still am upon this accidental discovery.
It's simply because you are not using the delimiter that you have defined for ending the procedure.
Here let me attach two snippets that will help illustrate what is generating the error.
Very new to the environment, I have a question about a line that's added to the end of my code. The guide I'm following is:
http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/
If anyone has a better one regarding MySQL stored procedures, I'm all ears.
Before I ask, this is the environment I'm using:
OS: Windows 7 / WAMP (MySQL 5.5.24) / MySQL Workbench
I'm instructed to define a delimiter; in my case I'm sticking with the default '$$.'
The stored procedure I created is:
DELIMITER $$
CREATE PROCEDURE test.`p2` ()
LANGUAGE SQL
DETERMINISTIC
COMMENT 'Adds "nson" to first and last names in the record.'
BEGIN
SELECT 'Hello World';
END $$
When I apply this stored procedure and I get the review screen, I see a new line of code added;
At the bottom:
DELIMITER ;
This lats line; is it added because the DELIMITER statement announces a block within which the defined delimiters ($$) can be used and thus closes the block in the end?
When using the builtin procedure editor, MySQL Workbench adds a few extra commands:
USE `test`; // <----------
DROP procedure IF EXISTS `p2`; // <----------
DELIMITER $$
USE `test`$$ // <----------
CREATE PROCEDURE test.`p2` ()
LANGUAGE SQL
DETERMINISTIC
COMMENT 'Adds "nson" to first and last names in the record.'
BEGIN
SELECT 'Hello World';
END $$
DELIMITER ; // <----------
Those commands are not strictly related to the stored procedures syntax, they're merely a commodity—other MySQL clients (such as HeidiSQL or the official command line utility) will not add them. The last delimiter change is probably a reset to avoid problems in future statements on the same connection.
You need to change the delimiter in order to instruct the client about where the procedure code starts and end. The problem is that the procedure body is normally a collection of SQL statements so omitting the delimiter change would make MySQL think that you are attempting to run a series of statements, the first of which would be this:
CREATE PROCEDURE test.`p2` ()
LANGUAGE SQL
DETERMINISTIC
COMMENT 'Adds "nson" to first and last names in the record.'
BEGIN
SELECT 'Hello World';
With DELIMITER $$ you are telling MySQL that your full statement goes from CREATE to END. It's just syntactic sugar: DELIMITER is not even a SQL keyword. HeidiSQL, for instance, provides a GUI with a text box where you write the procedure body, thus you don't need the DELIMITER workaround.
I am trying to chain multiple operations on my database for a change repo for ease of database consistancy between development/production environments. I have created a file with multiple commands and am getting this weird error that I can't seem to find a reference on.
A snippet is below:
deallocate prepare stmt;
END$$
drop procedure if exists SearchByWantListCount;
delimiter $$
CREATE DEFINER=`webaccess`#`%` PROCEDURE `SearchByWantListCount`(
IN loggedInUser INT,
IN filter varchar(255))
BEGIN
The delimiter is being underlined in red and I'm getting the error:
syntax error, unexpected IDENT_QUOTED, expecting $end
I added in a
delimiter ;
drop procedure if exists SearchByWantListCount;
which seemed to make everything happy....
That's because you don't need to put delimiter before $$ when you want to use the delimiter. Simply put $$.
The syntax you used defines the delimiter, thing that has been done earlier (since we can see you use the delimiter on the END).
Why "delimiter ;" worked is because the semi-colon at the end of "drop procedure if exists SearchByWantListCount;" is then counted as a delimiter. Would you put "delimiter $$" here or not, you need a $$ between the drop line and the start of your next procedure (SearchByWantListCount), or before "delimiter $$" if you want to redefine it.
By the way, you don't need your "delimiter ;" since you put $$ after the previous END symbol. Simply remove the "delimiter" before the $$.