【问题标题】:MySql, temp tables, error 1422MySql,临时表,错误 1422
【发布时间】:2012-09-11 10:01:08
【问题描述】:

我的问题是:

我使用 3 个函数和 1 个 SP 将数字转换为单词...当我从我的一个函数调用 SP 时

    CALL extenso_trata_grupo(`ivalor`, ' Triliao', ' Trilioes', `flag_e`, `s_ext`);
    Select `s_ext` INTO `s_ext` from tbl_temp;

这给了我一个 1422 错误...当我自己(单独)使用它时,没有INTO,它没有给我任何错误...

有什么帮助吗?

更新

BEGIN
DECLARE ivalor BIGINT;
DECLARE s_ext VARCHAR(255);
DECLARE flag_e BIT;
DECLARE grupo DECIMAL(10, 2);

SET s_ext = '';
SET flag_e  = 0;
SET grupo   = 0;

if valor >= 1 then
    set ivalor = valor / 1000000000000;
    if ivalor > 0 then
        set valor = valor - (ivalor * 1000000000000);
        CALL extenso_trata_grupo(`ivalor`, ' Triliao', ' Trilioes', `flag_e`, `s_ext`);
            Select `s_ext` INTO `s_ext` from tbl_temp;
    end if;
    set ivalor = valor / 1000000000;
    if ivalor > 0 then
        set valor = valor - (ivalor * 1000000000);
        CALL extenso_trata_grupo(`ivalor`, ' Biliao', ' Bilioes', `flag_e`, `s_ext`);
                Select `s_ext` INTO `s_ext` from tbl_temp;
    end if;
    set ivalor = valor / 1000000;
    if ivalor > 0 then
        set valor = valor - (ivalor * 1000000);
        CALL extenso_trata_grupo(`ivalor`, ' Milhao', ' Milhao', `flag_e`, `s_ext`); 
            Select `s_ext` INTO `s_ext` from tbl_temp;
    end if;
    ...
    return `s_ext`;
END

更新

存储过程 extenso_trata_grupo

BEGIN
DECLARE RETORNO VARCHAR(255);
DECLARE FLAG INT;

SET RETORNO = s_ext;
SET FLAG    = flag_e;

if grupo <> 0 THEN
    if flag_e = 1 THEN
        SET RETORNO = CONCAT(RETORNO,' e');
    END IF;
    SET flag_e = 1;
    SET RETORNO = CONCAT(RETORNO,
        (SELECT extenso_grupo(grupo) as grupo),
        (CASE WHEN grupo = 1 THEN singular ELSE plural END));
END IF;
DROP TABLE IF EXISTS `tbl_temp`;
CREATE TEMPORARY TABLE `tbl_temp` (
    flag_e tinyint,
    s_ext varchar(255)
);
INSERT INTO `tbl_temp` (flag_e, s_ext) VALUES(flag, retorno);
END

【问题讨论】:

  • 您需要更多代码吗?谢谢你的帮助;)
  • 该存储过程创建了一个临时表,这就是我标记临时表的原因.. 好吧,我的英语不是最好的,我知道.. 抱歉...我不知道如何解释我的问题更好..所以希望有人帮助我..
  • 当然还有它的 mysql.... --' 我正在使用它...
  • ofc 不是,那是一个函数,正如我一开始所说,我使用 3 个函数和 1 个存储过程...
  • 墓碑?现在你删除了你的cmets?并降低我的问题? :(真的很好

标签: mysql stored-procedures temp-tables


【解决方案1】:

我刚刚飞过你的代码,读完后停了下来:

if valor >= 1 then
    set ivalor = valor / 1000000000000;
    if ivalor > 0 then
        set valor = valor - (ivalor * 1000000000000);
        CALL extenso_trata_grupo(`ivalor`, ' Triliao', ' Trilioes', `flag_e`, `s_ext`);
            Select `s_ext` INTO `s_ext` from tbl_temp;
    end if;

代码在if ivalor &gt; 0 then 之后永远不会通过,您可能需要将其更改为if ivalor &gt;= 1 then

set valor = valor - (ivalor * 1000000000000); valor 之后将永远是0。你以前做过set ivalor = valor / 1000000000000;,所以基本上你在做

set valor = valor - (valor / 1000000000000 * 1000000000000);

线

Select `s_ext` INTO `s_ext` from tbl_temp;

tbl_temp 的哪一行应该分配给s_ext?您不能分配一整列,例如数组或其他内容。

我不会审查您的整个代码或为您编写它。我建议您提出自己的解决方案来解决问题,并且不要尝试转换其他人的解决方案。在那里提出的问题将在这里得到愉快的回答。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 2013-01-23
    • 2011-01-20
    • 2014-05-03
    • 1970-01-01
    相关资源
    最近更新 更多