-2

私のphpスクリプトには次の関数があります:

$fcnsql = "CREATE FUNCTION CUST_ORDER(index INT, weekday INT, curweekday INT, endtime TIME, curtime    TIME)
RETURNS INT
BEGIN
DECLARE custom_weekday INT;
IF (weekday=curweekday AND curtime>endtime) THEN
SET custom_weekday = index+7;
ELSE
SET custom_weekday = index;
END IF;
RETURN custom_weekday;
END";

$test=mysql_query($fcnsql) or die (mysql_error());

出力として得られるのは、SQL構文エラーがあることです。何が悪いのか分かりますか?

私が問題になると思ういくつかのこと:

  1. 関数のパラメーターとしてTIME変数を使用するための正しい構文かどうかはわかりません。
  2. オンラインのサンプルコードで、mysql関数の前に「delimiter $$」という行があることがわかります。これが何のためにあるのか、どのように/どのように使用する必要があるのか​​わかりません。

私はこれに非常に慣れていないので、どんな助けでも大歓迎です!

4

1 に答える 1

1

編集: @Pangはそれを呼んだ-インデックスは予約語です。名前を変更したくない場合は、バッククォートでラップします。

`index`

DELIMITERについてよくわからなかったので、残りのワッフルはそのままにしておきます。:)

-

いくつかの例で気づいたように、エラーはおそらくDELIMITERを設定していないことです。これらを関数の上部と下部に追加します。

$fcnsql = "
DELIMITER #
CREATE FUNCTION CUST_ORDER2(`index` INT, weekday INT, curweekday INT, endtime TIME, curtime TIME) RETURNS INT
BEGIN
DECLARE custom_weekday INT;
IF (weekday=curweekday AND curtime>endtime) THEN
    SET custom_weekday = `index`+7;
ELSE
    SET custom_weekday = `index`;
END IF;
RETURN custom_weekday;
END;
#
DELIMITER ;
";    

その理由は「;」です MySQLのデフォルトの区切り文字です(つまり、MySQLにステートメントの終わりに到達したことを通知するもの)。関数のステートメントには区切り文字が必要ですが、MySQLがそれを保存している間、MySQLがステートメントの終わりを検出したと見なして、関数の処理を停止することは望ましくありません。したがって、区切り文字を関数で使用していない文字に変更し、後で再度変更します。

于 2012-11-23T02:39:47.657 に答える