0

以下のストアド プロシージャを実行しようとしています。

CREATE PROCEDURE RNS_CLEANTEXT_MAX_LENGTH()
BEGIN
 SELECT MAX(LENGTH(rns_cleantext) - LENGTH(REPLACE(rns_cleantext," ", ""))+1) FROM rns;
END

ただし、次のメッセージが表示されるため、このクエリは実行されません。

You have an error in your SQL syntax; 
Check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3

また、一重引用符、エスケープされた引用符、および上記の二重引用符も試しました。

何か案が。

@eggyal によって修正されました:

固定クエリは次のようになります。

CREATE FUNCTION RNS_CLEANTEXT_MAX_LENGTH()
 SELECT MAX(LENGTH(rns_cleantext) - LENGTH(REPLACE(rns_cleantext," ", ""))+1) FROM fns;

@eggyal が指摘しているように、Begin ステートメントと End ステートメントは必要ありません。そして、それらがそうである場合、区切り文字を変更する必要があります。

ありがとう!

4

1 に答える 1

1

ストアド プログラムの定義に記載されているとおり:

各ストアド プログラムには、SQL ステートメントで構成される本体が含まれています。;このステートメントは、セミコロン ( ) 文字で区切られた複数のステートメントで構成される複合ステートメントである場合があります。たとえば、次のストアド プロシージャには、ステートメントを含むブロックと、それ自体に別のステートメントを含むループで構成される本体がBEGIN ... ENDあります。SETREPEATSET

CREATE PROCEDURE dorepeat(p1 INT)
BEGIN
  SET @x = 0;
  REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
END;

mysqlクライアント プログラムを使用して、セミコロン文字を含むストアド プログラムを定義すると、問題が発生します。デフォルトでは、mysql自体がセミコロンをステートメント区切り文字として認識するため、一時的に区切り文字を再定義して、mysqlがストアド プログラム定義全体をサーバーに渡すようにする必要があります。

mysql区切り文字を再定義するには、delimiterコマンドを使用します。次の例は、上記のdorepeat()手順でこれを行う方法を示しています。区切り文字は//、定義全体を単一のステートメントとしてサーバーに渡すことができるように変更され;、プロシージャーを呼び出す前に復元されます。これにより、プロシージャ本体で使用される区切り文字が、 mysql自体;によって解釈されるのではなく、サーバーに渡されるようになります。

mysql>delimiter //

mysql> CREATE PROCEDURE dorepeat(p1 INT)
    -> BEGIN
    ->   SET @x = 0;
    ->   REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
    -> END
    ->//
クエリ OK、影響を受ける行は 0 (0.00 秒)


mysql>delimiter ;

mysql>CALL dorepeat(1000);
クエリ OK、影響を受ける行は 0 (0.00 秒)

mysql>SELECT @x;
+--------+
| | @x |
+--------+
| | 1001 |
+--------+
セットで 1 行 (0.00 秒)

区切り文字を 以外の文字列に再定義//できます。区切り文字は 1 文字または複数の文字で構成できます。バックスラッシュ (「<code>\」) 文字は MySQL のエスケープ文字であるため、使用しないでください。

以下は、パラメーターを受け取り、SQL 関数を使用して操作を実行し、結果を返す関数の例です。この場合、delimiter関数定義に内部;ステートメント区切り文字が含まれていないため、使用する必要はありません。

mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
    ->RETURN CONCAT('Hello, ',s,'!');
クエリ OK、影響を受ける行は 0 (0.00 秒)

mysql>SELECT hello('world');
+----------------+
| | こんにちは('ワールド') |
+----------------+
| | こんにちは世界!| |
+----------------+
セットで 1 行 (0.00 秒)

あなたの場合、sproc は 1 つのステートメントのみで構成されているため、BEGIN ... ENDブロックを削除するだけです。

于 2013-10-25T07:43:44.567 に答える