我试着理解函数是如何工作的。我可以在procedure中创建相应的函数,但是不能用select创建一个简单的函数。
element是UNIQUE,thing是PRIMARY
CREATE DEFINER=`root`@`localhost`
FUNCTION `get_element_by_thing`(`thing` VARCHAR(255))
RETURNS VARCHAR(255)
CHARSET utf8
NOT DETERMINISTIC
READS SQL DATA
SQL SECURITY DEFINER
DECLARE @return_element VARCHAR(255);
SET @return_element = (
SELECT
`element`
FROM
`table1`
WHERE
`thing` = thing
);
RETURN @return_element;我使用phpmyadmin接口。
发布于 2017-09-12 17:17:11
1)不要声明用户定义的变量。
MySQL存储程序中局部变量的名称不以at符号开头。例如:
DECLARE stored_program_local_variable VARCHAR(255);
SET stored_program_local_variable = 'somevalue';用户定义变量的名称以at符号开头。( at符号字符将用户定义的变量与其他标识符区分开来。)在存储的程序中声明用户定义的变量是无效的。若要创建用户定义的变量,只需为其赋值即可。例如:
SET @user_defined_variable = 'somevalue';2)如果我们不需要将变量持久化到存储程序的范围之外,我们通常使用局部变量,这些变量只存在于存储的程序执行过程中。(这与处于会话级别的用户定义变量的行为不同。)
3)使用SELECT ... INTO语法将标量值检索到用户定义或局部变量中。https://dev.mysql.com/doc/refman/5.7/en/select-into.html
尝试:
DELIMITER $$
CREATE DEFINER=`root`@`localhost`
FUNCTION `get_element_by_thing`(`thing` VARCHAR(255))
RETURNS VARCHAR(255)
...
BEGIN
DECLARE return_element VARCHAR(255) ;
SELECT t1.element
INTO return_element
FROM table1 t1
WHERE t1.thing = thing
LIMIT 1 ;
RETURN return_element ;
END $$
DELIMITER ;注意:对于歧义标识符(即例程参数和SQL语句中同名的列),例程参数优先于列名。将列引用限定为表名或表别名,这样就不会有歧义。我更喜欢分配不匹配列名的例程参数(和局部变量)名称。
如果由于某种原因需要在SQL语句中为用户定义的变量赋值,则可以使用:=赋值操作符。这在存储程序的上下文之外也是有效的。
SELECT @user_defined_variable := t.somecolumn
FROM mytable t
WHERE somecondition
ORDER BY someexpression
LIMIT 1https://stackoverflow.com/questions/46181758
复制相似问题