Link to home
Start Free TrialLog in
Avatar of waqarkhan88
waqarkhan88

asked on

MySQL Stored Procedure Error

I am having an error when trying to create a stored procedure it throws some syntax error and i am unable to figure out what the problem is :(
the code of stored procedure is in code section, and  my MySQL version is 5.1.36
Please guide me what is the problem with this code :(
Create Procedure RefineData()
Begin
Create Temporary Table Temp As Select Distinct BankName FROM `BankList`;
DECLARE R_N_F INT DEFAULT 0;
DECLARE BankNames CURSOR FOR SELECT * FROM Temp;
DECLARE Bank_Name VARCHAR(100) DEFAULT "";
DECLARE CONTINUE HANDLER FOR NOT FOUND SET R_N_F = 1;
OPEN BankNames;
     allBanks: LOOP
               FETCH BankNames INTO Bank_Name;
               IF R_N_F THEN
                  LEAVE allStudents;
               END IF;
               
               DECLARE Bank_URL VARCHAR(100) DEFAULT NULL;
               DECLARE Bank_Login_URL VARCHAR(100) DEFAULT NULL;
               Bank_URL = Select BankURL From (Select Distinct BankURL, Length(BankURL) As Rank From BankList Where BankName = Bank_Name Order By Rank ASC Limit 1) As a;
               Bank_Login_URL = Select BankURL From (Select Distinct BankURL, Length(BankURL) As Rank From BankList Where BankName = Bank_Name Order By Rank DESC Limit 1) As b;
               Insert Into `RefinedBankList` Select Bank_Name, Bank_URL, Bank_Login_URL;
     END LOOP allBanks;
CLOSE BankNames;
Drop Table Temp;
End

Open in new window

Avatar of SoLost
SoLost
Flag of New Zealand image

First question... what exactly is the syntax error that it throws up?
I don't know much about stored procedures but I had a bit of a play by trying to create your stored procedure line by line and dealing with the error messages 1 at a time.

In order to get it to compile I had to re-order your DECLARE statements and change your SELECT statements from :

Bank_URL = Select BankURL From

to

SELECT BankURL INTO Bank_URL FROM

Try the below code.  I think it will work.
DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`RefineData` $$
CREATE PROCEDURE `test`.`RefineData` ()


BEGIN

DECLARE R_N_F INT DEFAULT 0;
DECLARE Bank_Name VARCHAR(100) DEFAULT "";
DECLARE Bank_URL VARCHAR(100) DEFAULT NULL;
DECLARE Bank_Login_URL VARCHAR(100) DEFAULT NULL;
DECLARE BankNames CURSOR FOR SELECT * FROM Temp;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET R_N_F = 1;

CREATE TEMPORARY TABLE Temp AS SELECT DISTINCT BankName FROM `BankList`;

OPEN BankNames;
     allBanks: LOOP
               FETCH BankNames INTO Bank_Name;
               IF R_N_F THEN
                  LEAVE allBanks;
               END IF;

               SELECT BankURL INTO Bank_URL FROM (SELECT DISTINCT BankURL, Length(BankURL) AS Rank FROM BankList WHERE BankName = Bank_Name ORDER BY Rank ASC LIMIT 1) AS a;
               SELECT BankURL INTO Bank_Login_URL FROM (SELECT DISTINCT BankURL, Length(BankURL) AS Rank FROM BankList WHERE BankName = Bank_Name ORDER BY Rank DESC LIMIT 1) As b;
               INSERT INTO `RefinedBankList` SELECT Bank_Name, Bank_URL, Bank_Login_URL;
     END LOOP allBanks;
CLOSE BankNames;

DROP TABLE Temp;

END $$

DELIMITER ;

Open in new window

Avatar of waqarkhan88
waqarkhan88

ASKER

The syntax error is :
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 'DECLARE R_N_F INTEGER DEFAULT 0;
DECLARE BankNames CURSOR FOR SELECT * FROM Tem' at line 4

The more refined code is below having still same problem :(

DELIMITER $$

DROP PROCEDURE IF EXISTS `bankman`.`RefineData` $$
CREATE PROCEDURE `bankman`.`RefineData` ()
BEGIN
  Create Temporary Table Temp As (Select Distinct BankName FROM BankList);
  DECLARE R_N_F INTEGER DEFAULT 0;
  DECLARE BankNames CURSOR FOR SELECT * FROM Temp;
  DECLARE Bank_Name VARCHAR(100) DEFAULT "";
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET R_N_F = 1;
  OPEN BankNames;
    allBanks: LOOP
      FETCH BankNames INTO Bank_Name;
      IF R_N_F THEN
        LEAVE allStudents;
      END IF;
      DECLARE Bank_URL VARCHAR(100) DEFAULT NULL;
      DECLARE Bank_Login_URL VARCHAR(100) DEFAULT NULL;
      Select BankURL INTO Bank_URL From (Select Distinct BankURL, Length(BankURL) As Rank From BankList Where BankName = Bank_Name Order By Rank ASC Limit 1) As a;
      Select BankURL INTO Bank_Login_URL From (Select Distinct BankURL, Length(BankURL) As Rank From BankList Where BankName = Bank_Name Order By Rank DESC Limit 1) As b;
      Insert Into RefinedBankList Select Bank_Name, Bank_URL, Bank_Login_URL;
    END LOOP allBanks;
  CLOSE BankNames;
Drop Table Temp;

Open in new window

Latest Code below:
DELIMITER $$

DROP PROCEDURE IF EXISTS `bankman`.`RefineData` $$
CREATE PROCEDURE `bankman`.`RefineData` ()
BEGIN
  Create Temporary Table Temp As (Select Distinct BankName FROM BankList);
  DECLARE R_N_F INTEGER DEFAULT 0;
  DECLARE BankNames CURSOR FOR SELECT * FROM Temp;
  DECLARE Bank_Name VARCHAR(100) DEFAULT "";
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET R_N_F = 1;
  OPEN BankNames;
    allBanks: LOOP
      FETCH BankNames INTO Bank_Name;
      IF R_N_F THEN
        LEAVE allStudents;
      END IF;
      DECLARE Bank_URL VARCHAR(100) DEFAULT NULL;
      DECLARE Bank_Login_URL VARCHAR(100) DEFAULT NULL;
      Select BankURL INTO Bank_URL From (Select Distinct BankURL, Length(BankURL) As Rank From BankList Where BankName = Bank_Name Order By Rank ASC Limit 1) As a;
      Select BankURL INTO Bank_Login_URL From (Select Distinct BankURL, Length(BankURL) As Rank From BankList Where BankName = Bank_Name Order By Rank DESC Limit 1) As b;
      Insert Into RefinedBankList Select Bank_Name, Bank_URL, Bank_Login_URL;
    END LOOP allBanks;
  CLOSE BankNames;
Drop Table Temp;
END $$

DELIMITER ;

Open in new window

I got around that error by re-ordering the DECLARE statements to be at the top.  Look at my solution again.
ASKER CERTIFIED SOLUTION
Avatar of mkiredjian
mkiredjian
Flag of Lebanon image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial