1

次のストアド プロシージャを作成しました。

CREATE DEFINER=`root`@`localhost` PROCEDURE `ABON_PLATA`(DATE_BAL1 datetime)
BEGIN
        DECLARE IMSI1 varchar(6);
        DECLARE DATE1 datetime;
        DECLARE ID_U1 integer;
        DECLARE PAY1 double;
        DECLARE PAYSUM double;
        DECLARE OLD1 double;
        DECLARE REASON1 varchar(16);
        DECLARE FLAG integer DEFAULT 0;
        DECLARE C1 CURSOR FOR SELECT ID_U FROM podkl_otkl_uslug WHERE IMSI1=IMSI;
        DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET FLAG=1;

OPEN C1;
     REPEAT
        FETCH C1 INTO ID_U1;
                IF FLAG=0 THEN
                SELECT SUM(PAY) INTO PAY1 FROM uslugi WHERE ID_U1=ID_U AND DATE_PODKL<DATE_BAL1 AND DATE_OTKL IS NULL;
                SET REASON1 = 'ABON PLATA';
                SET DATE1 = DATE_BAL1;
                SET PAYSUM = `NEW`-PAY1;
                SET OLD1 = `NEW`;
              END IF;
        INSERT history (`DATE`, REASON, `NEW`, OLD, IMSI) VALUES (DATE1, REASON1, PAYSUM, OLD1, IMSI1);
        UNTIL FLAG=1
     END REPEAT;
CLOSE C1;
END

携帯電話事業者の加入料金をシミュレートするために使用されます。呼び出そうとすると、悪名高いエラーが発生します。

CALL ABON_PLATA(2013-07-07 12:00:00);

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 '12:00:00)' at line 1

1行目のエラーだと考えると、非常に混乱します。私が見逃している非常に明白なものは何ですか?

4

1 に答える 1

0

日時リテラルは引用符で囲む必要があります。

CALL ABON_PLATA('2013-07-07 12:00:00');

行 1 でエラーが報告されるのは、そのCALL行にエラーが含まれているためです。プロシージャを呼び出す前にエラーが発生するため、プロシージャ コードとは関係ありません。


あなたのコメントについて:

スレッド スタック オーバーラン: 131072 バイトのスタックのうち 6892 バイトが使用され、128000 バイトが必要です。'mysqld --thread_stack=#' を使用して、より大きなスタックを指定します。

これは、MySQL の設定値thread_stackが小さすぎて、ストアド プロシージャでステートメントを実行できないことを示しています。これは、たとえば、 MySQL の一部のリリースにバンドルされているmy-small.cnf構成ファイルを使用する場合に発生する可能性があります。

thread_stack構成ファイルの値を増やします。デフォルトは 256K で、これより低く設定するのは my-small.cnf だけです。この設定が低すぎるというバグがログに記録されています。

構成ファイルにこの変更を加えた後、MySQL サービスを再起動することを忘れないでください。

于 2013-09-14T09:49:00.363 に答える