MySQL存储过程预编译语句引号报错,PgSQL迁移语法错误求助
MySQL存储过程转换报错解决方案
已识别的错误点
- 入参变量拼写错误:你代码中
QUOTE(_esta_caminho_foto_perfildo)的变量名完全错误,你定义的存储过程入参为_caminho_foto_perfil,不存在的变量会导致SQL拼接结果异常,直接触发语法错误。 - 缺少分隔符声明:MySQL默认语句分隔符为
;,创建存储过程时如果不临时修改分隔符,数据库会把存储过程内部的;识别为整条CREATE语句的结束标记,直接触发语法报错。 - 缺失必填字段:原PG代码中声明了
dt_cadastro、last_login、update_reg三个自动填充的当前日期字段并插入表中,你写的MySQL版本插入语句完全没有包含这三个字段,如果client表结构保留了这三个字段且未设置默认值,执行插入也会报错。
修正后的完整代码
你当前的场景完全不需要使用动态拼接SQL的写法,直接使用静态INSERT语句更安全也更易维护,修正后代码如下:
-- 临时修改语句分隔符为//,避免存储过程内部的;被误判为语句结束 DELIMITER // CREATE PROCEDURE cadastro_cliente( IN _cpf VARCHAR(20), IN _nome TEXT, IN _data_nasc DATE, IN _telefone VARCHAR(20), IN _email VARCHAR(100), IN _senha VARCHAR(12), IN _endereco TEXT, IN _cep VARCHAR(20), IN _cidade VARCHAR(50), IN _estado CHAR(2), IN _caminho_foto_perfil TEXT ) BEGIN -- 声明PG版本要求的三个自动填充日期字段 DECLARE dt_cadastro DATE DEFAULT DATE(NOW()); DECLARE last_login DATE DEFAULT DATE(NOW()); DECLARE update_reg DATE DEFAULT DATE(NOW()); -- 补全所有插入字段,修正变量拼写 INSERT INTO cliente ( cpf, nome, data_nasc, telefone, email, senha, endereco, cep, cidade, estado, caminho_foto_perfil, dt_cadastro, last_login, update_reg ) VALUES ( _cpf, _nome, _data_nasc, _telefone, _email, _senha, _endereco, _cep, _cidade, _estado, _caminho_foto_perfil, dt_cadastro, last_login, update_reg ); END // -- 改回默认的;分隔符 DELIMITER ;
内容的提问来源于stack exchange,提问作者Hugo Mori
相关产品推荐
相关产品推荐

