2017-10-16 174 views
0

对不起还有一个关于MySQL错误1415的问题!mariaDB(MySQL)在使用SELECT INTO后仍然得到“不允许从函数返回结果集”的错误1415

但我已经花了两个小时对此 - 我已阅读 - 我认为 - 关于StackOverflow上的错误1415以及谷歌的许多结果的所有类似问题,但不幸的是,我仍然无法找到在哪里以下函数声明出错了。

我使用的是标准的1GBTPC-H数据库做一些课程作业。这个函数计算完成嵌入式SQL查询所花费的时间。

DELIMITER // 

CREATE FUNCTION 
TestIndex (
    P_PARTNAME CHAR(55) 
) 
RETURNS INTEGER 

BEGIN 

    DECLARE 
     BEGINTIME TIMESTAMP(3); 
    DECLARE 
     ENDTIME TIMESTAMP(3); 
    DECLARE 
     DURATION INT; 

    SELECT 
     CURRENT_TIMESTAMP(3) 
    INTO 
     BEGINTIME; 

    SELECT 
     1 
    FROM 
     PART 
    WHERE 
     P_NAME = P_PARTNAME; 

    SELECT 
     CURRENT_TIMESTAMP(3) 
    INTO 
     ENDTIME; 

    SELECT 
     TIMESTAMPDIFF(MICROSECOND, BEGINTIME, ENDTIME) 
    INTO 
     DURATION; 

RETURN DURATION; 

END // 

我使用MariaDB的,在Fedora 26(是的,它是在Fedora上,不能更新,哈哈)的最新版本 - 好了,我不认为这有什么用的版本我的DBMS。

虽然我经历了以前文章的优秀解决方案,但我已经改变了很多原始函数,并且尽我所能确保每行都在MySQL的能力范围内(例如,关于教科书的给定示例使用PERFORM * FROM,这是一个PostgreSQL特殊,所以我切换到SELECT 1 FROM,根据多个帖子。

我甚至想RETURN 1但它仍然是1415错误。我没有任何花的语法规则运行?谢谢!

+0

你应该可以解决数据类型,因此当函数要返回一个int不必返回时间戳。而且 - 据我所知 - timestampdiff()返回一个整数,而不是'timestamp'。 –

+0

'SELECT 1 FROM PART WHERE P_NAME = P_PARTNAME'没有'INTO'子句。它试图返回结果集。 –

+0

@GordonLinoff谢谢!我将'DURATION'的数据类型更改为'INT',但它仍然不起作用。 (我也更新了问题中的代码) – jackxujh

回答

0

把它变成一个存储过程,然后你可以做SELECT,或者其他什么

同时,有一个包含定时结果的参数OUT

的计算可以简化为跳过声明和使用

SET @BEGINTIME := CURRENT_TIMESTAMP(6); 
... 
SET OutResult := TIMESTAMPDIFF(MICROSECOND, @BEGINTIME, CURRENT_TIMESTAMP(6)); 
+0

感谢您的回答!你可以更具体一点,我应该如何添加'OUT'参数? – jackxujh

+0

https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html –

相关问题