【问题标题】:MySql procedure error:1242MySql 程序错误:1242
【发布时间】:2015-01-07 16:07:12
【问题描述】:

我是 sql 的初学者.. 我想让过程像 oracle 中的序列一样
制作过程,遇到错误:1242...请帮帮我~


  1. 目标表

    创建表 id_generator (

       seq_currval INT(8) UNSIGNED NOT NULL, 
       org_code varchar(4) not null
    

    );

  2. 程序

    分隔符 $$

    如果存在则删除过程 sp_seq$$

    创建过程 sp_seq(IN org_code varchar(4), OUT parma1 VARCHAR(11))

    开始

       DECLARE year   VARCHAR(1);
       DECLARE month   VARCHAR(2);
       DECLARE seq_current int;
       SET year = '5';
       SET month = '01';
       SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
    
       START TRANSACTION;
    
       SET seq_current = (select seq_currval 
                          from id_generator 
                          where org_code = org_code);
       update id_generator 
       set seq_currval = seq_current + 1 where org_code = org_code;
    
       COMMIT;
    
       SET seq_current = seq_current + 1;
    
       select CONCAT(year, month ,seq_current);
    

    结束$$

    分隔符;

  3. 调用程序后,我发现错误:1242:

    调用 sp_seq('1234');

    --> 错误:错误代码:1242。子查询返回多于 1 行

【问题讨论】:

  • 您设置 seq_current 的子查询有问题(因为它返回多行)。我对 mysql 语法不够熟悉,但我猜它与您使用的参数名称有关...尝试将其更改为例如 vorg_code(数据类型,然后是变量名称)

标签: mysql mysql-error-1242


【解决方案1】:

这个查询

SET seq_current = (select seq_currval 
                      from id_generator 
                      where org_code = org_code);

返回多条记录,并且不能存储在单个变量中。

where org_code = org_code

总是正确的。将输入参数重命名为列名以外的其他名称。否则数据库无法区分它们。

【讨论】:

    【解决方案2】:

    这个查询

    select seq_currval 
                          from id_generator 
                          where org_code = org_code
    

    总是返回与 1=1 相似的所有行

    改成:

    select seq_currval 
                          from id_generator 
                          where id_generator.org_code = org_code
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多