MySQL 定义 INNER JOIN 表时存储函数语法错误
MySQL Stored Function syntax error while defining INNER JOIN tables
我的Sql代码是这样的:
DELIMITER $$
CREATE FUNCTION `get_theme`(`section_type` VARCHAR(50))
RETURNS VARCHAR(50)
CONTAINS SQL
SQL SECURITY DEFINER
BEGIN
DECLARE name,dirname VARCHAR(50) ;
SELECT a.name INTO name , a.dirname INTO dirname FROM themes as a
INNER JOIN sections as b ON
a.section_id = b.id
WHERE b.name = 'administrators' AND a.`status` = 'Y';
RETURN name + '#' + dirname;
END $$
DELIMITER ;
当我在 heidiSQL 9.2.0.4961 中执行此代码时出现此错误:未定义变量:a
但是当我执行这段代码时:
SELECT a.name as name , a.dirname as dirname FROM themes as a
INNER JOIN sections as b ON
a.section_id = b.id
WHERE b.name = 'administrators' AND a.`status` = 'Y';
没有问题,完全可以正常工作。
我的代码有什么问题?有什么想法吗?
您使用的语法错误。
正确的语法是:
SELECT list_of_expressions INTO list_of_variables FROM ...
替换此片段:
SELECT a.name INTO name , a.dirname INTO dirname FROM themes as a
这个:
SELECT a.name, a.dirname INTO name , dirname FROM themes as a
注意一点:不要将与 table 中的列相同的名称分配给变量,例如:DECLARE name,dirname
,如果您想稍后使用它们,它会导致混淆和错误在查询中。为变量使用前缀,例如:DECLARE v_name,v_dirname
我的Sql代码是这样的:
DELIMITER $$
CREATE FUNCTION `get_theme`(`section_type` VARCHAR(50))
RETURNS VARCHAR(50)
CONTAINS SQL
SQL SECURITY DEFINER
BEGIN
DECLARE name,dirname VARCHAR(50) ;
SELECT a.name INTO name , a.dirname INTO dirname FROM themes as a
INNER JOIN sections as b ON
a.section_id = b.id
WHERE b.name = 'administrators' AND a.`status` = 'Y';
RETURN name + '#' + dirname;
END $$
DELIMITER ;
当我在 heidiSQL 9.2.0.4961 中执行此代码时出现此错误:未定义变量:a
但是当我执行这段代码时:
SELECT a.name as name , a.dirname as dirname FROM themes as a
INNER JOIN sections as b ON
a.section_id = b.id
WHERE b.name = 'administrators' AND a.`status` = 'Y';
没有问题,完全可以正常工作。
我的代码有什么问题?有什么想法吗?
您使用的语法错误。
正确的语法是:
SELECT list_of_expressions INTO list_of_variables FROM ...
替换此片段:
SELECT a.name INTO name , a.dirname INTO dirname FROM themes as a
这个:
SELECT a.name, a.dirname INTO name , dirname FROM themes as a
注意一点:不要将与 table 中的列相同的名称分配给变量,例如:DECLARE name,dirname
,如果您想稍后使用它们,它会导致混淆和错误在查询中。为变量使用前缀,例如:DECLARE v_name,v_dirname