0

raddacct と radacctold のテーブルスキーマ (エンジンが異なるだけで構造は同じ)

CREATE TABLE `radacctold` (
  `RadAcctId` bigint(21) NOT NULL,
  `AcctSessionId` varchar(128) default NULL,
  `AcctUniqueId` varchar(32) NOT NULL default '',
  `UserName` varchar(64) NOT NULL default '',
  `Realm` varchar(64) default '',
  `NASIPAddress` varchar(15) NOT NULL default '',
  `NASPortId` int(12) default NULL,
  `NASPortType` varchar(32) default NULL,
  `AcctStartTime` datetime NOT NULL default '0000-00-00 00:00:00',
  `AcctStopTime` datetime NOT NULL default '0000-00-00 00:00:00',
  `AcctSessionTime` int(12) default NULL,
  `AcctAuthentic` varchar(32) default NULL,
  `ConnectInfo_start` varchar(32) default NULL,
  `ConnectInfo_stop` varchar(32) default NULL,
  `AcctInputOctets` int(12) unsigned default NULL,
  `AcctOutputOctets` bigint(12) default NULL,
  `CalledStationId` varchar(50) NOT NULL default '',
  `CallingStationId` varchar(50) NOT NULL default '',
  `AcctTerminateCause` varchar(32) NOT NULL default '',
  `ServiceType` varchar(32) default NULL,
  `FramedProtocol` varchar(32) default NULL,
  `FramedIPAddress` varchar(15) NOT NULL default '',
  `AcctStartDelay` int(12) default NULL,
  `AcctStopDelay` int(12) default NULL
) ENGINE = ARCHIVE;


CREATE PROCEDURE radius.archive_acct()
BEGIN
  INSERT INTO radacctold
    SELECT * FROM radacct
    WHERE acctstoptime > 0
    AND date(acctstarttime) < (CURDATE() - INTERVAL 3 MONTH);
  DELETE FROM radacct
    WHERE acctstoptime > 0
    AND date(acctstarttime) < (CURDATE() - INTERVAL 3 MONTH);
END

it return with error
CREATE PROCEDURE radius.archive_acct()
BEGIN
  INSERT INTO radacctold
    SELECT * FROM radacct
    WHERE acctstoptime > 0
    AND date(acctstarttime) < (CURDATE() - INTERVAL 3 MONTH);

/* SQL Error (1064): 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 6 */
/* Affected rows: 0  Found rows: 0  Warnings: 0  Duration for 0 of 3 queries: 0.000 sec. */
4

1 に答える 1

0

DELIMITERを変更していないようです

複数のステートメントを使用するには、クライアントが ; を含むステートメント文字列を送信できる必要があります。ステートメント区切り文字。mysql コマンドライン クライアントでは、これはdelimiterコマンドで処理されます。の変更; ステートメントの終了区切り文字 (たとえば、// まで) permit ; プログラム本体で使用します。

MySql クライアント内では、次のようにプロシージャを定義する必要があります

DELIMITER $$
CREATE PROCEDURE archive_acct()
BEGIN
  INSERT INTO radacctold
  SELECT * 
    FROM radacct
   WHERE acctstoptime > 0
     AND DATE(acctstarttime) < CURDATE() - INTERVAL 3 MONTH;
  DELETE 
    FROM radacct
   WHERE acctstoptime > 0
     AND DATE(acctstarttime) < CURDATE() - INTERVAL 3 MONTH;
END$$
DELIMITER ;

それ以外は、プロシージャは他の構文エラーなしでコンパイルされます。

これがSQLFiddleのデモです

于 2013-08-05T04:11:58.123 に答える