1. 程式人生 > >利用資料庫儲存過程計算K線均值演算法

利用資料庫儲存過程計算K線均值演算法

演算法實現:

K線儲存過程,定義一個n的日均線,儲存過程如下圖,初始值全部賦值為0

0

1

2

3

4

n-1

n%n

1%n

2%n

3%n

4%n

(n-1)%n

n  .....

Java程式直接處理從資料庫中獲取到的資料

①當i<n時,均值結果為avg=sum(a[0],a[n-1])/i

②當i>=n時,均值結果為avg=sum(a[0],a[n-1])/n

MySql儲存過程演算法實現:

 set i=i+1;
 IF i<n THEN
 SELECT SUM(rate) INTO total
 FROM lineK
 WHERE id>=1 AND id<=i;
 set rate_in_stock=total/i;
 END IF;

 IF i>=n THEN
 SELECT SUM(rate) INTO total
 FROM lineK
 WHERE id>=i+1-n AND id<=i;
 set rate_in_stock=total/n;
 END IF;

儲存過程程式碼
DELIMITER $$

DROP PROCEDURE IF EXISTS `yggl`.`CursorProc` $$
CREATE PROCEDURE `yggl`.`CursorProc` (IN n INT)

BEGIN
 DECLARE  no_more_lineK ,i INT DEFAULT 0;
 DECLARE  total DOUBLE DEFAULT 0;
 DECLARE  rate_in_stock DOUBLE DEFAULT 0;
 DECLARE  SUM DOUBLE DEFAULT 0;
 DECLARE  prd_id VARCHAR(255);
 DECLARE  cur_lineK CURSOR FOR   SELECT id FROM lineK;  /*First: Delcare a cursor,首先這裡對遊標進行定義*/
 DECLARE  CONTINUE HANDLER FOR NOT FOUND  SET  no_more_lineK = 1; /*when "not found" occur,just continue,這個是個條件處理,針對NOT FOUND的條件*/

 /* for  loggging information 建立個臨時表格來保持*/
 DROP TABLE IF EXISTS `infolog`;
 CREATE TABLE infolog (
 Id int(11) NOT NULL AUTO_INCREMENT,
 Rate DOUBLE NOT NULL,
 PRIMARY KEY (Id)
 );

 OPEN  cur_lineK; /*Second: Open the cursor 接著使用OPEN開啟遊標*/
 FETCH  cur_lineK INTO prd_id; /*Third: now you can Fetch the row 把第一行資料寫入變數中,遊標也隨之指向了記錄的第一行*/

 REPEAT
 set i=i+1;
 IF i<n THEN
 SELECT SUM(rate) INTO total
 FROM lineK
 WHERE id>=1 AND id<=i;
 set rate_in_stock=total/i;
 END IF;

 IF i>=n THEN
 SELECT SUM(rate) INTO total
 FROM lineK
 WHERE id>=i+1-n AND id<=i;
 set rate_in_stock=total/n;
 END IF;

 INSERT  INTO infolog(Rate)
 VALUES  (rate_in_stock);

 FETCH  cur_lineK INTO prd_id;

 UNTIL  no_more_lineK = 1
 END REPEAT;
 CLOSE  cur_lineK;  /*Finally: cursor need be closed 用完後記得用CLOSE把資源釋放掉*/
 SELECT *  FROM infolog;
END $$

DELIMITER ;


完整案例打包:http://download.csdn.net/detail/kevin_iot/9707791

技術參考文件:

2、java連線mysql示例:

3、hFreechart參考示例