简体   繁体   中英

Stored procedure to create a MaillingListCount

I am following sql in 10 minutes to learn "stored procedure"

#+BEGIN_SRC sql :engine mysql :dbuser org :database grocer
    CREATE PROCEDURE MailingListCount (
    ListCount OUT INTEGER ) 
    IS
    v_rows INTEGER; 
    BEGIN 
        SELECT COUNT(*) INTO v_rows 
        FROM Customers 
        WHERE NOT cust_email IS NULL; 
        ListCount := v_rows; 
        END;
#+END_SRC

#+RESULTS:
|   |

it report error:

ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OUT INTEGER ) 
    IS
    v_rows INTEGER' at line 2

Could you please provide any hints?

Couple of fixes:

  • The OUT comes before the parameter name
  • Remove the unnecessary IS
  • Declare the variables inside the BEGIN END block
  • Use SET when you assign variables

So:

CREATE PROCEDURE MailingListCount(OUT ListCount INTEGER ) 
BEGIN 

declare v_rows INTEGER; 

SELECT COUNT(*) INTO v_rows 
FROM Customers 
WHERE NOT cust_email IS NULL; 

SET ListCount := v_rows; 

END;

Usually it's easier to handle the procedure output from result set rather than OUT variables. The OUT variables are useful primarily on calls between procedures.

So if you plan to call the routine from application, use:

CREATE PROCEDURE MailingListCount() 
BEGIN 

SELECT COUNT(*) as 'Count' 
FROM Customers 
WHERE NOT cust_email IS NULL; 

END;

First thing is the position of the OUT keyword. It should be before the Parameter name.

Then second one no need to create the variable v_rows to store the output and then finally assigning it back to the OUT parameter listCount.

If you want to check condition like email should not null then you should do something like WHERE cust_email IS NOT NULL instead of WHERE NOT cust_email IS NULL

Please refer below code for the reference :

DELIMITER $$
    CREATE PROCEDURE `MailingListCount` (OUT listCount INTEGER)
    BEGIN
     SELECT COUNT(*) INTO listCount
            FROM Customers 
            WHERE cust_email IS NOT NULL;        
    END$$ 
DELIMITER ;

You can use the different delimiter for the MySql stored procedures and functions.

MySql use ; as default delimiter so delimiters other than the default ; are typically used when defining functions, stored procedures, and triggers wherein you must define multiple statements. You define a different delimiter like $$ which is used to define the end of the entire procedure, but inside it, individual statements are each terminated by ; . That way, when the code is run in the mysql client, the client can tell where the entire procedure ends and execute it as a unit rather than executing the individual statements inside.

You can refer the https://dev.mysql.com/doc/refman/8.0/en/create-procedure.html to learn MySQL Stored procedure.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM