Link to home
Start Free TrialLog in
Avatar of richardsimnett
richardsimnett

asked on

Whats wrong with my sproc?

Hello, Whats wrong with my sproc?

Error while execeuting query: CREATE PROCEDURE importData(tablename varchar(255), userlist varchar(255))
BEGIN

      /* First execute a query to clean out incomplete data */
        PREPARE STMT FROM  'delete from ? where datestamp is null or source is null or ip is null or length(datestamp) < 1 or length(source) < 1 or length(ip) < 1';
      EXECUTE STMT USING tablename;
            
END:
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 'tablename;
            
END' at line 6 (errno: 1064)
Click 'Ignore' if you'd like to have this error ignored until the end of the script.


Here is the sproc:

delimiter $

CREATE PROCEDURE importData(tablename varchar(255), userlist varchar(255))
BEGIN

      /* First execute a query to clean out incomplete data */
        PREPARE STMT FROM  'delete from ? where datestamp is null or source is null or ip is null or length(datestamp) < 1 or length(source) < 1 or length(ip) < 1';
      EXECUTE STMT USING tablename;
            
END$
delimiter ;

Worth 500 points.

Thanks,
Rick
Avatar of Guy Hengel [angelIII / a3]
Guy Hengel [angelIII / a3]
Flag of Luxembourg image

you cannot make the table a parameter...

you have to build the sql statement:

CREATE PROCEDURE importData(tablename varchar(255), userlist varchar(255))
BEGIN
   DECLARE v_SQL as VARCHAR(400);
   
   SET v_SQL = 'delete from `' + tablename + '` where datestamp is null or source is null or ip is null or length(datestamp) < 1 or length(source) < 1 or length(ip) < 1';

      /* First execute a query to clean out incomplete data */
        PREPARE STMT FROM v_SQL;
        EXECUTE STMT;
           
 ...
Avatar of richardsimnett
richardsimnett

ASKER

ok, I tried your suggestion, and I get the following error:

Error while execeuting query: DECLARE work as VARCHAR(255):
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 work as VARCHAR(255)' at line 1 (errno: 1064)

My Code:
      DECLARE work as TEXT;

      SET work = 'delete from ' + tablename + ' where datestamp is null or source is null or ip is null or length(datestamp) < 1 or length(source) < 1 or length(ip) < 1;';

      PREPARE STMT FROM work;
      EXECUTE STMT;

REATE PROCEDURE importData(tablename varchar(255), userlist varchar(255))
BEGIN
   DECLARE v_SQL TEXT;
   
   SET v_SQL = 'delete from `' + tablename + '` where datestamp is null or source is null or ip is null or length(datestamp) < 1 or length(source) < 1 or length(ip) < 1';

      /* First execute a query to clean out incomplete data */
        PREPARE STMT FROM v_SQL;
        EXECUTE STMT;
CREATE PROCEDURE importData(tablename varchar(255), userlist varchar(255))
BEGIN
      DECLARE v_SQL TEXT;
   
      SET v_SQL = 'delete from `' + tablename + '` where datestamp is null or source is null or ip is null or length(datestamp) < 1 or length(source) < 1 or length(ip) < 1';

      /* First execute a query to clean out incomplete data */
        PREPARE STMT FROM v_SQL;
        EXECUTE STMT;
END;


Output:

Error while execeuting query: CREATE PROCEDURE importData(tablename varchar(255), userlist varchar(255))
BEGIN
      DECLARE v_SQL TEXT:
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 'TEXT' at line 3 (errno: 1064)
Click 'Ignore' if you'd like to have this error ignored until the end of the script.

angeliii,
ok I fixed the first issue.. I was forgettign to issue the delimiter commands... I have a totally different issue now:

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 'v_SQL;
      EXECUTE STMT;
END' at line 7 (errno: 1064)
Click 'Ignore' if you'd like to have this error ignored until the end of the script.

The Code:

delimiter $
CREATE PROCEDURE importData(tablename varchar(255), userlist varchar(255))
BEGIN
      DECLARE v_SQL TEXT;
   
      SET v_SQL = 'delete from `' + tablename + '` where datestamp is null or source is null or ip is null or length(datestamp) < 1 or length(source) < 1 or length(ip) < 1';

      PREPARE STMT from v_SQL;
      EXECUTE STMT;
END$
delimiter ;
ASKER CERTIFIED SOLUTION
Avatar of Guy Hengel [angelIII / a3]
Guy Hengel [angelIII / a3]
Flag of Luxembourg 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
ok that one submitted.. yet still a problem... when I call the procedure:

call importData('testlist','testlist2');

I get this error:

mysql> call importData('testlist','testlist2');
ERROR 1064 (42000): 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 '0' at line 1
ok just screwing around to see what was happening I added a select @v_SQL line, and for some reason that outputs 0. I think the query isnt being interpreted properly.
delimiter $
CREATE PROCEDURE importData(tablename varchar(255), userlist varchar(255))
BEGIN
      SET @v_SQL = 'delete from `' + tablename + '` where datestamp is null or source is null or ip is null or length(datestamp) < 1 or length(source) < 1 or length(ip) < 1';

      select @v_SQL as qry;

      PREPARE STMT from @v_SQL;
      EXECUTE STMT;
END$
delimiter ;
angeliii,
nm I got it.... instead of:

SET @v_SQL = 'delete from `' + tablename + '` where datestamp is null or source is null or ip is null or length(datestamp) < 1 or length(source) < 1 or length(ip) < 1';


use

select concat('delete from ',tablename,' where datestamp is null or source is null or ip is null or length(datestamp) < 1 or length(source) < 1 or length(ip) < 1;');

PREPARE STMT FROM @v_SQL;
EXECUTE STMT;

Thanks for the help!
select concat('delete from ',tablename,' where datestamp is null or source is null or ip is null or length(datestamp) < 1 or length(source) < 1 or length(ip) < 1;');

should read:

select concat('delete from ',tablename,' where datestamp is null or source is null or ip is null or length(datestamp) < 1 or length(source) < 1 or length(ip) < 1;') into @v_SQL;