I created a stored procedure which should perform the following:
Insert into Agencies Table, creating an id in the PK index row
Save the id in a variable
Insert the id and other data into Users table
The syntax below does not trigger any errors:
DELIMITER $$
CREATE PROCEDURE insertNewAgencyAndAdmin (IN aName varchar (100), IN numTrav int, IN polType int, IN uEmail varchar(255), IN uFName varchar(40), IN uLName varchar(40), IN uTitle varchar(100))
BEGIN
INSERT INTO btsAgency.Agencies (agencyName, numTrav, polType) VALUES (#aName, #numTrav, #polType);
SET #agencyID = (SELECT agencyID from btsAgency.Agencies where agencyID = LAST_INSERT_ID());
INSERT INTO btsUsers.Users (userAgencyID, userEmail, userFirstName, userLastName, userTitle ) VALUES
(#agencyID, #uEmail, #uFName, #uLName, #uTitle);
END
However, the Stored Proc doesn't insert my parameters into the tables when executed. So, after searching I try to create the SP like this (including $$ after "END" and resetting the delimiter to a semi-colon ):
DELIMITER $$
CREATE PROCEDURE insertNewAgencyAndAdmin (IN aName varchar (100), IN numTrav int, IN polType int, IN uEmail varchar(255), IN uFName varchar(40), IN uLName varchar(40), IN uTitle varchar(100))
BEGIN
INSERT INTO btsAgency.Agencies (agencyName, numTrav, polType) VALUES (#aName, #numTrav, #polType);
SET #agencyID = (SELECT agencyID from btsAgency.Agencies where agencyID = LAST_INSERT_ID());
INSERT INTO btsUsers.Users (userAgencyID, userEmail, userFirstName, userLastName, userTitle ) VALUES
(#agencyID, #uEmail, #uFName, #uLName, #uTitle);
END $$
DELIMITER ;
MySql creates the Stored Proc but gives me the following error:
1064 - 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 'DELIMITER' at line 1
When I execute the created Stored Proc it still doesn't insert the data in my parameters.
Any help would be appreciated.
Some problems in your stored procedure:
It is important to indicate the difference between 9.4. User-Defined Variables and routine parameters 13.1.15. CREATE PROCEDURE and CREATE FUNCTION Syntax, are different variables (eg.: aName != #aName).
Avoid naming parameters or variables as columns of your tables.
DELIMITER $$
CREATE PROCEDURE `insertNewAgencyAndAdmin` (
/*
IN `aName` varchar (100),
IN `numTrav` int,
IN `polType` int,
IN `uEmail` varchar(255),
IN `uFName` varchar(40),
IN `uLName` varchar(40),
IN `uTitle` varchar(100)
*/
IN `_aName` varchar (100),
IN `_numTrav` int,
IN `_polType` int,
IN `_uEmail` varchar(255),
IN `_uFName` varchar(40),
IN `_uLName` varchar(40),
IN `_uTitle` varchar(100)
)
BEGIN
/*
INSERT INTO `btsAgency`.`Agencies` (
`agencyName`,
`numTrav`,
`polType`
) VALUES (
#`aName`,
#`numTrav`,
#`polType`
);
*/
INSERT INTO `btsAgency`.`Agencies` (
`agencyName`,
`numTrav`,
`polType`
) VALUES (
`_aName`,
`_numTrav`,
`_polType`
);
/*
SET #`agencyID` = (SELECT `agencyID` from `btsAgency`.`Agencies` where `agencyID` = LAST_INSERT_ID());
INSERT INTO `btsUsers`.`Users` (
`userAgencyID`,
`userEmail`,
`userFirstName`,
`userLastName`,
`userTitle`
) VALUES (
#`agencyID`,
#`uEmail`,
#`uFName`,
#`uLName`,
#`uTitle`
);
*/
INSERT INTO `btsUsers`.`Users` (
`userAgencyID`,
`userEmail`,
`userFirstName`,
`userLastName`,
`userTitle`
) VALUES (
LAST_INSERT_ID(),
`_uEmail`,
`_uFName`,
`_uLName`,
`_uTitle`);
END$$
DELIMITER ;
SELECT * FROM discounts $$
delimiter $$;
CREATE PROCEDURE insertData(IN id int,IN title varchar(255),IN amount decimal)
BEGIN
insert into discounts values (id,title,amount);
END; $$
call insertData(3,"sadasd",56);
/*DROP PROCEDURE insertData */
Related
I am trying to make a stored procedure handler for duplicate username entries.
the procedure manages to create it self, but when i enter inn the information into the tables i only get the standard error from mysql. How do i sort this out?
DELIMITER $$
DROP PROCEDURE IF EXISTS Testproc2$$
create procedure testproc2(filename VARCHAR (40), descriptionn VARCHAR(40),
username VARCHAR(40), firstname VARCHAR(40), lastnameVARCHAR(40), classcode INT(10))
begin
declare exit handler for 1062
select concat('Feil: username',username,'already exist');
start transaction;
insert into bilde
values (NULL, filnavn, beskrivelse);
insert into student
values (username, firstname, lastname, classcode, LAST_INSERT_ID());
commit;
SELECT CONCAT('Inserted student ',username,' ',firstname' ',lastname' ',classcode' ', LAST_INSERT_ID());
END$$
I found my error, i called for testproc1 instead of testproc2.
How do i make an if statment that ROLLBACK: if the studentbrukernavn (students username) already exist, and if the klassekode (classcode) does not exist
DELIMITER $$
DROP PROCEDURE IF EXISTS OPPRETT_STUDENT$$
CREATE PROCEDURE OPPRETT_STUDENT
(
IN bilde_bildenr INT,
IN bilde_filnavn VARCHAR(30),
IN bilde_beskrivelse VARCHAR(30),
IN student_brukernavn VARCHAR(30),
IN student_fornavn VARCHAR(30),
IN student_etternavn VARCHAR(30),
IN student_klassekode VARCHAR(30)
)
BEGIN
START TRANSACTION;
INSERT INTO bilde
VALUES (bilde_bildenr,
CONCAT('bilder/',student_brukernavn,'.jpg'),
CONCAT('bilde av ',student_fornavn,' ',student_etternavn)
);
INSERT INTO student VALUES (student_brukernavn, student_fornavn, student_etternavn, student_klassekode, bilde_bildenr);
COMMIT;
END$$
DELIMITER ;
IF NOT EXISTS(SELECT query) THEN
ELSE
END IF;
Hope this helps
I already have a table employee with columns name(String),id(int),age(int).
I can't figure out where the syntax is wrong?
CREATE PROCEDURE recins (
name1 IN employee.name%type ,
id1 IN employee.id%type ,
age1 IN employee.age%type
) AS
BEGIN
INSERT INTO employee VALUES(name1,id1,age1);
END;
create table employee2
(
name varchar(100) not null,
id int not null,
age int not null
);
DELIMITER $$
CREATE PROCEDURE recins (
IN name1 varchar(100),
IN id1 int,
IN age1 int
)
BEGIN
INSERT INTO employee2 (name,id,age) VALUES(name1,id1,age1);
END $$
DELIMITER ;
-- test:
call recins('a',1,2);
delimiter is a special wrapper for stored procs, events, functions. Delimiter ; at the end of the stored proc sets it back to the normal/default delimiter of a semi-colon.
The above was tested.
I want to get the adminID from ADMIN table using the email and save the adminID in the product table. I tried do that, it returns null in the adminID in Product table. Please let me know where I'm making a mistake.
CREATE PROCEDURE prc_saveProduct
(
IN inputuserEmail VARCHAR(255),
inputproductName VARCHAR(255),
inputpoints INT(11),
)
BEGIN
SET #AdminID = (SELECT AdminID FROM ADMIN WHERE email = inputuserEmail );
INSERT INTO PRODUCTS(AdminID, productName, points)
VALUES (#AdminID, inputproductName, inputpoints);
END
This will work.
DELIMITER $$
CREATE PROCEDURE `yourSchema`.`prc_saveProduct`(
p_inputuserEmail VARCHAR(255),
p_inputproductname VARCHAR(255),
p_inputpoints INT(11)
)
BEGIN
DECLARE _AdminID VARCHAR(255);
SELECT
AdminID FROM ADMIN WHERE email = p_inputuserEmail
INTO
_AdminID;
INSERT INTO PRODUCTS(
AdminID,
productName,
points
)
VALUES
(
_AdminID,
p_inputproductName,
p_inputpoints
);
END$$
DELIMITER ;
the p_ is not necessary, I just like to prepend proc params with it to distinguish it. The underscore I like to use for local variables "_AdminID", but that's not necessary either. I just prefer those naming conventions.
I have this MySQL query to create a stored procedure:
Delimiter //;
Create Procedure addUser(
IN facebookId varchar(20),
IN name varchar(50),
In accessToken varchar(100),
in expires float)
Begin
Declare invitingUsers Table(Id varchar(20));
Insert Into Users
(`Facebook_Id`,`Name`,`Access_Token`,`Expired`) Values (facebookId,name,accessToken,expires);
Select Inviting_Id
From Invited_Users
Where Invited_Id = facebookId
Into invitingUsers;
Update Table Users
Set Credit = Credit + 1
Where Facebook_Id In (Select Id From invitingUsers);
End//
but I'm keep getting this error - can't understand why:
#1064 - 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 'Table(Id varchar(20)); Insert Into Users (`Facebook' at line 7
Change #1
Delimiter //; to Delimiter //
Change #2
Create a Temp Table in Memory
Change #3
Changed
Select Inviting_Id
From Invited_Users
Where Invited_Id = facebookId
Into invitingUsers;
into
INSERT INTO invitingUsers
Select Inviting_Id From Invited_Users
Where Invited_Id = facebookId;
With these changes I give you this:
Delimiter //
Create Procedure addUser(
IN facebookId varchar(20),
IN name varchar(50),
In accessToken varchar(100),
in expires float)
Begin
Declare invitingUsers Table(Id varchar(20));
Create temporary table if not exists invitingUsers
(Id varchar(20), PRIMARY KEY (id)) ENGINE=MEMORY;
Insert Into Users
(`Facebook_Id`,`Name`,`Access_Token`,`Expired`)
Values (facebookId,name,accessToken,expires);
INSERT INTO invitingUsers
Select Inviting_Id From Invited_Users
Where Invited_Id = facebookId;
Update Table Users
Set Credit = Credit + 1
Where Facebook_Id In (Select Id From invitingUsers);
End//
Delimiter ;
Give it a Try !!!