0

通話記録を blob としてデータベースに保存するトリガーがあります。トリガーで毎回実行され、データベースをいくつかのサイズ制限に保つのに役立ついくつかの追加関数を追加したいと思います:関数はそのようなことをしなければなりません:

BLOB ファイルの合計を計算する必要があります。指定された値よりも大きい間、テーブルから最も古いレコードを削除します。

何が間違っているのかわかりません。ご覧ください

WHILE ((select sum(OCTET_LENGTH(recordfile))/1000000 from callrecords)>0,1) 
DO
BEGIN
DELETE FROM callrecords ORDER BY id ASC LIMIT 1;
END;  
END WHILE;

データベースはこんな感じ

-- ----------------------------
-- Table structure for `callrecords`
-- ----------------------------
CREATE TABLE `callrecords` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `uid` varchar(150) COLLATE utf8_unicode_ci NOT NULL,
  `callerid` int(11) NOT NULL,
  `extension` int(11) NOT NULL,
  `calldate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `recordfile` longblob,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=350 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

事前にThx。

4

1 に答える 1

0

ループの外側で変数に BLOB ファイルのサイズを選択し、削除するたびに選択を再実行して変数を更新する必要があります。

最初の試行に基づくコード例:

declare v_size int;
...
-- initialize the variable
select sum(OCTET_LENGTH(recordfile)) 
into v_size
from callrecords;

while (v_size > 1000000)
do
  DELETE FROM callrecords ORDER BY id ASC LIMIT 1;

  -- update the variable
  select sum(OCTET_LENGTH(recordfile))
  into v_size
  from callrecords;

end while;
于 2013-03-13T16:54:38.850 に答える