【发布时间】:2016-09-17 23:32:26
【问题描述】:
以下是我正在处理的用于计算利息的存储过程的示例代码。此代码不可执行,因为根据在游标声明之前定义创建临时表块时发现它的问题,但是如果我最近在游标声明之后定义了相同的东西,那么它就会成功执行。
1- 我的问题是我在游标内使用该表,所以我必须在游标之后定义,否则我错过了什么??
CREATE PROCEDURE `sp_interest_calculation_test`(
IN sub_type CHAR(1)
)
BEGIN
DECLARE s_ledger_id INT;
DECLARE s_start, s_end, s_tran INT DEFAULT 0;
**DROP TABLE IF EXISTS tmp_interest;
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_interest(
id int(11) NOT NULL AUTO_INCREMENT,
ledger_id INT UNSIGNED,
dr_amount INT,
cr_amount INT,
balance INT
);**
DECLARE cur_saving_acc CURSOR FOR
SELECT SQL_CALC_FOUND_ROWS 1;
OPEN cur_saving_acc;
SET s_end = (SELECT FOUND_ROWS());
WHILE s_start<s_end DO
FETCH cur_saving_acc INTO s_ledger_id;
INSERT INTO tmp_interest(ledger_id)
SELECT s_ledger_id;
SELECT * FROM tmp_interest;
/*Interest calculation logic ends here */
SET s_start = s_start+1;
END WHILE;
CLOSE cur_saving_acc;
END
2- 成功执行上述存储过程(游标声明后定义临时表)后,调用SP时出现以下问题:
CALL sp_interest_calculation_test ('A');
“错误代码:1075 表定义不正确;只能有一个自动列,并且必须定义为一个键”
这是因为我错过了将 id 定义为主键,所以我简单地更改了列
id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY
我第一次在 MySQL 中使用存储过程,解决上述问题对我来说很忙,所以请您描述一下上述问题及其原因,并且无论如何定义自动编号列而不将其定义为主键?
注意:参数 sub_type 没有在任何地方使用,并且示例代码中的光标内没有执行更多操作,尽管我正在处理块内的重度兴趣计算。
非常感谢您,并希望大家对这个问题感兴趣。 (我没有找到任何关于这些问题的确切信息)。我也在寻找它的替代方案,只需计算每个分类帐的借方、贷方、余额,我在单个查询中尝试了没有循环但执行永远不会结束。
【问题讨论】:
标签: mysql sql stored-procedures primary-key temp-tables