2

私はこの関数を作成しようとしています:

CREATE FUNCTION remove_non_alphanum (prm_strInput varchar(3000))
RETURNS VARCHAR(3000)
DETERMINISTIC

BEGIN

  DECLARE i INT DEFAULT 1;
  DECLARE v_char VARCHAR(1);
  DECLARE v_parseStr VARCHAR(3000) DEFAULT '';

  WHILE (i <= LENGTH(prm_strInput) )  DO
    SET v_char = SUBSTR(prm_strInput,i,1);

    IF v_char REGEXP '^[A-Za-z0-9]$' THEN
      SET v_parseStr = CONCAT(v_parseStr,v_char);  
    END IF;

    SET i = i + 1;
  END WHILE;

  RETURN trim(v_parseStr);
END

しかし、MySQLは次のように述べています。

13:52:45 [CREATE-0行、0.000秒] [エラーコード:1064、SQL状態:42000]SQL構文にエラーがあります。5行目の''の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

何が間違っているのでしょうか?構文は私には正しいように見えます。

4

3 に答える 3

9

;関数内で使用できるように、区切り文字を変更する必要があります。

DELIMITER $$

CREATE FUNCTION remove_non_alphanum (prm_strInput varchar(3000))
RETURNS VARCHAR(3000)
DETERMINISTIC
BEGIN
  DECLARE i INT DEFAULT 1;
  DECLARE v_char VARCHAR(1);
  DECLARE v_parseStr VARCHAR(3000) DEFAULT '';
WHILE (i <= LENGTH(prm_strInput) )  DO
  SET v_char = SUBSTR(prm_strInput,i,1);
  IF v_char REGEXP '^[A-Za-z0-9]$' THEN
        SET v_parseStr = CONCAT(v_parseStr,v_char);  
  END IF;
  SET i = i + 1;
END WHILE;
RETURN trim(v_parseStr);
END
$$

DELIMITER ;

MySQL コマンドライン クライアント(および他の多くの SQL クライアント)では、デフォルトの区切り文字は;. そのため、元のコードを入力すると、MySQL は最初のコマンド;が見つかった場所 (エラー メッセージに示されているように 5 行目) で最初のコマンドが終了したと見なし、これは有効な SQL ではないため、エラーが発生します。

CREATE FUNCTION remove_non_alphanum (prm_strInput varchar(3000))
RETURNS VARCHAR(3000)
DETERMINISTIC
BEGIN
  DECLARE i INT DEFAULT 1;

デリミタを別のものに変更すると、MySQL は完全なコマンド (to からCREATE FUNCTIONto まで) を識別しENDて実行します。ほら! 関数が作成されます。最後に、関数を実行すると、関数本体が複数のステートメントで構成されているため、コードは問題なく実行されます。デフォルトの区切り文字を使用します。

于 2011-07-08T18:00:29.237 に答える
2

ここで答えを見つけました。

DB Visualizer の奇妙な問題であることがわかりました。

完全なブロックを「--/」と「/」で囲むとうまくいきました:

--/
CREATE FUNCTION remove_non_alphanum (prm_strInput varchar(3000))
RETURNS VARCHAR(3000)
DETERMINISTIC
BEGIN
  DECLARE i INT DEFAULT 1;
  DECLARE v_char VARCHAR(1);
  DECLARE v_parseStr VARCHAR(3000) DEFAULT '';
WHILE (i <= LENGTH(prm_strInput) )  DO
  SET v_char = SUBSTR(prm_strInput,i,1);
  IF v_char REGEXP '^[A-Za-z0-9]$' THEN
        SET v_parseStr = CONCAT(v_parseStr,v_char);  
  END IF;
  SET i = i + 1;
END WHILE;
RETURN trim(v_parseStr);
END
/
于 2011-07-08T18:33:27.140 に答える