How to make a stored procedure in mySQL - mysql

I'm quite new to stored procedures in mySQL and I have been having trouble with some of my homework that I have been assigned.
It's asking me to accept cust_code as a procedure parameter in my database, and then it will delete said customer with the cust_code.
Then it will delete all associated rows with this customer in the tables 'Invoice', 'line'.

To create a procedure with a integer parameter do something like this:
DELIMITER $$
CREATE PROCEDURE `<procedure_name>`(IN `in_cust_code` INT)
BEGIN
DELETE
...
WHERE 1
AND `<table_name>`.`cust_code` = in_cust_code
...
END
DELIMITER ;

Related

Temporary Procedure define variable issue

I'm trying out MySQL procedures for the first time, however I can't figure out how to define the variable #index_ids for the life of me. It really doesn't like the SET.
CREATE PROCEDURE #indextemp
BEGIN
SET #index_ids = (SELECT DISTINCT index_id FROM visibility_index_processing_queue WHERE process_id IS NOT NULL);
SELECT #index_ids;
END
Problem is in CREATE PROCEDURE syntax, not in setting variable. You just have to add parentheses after procedure name. Here's working sample
delimiter $
CREATE PROCEDURE indextemp()
BEGIN
SET #index_ids = (SELECT DISTINCT index_id FROM visibility_index_processing_queue WHERE process_id IS NOT NULL);
SELECT #index_ids;
END$
delimiter ;
Sometimes use of delimiter character in procedure body can cause problems too. That's why I set delimiter to $ before creating procedure and revert it to default ; after I'm done.
Also notice that I have removed # from your procedure name. In sql # is used to insert comments. If for some reason you really want to use it in your name you have to do it like that
CREATE PROCEDURE `#indextemp`()

phpmyadmin stucks while creating stored procedure

I am trying to create a simple stored procedure in phpmyadmin on namecheap.com server. I have created this procedure on my localhost and there was no problem however I'm unable to understand why is it not being created now.
I have tried by using mySQL as well as from Add Routine option.
My table name is users and here is the stored procedure
CREATE PROCEDURE getUsers (myUsername varchar (32))
BEGIN
SELECT * FROM `users` WHERE username = myUsername;
END$$
However I have another table called albums and I've written similar procedure for that table and it is working fine. Please help
Stucks on Loading Screen
You need the DELIMITER and IN for the params:
DELIMITER //
CREATE PROCEDURE getUsers (IN myUsername varchar (32))
BEGIN
SELECT * FROM `users` WHERE username = myUsername;
END //
DELIMITER ;

Create view after insert trigger

I have two tables companies (id,company_name) and users (id,company_id,user_name);
Now I want to create a view when data is inserted in companies table.
I used following two ways but getting same error in both the cases. Error is :
#1422 - Explicit or implicit commit is not allowed in stored function or trigger.
First Query is :
DELIMITER $$
CREATE TRIGGER testInsert
AFTER INSERT ON companies
FOR EACH ROW BEGIN
CREATE VIEW test(user_name) AS
SELECT user_name
FROM users;
END$$
DELIMITER ;
Then I tried creating procedure first and called that procedure in trigger like this
create procedure createView()
create view vt as select * from users;
CREATE TRIGGER `testInsert3` AFTER INSERT ON `companies`
FOR EACH ROW
BEGIN
CALL createView();
END;
Please help me guys.
Thanks All.
please refer this link, i think this will help you
http://stackoverflow.com/questions/16256250/create-view-in-a-trigger
try creating the view like this
DELIMITER $$
CREATE TRIGGER testInsert
AFTER INSERT ON companies
FOR EACH ROW BEGIN
EXECUTE('CREATE VIEW test(user_name) AS SELECT user_name
FROM users')
END$$
DELIMITER ;

MySQL Global userdefined variable in procedure

I want to store the output from a PROCEDURE into a global userdefined VAR so i can use this "list" in an other PROCEDURE on a different database.
Second, if the VAR is used on the 2nd PROCEDURE it should be unset, because on next CALL it will append or?
Thanks for response!
BEGIN
SELECT `steamid` FROM `mybb_users` WHERE `steamid`!='';
END
The SELECT shout go into a global variable, so i can use the result in another procedure...
As far as I know, you can't return a row set as a result of a procedure in MySQL.
I would solve it by creating a temporary table in the first procedure, and then use that temp table in the second procedure. Something like this:
delimiter $$
create procedure procedure1()
begin
drop table if exists temp_table;
create temporary table temp_table
select steamid from mybb_users where steamid != '';
-- add the appropriate indexes here
-- alter table temp_table
-- add index ...
end $$
create procedure procedure2()
begin
-- Do whatever you want to do with temp_table
end $$
delimiter ;
Remember:
A temporary table is visible only to the connection that created it.
If the connection is closed, the temporary table will be deleted.
Temporary tables are created directly to RAM (if they are not very big), so they can be pretty fast to read.
Each connection can create temporary tables with the same name, as each connection will have a "copy" of that temp table.

stored procedure that takes Query results as parameter

i just created a stored procedure that take a parameter(example id) and copies columns related to that id from one table to another table.
How can i create stored procedure that takes sub query results as parameter,database is mysql..
This is my example..i want to pass query that select id from table to procedure..
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`sasi`$$
CREATE DEFINER=`root`#`localhost` PROCEDURE `sasi`(IN idno int(4))
BEGIN
INSERT INTO user5(id,email,address,fullname,gender,phonenumber)
SELECT id,email,address,fullname,gender,phonenumber FROM user1 where id != idno;
END$$
DELIMITER ;
call sasi(4);
To pass the results of a query into your stored procedure, wrap the query in brackets.
For example:
call sasi((select max(id) from sometable where somecondition));
You must make sure the query only returns one row and one column.
Edited:
If you want to call the procedure multiple times, once for each row, change your procedure to be a FUNCTION:
CREATE FUNCTION sasi(idno int(4))
RETURNS int(4)
BEGIN
INSERT INTO user5(id,email,address,fullname,gender,phonenumber)
SELECT id,email,address,fullname,gender,phonenumber FROM user1 where id != idno;
RETURN idno;
END
Then call it like this:
select sasi(id)
from table
where ...
sasi(id) will get called for every row matching the where clause.