I need to create a PROCEDURE in MariaDB
because ...... ?
Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.
Dear Friends, I am using Laravel 10, MariaDB for my web application. My working code snippet as
$phver = [];
$phaseVersions = '';
$phaseMasterData = PhaseMasterModel::orderBy('created_at', 'desc')->get();
foreach ($phaseMasterData as $ph) {
$phase = $ph->phase;
$start_date = $ph->start_date;
$end_date = $ph->end_date;
$versionMasterData = VersionMasterModel::where('phase', $phase)->select('version')->get();
$phver = $versionMasterData->pluck('version')->toArray();
if (!empty($phver)) {
$phaseVersions = implode("','", $phver);
$query = "update " . $gen_table_name . " set phase = ? where eid_timestamp > '2019-12-31' and version in ('" . $phaseVersions . "')";
$genUpdate1 = DB::update($query, [$phase]);
$genUpdate2 = DB::table($gen_table_name)
->where('eid_timestamp', '>=', $start_date)
->where('eid_timestamp', '<=', $end_date)
->whereNotIn('phase', [$phase])
->update(['phase' => $phase]);
}
}
The above code works fine . But I need to create a PROCEDURE in MariaDB for same purpose . I created procedure as
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `update_phases_on_upload`(
IN phase VARCHAR(255),
IN start_date DATE,
IN end_date DATE,
IN gen_table_name VARCHAR(255),
IN phase_versions VARCHAR(255)
)
BEGIN
DECLARE query VARCHAR(1000);
SET @query = '';
IF phase_versions IS NOT NULL THEN
SET @query = CONCAT('UPDATE ', gen_table_name, ' SET phase = ? WHERE eid_timestamp > ''2019-12-31'' AND version IN (''', phase_versions, ''')');
PREPARE stmt FROM @query;
EXECUTE stmt USING phase;
DEALLOCATE PREPARE stmt;
END IF;
SET @query = CONCAT('UPDATE ', gen_table_name, ' SET phase = ? WHERE eid_timestamp >= ? AND eid_timestamp <= ? AND phase <> ?');
PREPARE stmt FROM @query;
SET @phase = phase;
SET @start_date = start_date;
SET @end_date = end_date;
EXECUTE stmt USING @phase, @start_date, @end_date, @phase;
DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;
I changed my above controller code as
$phver = [];
$phaseVersions = '';
$phaseMasterData = PhaseMasterModel::orderBy('created_at', 'desc')->get();
foreach ($phaseMasterData as $ph) {
$phase = $ph->phase;
$start_date = $ph->start_date;
$end_date = $ph->end_date;
$versionMasterData = VersionMasterModel::where('phase', $phase)->select('version')->get();
$phver = $versionMasterData->pluck('version')->toArray();
if (!empty($phver)) {
$phaseVersions = implode("','", $phver);
DB::unprepared('CALL update_phases_on_upload(?, ?, ?, ?, ?)', [
$phase,
$start_date,
$end_date,
$gen_table_name,
$phaseVersions,
]);
}
}
But I got error as
"message": "SQLSTATE[42000]: Syntax error or access violation: 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 '?, ?, ?, ?, ?)' at line 1 (Connection: mysql, SQL: CALL update_phases_on_upload(?, ?, ?, ?, ?))",
"exception": "Illuminate\Database\QueryException",
"file": "C:\xampp\htdocs\akshaya_payment\vendor\laravel\framework\src\Illuminate\Database\Connection.php",
"line": 793,
"trace": [
{
"file": "C:\xampp\
My table schema I trying to update is as
CREATE TABLE `gen_jan2025_mar2025` (
`sl` int(10) UNSIGNED NOT NULL,
`eid` varchar(40) NOT NULL,
`reg_id` varchar(5) DEFAULT NULL,
`EA` int(11) DEFAULT NULL,
`State_Name` varchar(20) DEFAULT NULL,
`State_code` varchar(20) DEFAULT NULL,
`District_Name` varchar(20) DEFAULT NULL,
`District_code` varchar(20) DEFAULT NULL,
`pincode` varchar(10) DEFAULT NULL,
`version` varchar(10) DEFAULT NULL,
`mcid` varchar(5) NOT NULL,
`month` int(11) NOT NULL,
`year` int(11) NOT NULL,
`phase` char(2) DEFAULT '0',
`eid_timestamp` date NOT NULL,
`cut_date` date DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
updating dynamic table schema is as below
CREATE TABLE `gen_jan2025_mar2025` (
`sl` int(10) UNSIGNED NOT NULL,
`eid` varchar(40) NOT NULL,
`reg_id` varchar(5) DEFAULT NULL,
`EA` int(11) DEFAULT NULL,
`State_Name` varchar(20) DEFAULT NULL,
`State_code` varchar(20) DEFAULT NULL,
`District_Name` varchar(20) DEFAULT NULL,
`District_code` varchar(20) DEFAULT NULL,
`pincode` varchar(10) DEFAULT NULL,
`version` varchar(10) DEFAULT NULL,
`mcid` varchar(5) NOT NULL,
`month` int(11) NOT NULL,
`year` int(11) NOT NULL,
`phase` char(2) DEFAULT '0',
`eid_timestamp` date NOT NULL,
`cut_date` date DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
How to solve above issue. Please advise
Thanks
Anes P A
Please or to participate in this conversation.