MySQL Prepare statement syntax - mysql

I am having trouble getting my prepare statement to run in MySQL 5.6.14; here is the block of code in question:
SET #backupDate = DATE(NOW());
SET #renameTable = CONCAT('RENAME TABLE activeDirectoryData TO actDirBackup-', #backupDate);
PREPARE goRenameTable FROM #renameTable;
EXECUTE goRenameTable;
DEALLOCATE PREPARE goRenameTable;
The script stops at the prepare statement, with the following error:
Error Code: 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 '-2013-11-06' at line 1
Any idea what is wrong here?

The name actDirBackup- with the value coming from #backupDate isn't a valid table name, you have to escape it, something like this:
SET #renameTable = CONCAT('RENAME TABLE activeDirectoryData TO `actDirBackup-',
#backupDate, '`');

Related

mysql prepared statement unable to execute. Getting error 1064 in prepared statement

Query is retrieving correct result but in Prepared statement getting error "Error Code: 1064. check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO audittrail(BATCHID,IPADDRESS,DATE,LINENAME,ACTION) values (1165' at line 2"
Thanks in advance:-)
CREATE DEFINER = 'root'#'localhost'
PROCEDURE new_procedure()
BEGIN
DECLARE stmt text;
SET #stmt = (SELECT CONCAT('START TRANSACTION; \n', GROUP_CONCAT(objdata SEPARATOR ';\n'),';\nCOMMIT; \n DELETE FROM qry_obj_dtl where id in (',GROUP_CONCAT(ID SEPARATOR','),');') AS objData1 FROM qry_obj_dtl);
SELECT #stmt;
PREPARE param_stmt FROM #stmt;
EXECUTE param_stmt;
DEALLOCATE PREPARE param_stmt;
END

Dynamic SQL on mySQL 8

The plan is to construct a dynamic sql that will execute create view statements. We have multiple servers but the schemas are the same across all servers.
I have started off with the following,
set #businessId = 'buName-1234.';
SET #table_name:= concat(#businessId,'Test');
SELECT #table_name;
SET #sql:=CONCAT('SELECT * FROM ',#table_name);
SELECT #sql;
which gives the output as,
SELECT * FROM buName-1234.Test
The issue arises on the execution part,
PREPARE dynamic_statement FROM #sql;
EXECUTE dynamic_statement;
DEALLOCATE PREPARE dynamic_statement;
The error is,
Error Code: 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 '-1234.Test' at line 1
I have tried changing the single quote set #businessId = 'buName-1234.'; to a backtick, but that also fails with error,
Error Code: 1054. Unknown column 'buName-1234.' in 'field list'
The error can't be replicated on dbfiddle
Concatenating backticks to the server name is the way to do this in my case, like so,
SET #databaseName= 'buName-1234';
SET #table = 'Test';
SET #fullTable_name:= concat("`",#databaseName,"`.",#table);
SET #sql:= CONCAT('SELECT * FROM ',#fullTable_name,";");
SELECT #sql
which give the output as,
SELECT * FROM `buName-1234`.Test;
which can be used in PREPARE & EXECUTE.

MariaDB: How to store a Table name into a variable?

I need to use multiple times a table name into a query. To avoid repeating it I want to store the name into a User-Defined Variable.
What is wrong with this query?
SET #tableName := 'de-Table'
SELECT * FROM #tableName;
In MariaDB the error is cryptic and (as usual) doesn't help at all:
/* SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT * FROM #tableName' at line 3 */
Thank you in advance
You need to use dynamic MySQL if you want a variable to be the table name. The following should work, if you're doing this directly from MySQL:
SET #tableName = 'de-Table';
SET #query = CONCAT('SELECT * FROM ', #tableName);
PREPARE stmt FROM #query;
EXECUTE stmt;

How to execute a query stored in a variable in MySQL?

I am trying to execute queries in sqlyog which are
SET #adm_code = 12781;
SET #transfer = (SELECT MAX(id) FROM std_transfer_history AS sth
WHERE admission_code = #adm_code);
EXECUTE #transfer;
but it gives an error
Query: execute #transfer
Error Code: 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 '#transfer' at line 1
Execution Time : 0 sec
Transfer Time : 0 sec
Total Time : 0 sec
So how can I'll get rid of....
You are missing the prepare statement to execute a dynamic query.
// your transfer variable query ...
PREPARE stmt FROM #transfer;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

MySQL Stored Procedure with Prepared Statement does not work

I have the following stored procedure:
CREATE PROCEDURE getLastValueAutomaticShelter(IN fieldName varchar(30), position_number INT)
BEGIN
SET #query = CONCAT('SELECT * FROM automatic_changes WHERE',fieldName,'IS NOT NULL AND P_id=?');
PREPARE stmt FROM #query;
SET #position_number=position_number;
EXECUTE stmt USING #position_number;
DEALLOCATE PREPARE stmt;
END
Then I am running it:
mysql> call getLastValueAutomaticShelter('current_level', 500)//
And getting the following error:
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 'NOT N
ULL AND P_id=?' at line 1
Any ideas? Thanks.
You need to add some spaces in there:
SET #query = CONCAT('SELECT * FROM automatic_changes WHERE ',fieldName,' IS NOT NULL AND P_id=?');
/* right ^ here....and ^ here*/
Otherwise your final query might look like this:
SELECT * FROM automatic_changes WHEREcolumnameIS NOT NULL AND P_id='whatever';
You get the idea :)