【发布时间】:2016-10-21 01:21:01
【问题描述】:
在 MySQL 中调用用户定义的函数时遇到问题。计算非常简单,但无法掌握出错的地方以及出错的原因。事情是这样的。
所以我创建了这个函数:
DELIMITER //
CREATE FUNCTION fn_computeLoanAmortization (_empId INT, _typeId INT)
RETURNS DECIMAL(17, 2)
BEGIN
SET @loanDeduction = 0.00;
SELECT TotalAmount, PeriodicDeduction, TotalInstallments, DeductionFlag
INTO @totalAmount, @periodicDeduction, @totalInstallments, @deductionFlag
FROM loans_table
WHERE TypeId = _typeId AND EmpId = _empId;
IF (@deductionFlag = 1) THEN
SET @remaining = @totalAmount - @totalInstallments;
IF(@remaining < @periodicDeduction) THEN
SET @loanDeduction = @remaining;
ELSE
SET @loanDeduction = @periodicDeduction;
END IF;
END IF;
RETURN @loanDeduction;
END;//
DELIMITER ;
如果我这样称呼它,它可以正常工作:
SELECT fn_computeLoanAmortization(3, 4)
但是如果我在 SELECT 语句中调用它,结果就会出错:
SELECT Id, fn_computeLoanAmortization(Id, 4) AS Amort FROM emp_table
loans_table 中只有一个条目,上面的语句应该只导致 Amort 列中有一行具有值,但是有很多随机行具有相同的值Amort 值作为匹配条目的值,不应该是这种情况。
有没有人遇到过这种奇怪的困境?或者我可能做错了什么。请赐教。
非常感谢。
编辑: 错误的意思是这样的:
loans_table has one record
EmpId = 1
TypeId = 2
PeriodicDeduction = 100
TotalAmount = 1000
TotalInstallments = 200
DeductionFlag = 1
emp_table has several rows
EmpId = 1
Name = Paolo
EmpId = 2
Name = Nikko
...
EmpId = 5
Name = Ariel
当我查询以下语句时,我得到了正确的值:
SELECT fn_computeLoanAmortization(1, 2)
SELECT Id, fn_computeLoanAmortization(Id, 2) AS Amort FROM emp_table WHERE EmpId = 1
但是当我查询这个语句时,我得到了不正确的值:
SELECT Id, fn_computeLoanAmortization(Id, 2) AS Amort FROM emp_table
结果集将是:
EmpId | Amort
--------------------
1 | 100
2 | 100 (this should be 0, but the query returns 100)
3 | 100 (same error here)
...
5 | 100 (same error here up to the last record)
【问题讨论】:
-
请举例说明“错误”的含义。
-
您没有向我们展示真正的查询。在问题中,您将 my_table 写为表名。我想,你真正的查询有一个连接或者在不同的表上执行而不是loans_表
-
如何运行:SELECT Id, fn_computeLoanAmortization(Id, 4) AS Amort FROM my_table WHERE Id = 3; ?
-
@NineBerry - 这是一张员工表。它只是一张基本表,没有连接或诸如此类的东西。它没有被编辑。谢谢。
-
@arkki - 当我挑选出 Id 时,我得到了正确的值,但是当我在组中使用它时(比如在查询中使用 IN),它显示不正确的数据..(例如值应该是0,因为它在 loan_table 中没有匹配项,但它的值是 1000,它不知从何而来)
标签: mysql function user-defined-functions