0

私はSQLの初心者です..オラクルのシーケンスのように動作するプロシージャを作成したいプロシージャを
作成すると、エラーが発生します:1242...助けてください~


  1. ターゲット テーブル

    CREATE TABLE id_generator (

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

    );

  2. 手順

    区切り記号 $$

    sp_seq$$ が存在する場合はドロップ プロシージャ

    CREATE PROCEDURE 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);
    

    END $$

    デリミタ;

  3. 呼び出し手順の後、エラーが見つかりました: 1242:

    CALL sp_seq('1234');

    --> エラー: エラー コード: 1242。サブクエリが複数の行を返します

4

2 に答える 2

0

このクエリ

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
于 2015-01-07T16:47:35.237 に答える
0

このクエリ

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

複数のレコードを返し、単一の変数に格納することはできません。

where org_code = org_code

は常に真です。入力パラメーターの名前を、列名以外の名前に変更します。そうしないと、DB はそれらを区別できません。

于 2015-01-07T16:12:20.297 に答える