0

SQLクエリのいくつかのステートメントでパラメーターとして渡される単純なカウンターを実装しようとしています(以下を参照)。私は次のテスト環境を持っています

CREATE TABLE `test`.`TableA` (
`ColumnA` INT( 3 ) NOT NULL ,
`ColumnB` INT( 5 ) NOT NULL
) ENGINE = MYISAM ;

ALTER TABLE `TableA` ADD INDEX ( `ColumnA` ) 

INSERT INTO `TableA` (`ColumnA`, `ColumnB`) VALUES 
(2, 4654), (2, 223), (5, 12), (4, 32), (3, 23), (5, 21), (1, 2), (2, 2), (4, 2), (5, 1);

カウンターの繰り返しごとに番号付きの出力ファイルが必要です(これを行う方法の 1 つは、ストアド プロシージャを使用することです)。

CREATE PROCEDURE dowhile()
BEGIN
  DECLARE CONT INT DEFAULT 5
  WHILE CONT > 1 DO
  BEGIN
        SELECT TableA.ColumnB
        INTO OUTFILE CONCAT('OUT', CONT)
        FROM TableA
        WHERE TableA.ColumnA = CONT
    SET CONT = CONT - 1
  END
  END WHILE
END;
  • 実行しようとすると構文エラーが発生しますが、どこに問題があるのか​​わかりません: "#1064 - SQL 構文にエラーがあります。MySQL サーバーのバージョンに対応するマニュアルで、使用する正しい構文を確認してください。 'WHILE CONT > 1 DO BEGIN SELECT TableA.ColumnA INTO OUTFILE CONCAT('OUT'' at line 4"
  • このストアド プロシージャを実行する方法
4

1 に答える 1

0

2つの問題のようです:

  • mysql-client はすべての「;」を解釈します。手順をサーバーに渡す前に、最初に別の区切り文字を設定する必要があります
  • ここで試したように、動的ファイル名を outfile として使用することはできません

多くのグーグル検索で、MySql 5.1.51で動作する次のソリューションにたどり着きました:

delimiter //

CREATE PROCEDURE doWhile()
BEGIN
  DECLARE CONT INT DEFAULT 5;
  DECLARE filename VARCHAR(32);
  WHILE CONT > 1 DO
        SET @myvar = CONCAT('SELECT TableA.ColumnB INTO OUTFILE', "'", CONCAT('OUT', CONT), "'", 'FROM TableA WHERE TableA.ColumnA = ', CONT );
        PREPARE stmt1 FROM @myvar;
        EXECUTE stmt1;
        DEALLOCATE PREPARE stmt1;
        SET CONT = CONT - 1;
  END WHILE;
END
于 2011-11-09T08:45:59.753 に答える