DELIMITER //create procedure check_data()begin
DECLARE v_settlePrice decimal(20,8); #昨结算价
DECLARE v_risePrice decimal(20,8); #涨停价
DECLARE v_fallPrice decimal(20,8); #跌停价
DECLARE v_openPrice decimal(20,8); #开盘价
DECLARE v_priceTick decimal(20,8); #最小变动价
#DECLARE n int;#控制循环
#DECLARE var decimal(20,8);
DECLARE FOUND INT;Declare  updcur CURSOR FOR
SELECT 
a.YdSettlementPrice,
a.RisePrice,
a.fallprice,
a.openprice,
b.pricetick  
FROM qoutdata AS a,contractinfo as b where a.contractid=b.contractid; #游标遍历表
DECLARE CONTINUE HANDLER FOR NOT FOUND set  FOUND=1;
OPEN updcur;
get_data: LOOP
IF FOUND=1 THEN
LEAVE get_data;
END IF;
FETCH updcur INTO
v_settlePrice,
v_risePrice,
v_fallPrice,
v_openPrice,
v_priceTick;IF ((v_riseprice-v_openprice) MOD v_priceTick<>0 or (v_openprice-v_fallprice)MOD v_priceTick<>0) 
THEN
update qoutdata 
set 
RisePrice=v_openPrice*1.1-(v_RisePrice) MOD v_PriceTick,
FallPrice=v_openPrice*0.9+(v_fallPrice) MOD v_priceTick;
END IF;
END LOOP get_data;
CLOSE updcur;
END //这样改就把表中RISEPRICE和FALLPrice的所有行数据都改成了一样的,请问下,游标是读一行操作一行还是整体读入再来修改呢,另外希望帮修改下这个程序

解决方案 »

  1.   

    举例说明要达到什么目的,UPDATE为什么没有WHERE ?
      

  2.   

    想检查所有的数字是否符合规矩所以没有where,距离如下
    openPrice RisePrice FallPrice  PriceTick
    100       110       90            3
    update qoutdata过后应该是
    100 108 90
      

  3.   


    看图片是2个表联合查询的 priceTick 是最小变动价,17638就是 openprice*1.1得到的,但是不符合最小变动价pricetick的规矩,向下取17635 同理,fallprice 就是openprice*0.9向上取5的整数!
    应该够清楚的分析了吧
      

  4.   

       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
      

  5.   

    第一个表:
    mysql> desc qoutdata
        -> ;
    +-------------------+---------------+------+-----+---------+-------+
    | Field             | Type          | Null | Key | Default | Extra |
    +-------------------+---------------+------+-----+---------+-------+
    | ContractID        | bigint(20)    | NO   | PRI | NULL    |       |
    | YdSettlementPrice | decimal(20,8) | YES  |     | NULL    |       |
    | YdClosePrice      | decimal(20,8) | YES  |     | NULL    |       |
    | YdPositionVolume  | decimal(20,8) | YES  |     | NULL    |       |
    | RisePrice         | decimal(20,8) | YES  |     | NULL    |       |
    | FallPrice         | decimal(20,8) | YES  |     | NULL    |       |
    | TdPositionVolume  | decimal(20,8) | YES  |     | NULL    |       |
    | OpenPrice         | decimal(20,8) | YES  |     | NULL    |       |
    | NewPrice          | decimal(20,8) | YES  |     | NULL    |       |
    | NewVolume         | decimal(20,8) | YES  |     | NULL    |       |
    | PositionVolume    | decimal(20,8) | YES  |     | NULL    |       |
    | HighPrice         | decimal(20,8) | YES  |     | NULL    |       |
    | LowPrice          | decimal(20,8) | YES  |     | NULL    |       |
    +-------------------+---------------+------+-----+---------+-------+第二个表
    mysql> desc contractinfo;
    +----------------------+---------------+------+-----+------------+-------+
    | Field                | Type          | Null | Key | Default    | Extra |
    +----------------------+---------------+------+-----+------------+-------+
    | ContractID           | bigint(20)    | NO   | PRI | NULL       |       |
    | SymbolNum            | varchar(32)   | NO   | MUL | NULL       |       |
    | ContractName         | varchar(24)   | NO   |     | NULL       |       |
    | SecurityTypeID       | int(11)       | NO   | MUL | NULL       |       |
    | ExchangeID           | int(11)       | NO   | MUL | NULL       |       |
    | VarietyID            | int(11)       | NO   | MUL | NULL       |       |
    | StartDeliveryDate    | date          | YES  |     | NULL       |       |
    | EndDeliveryDate      | date          | YES  |     | NULL       |       |
    | CreateDate           | date          | YES  |     | NULL       |       |
    | OpenDate             | date          | YES  |     | NULL       |       |
    | ExpireDate           | date          | YES  |     | NULL       |       |
    | VolumeMultiple       | int(11)       | YES  |     | NULL       |       |
    | PriceTick            | decimal(20,8) | YES  |     | NULL       |       |
    | IsTrading            | tinyint(1)    | YES  |     | NULL       |       |
    | IsAvailable          | tinyint(1)    | YES  |     | NULL       |       |
    | Price                | decimal(20,8) | YES  |     | NULL       |       |
    | PriceUnit            | varchar(20)   | YES  |     | NULL       |       |
    | Unit                 | varchar(20)   | YES  |     | NULL       |       |
    | CurrencyID           | int(11)       | YES  | MUL | NULL       |       |
    | CommissionFee        | decimal(20,8) | YES  |     | NULL       |       |
    | CommissionRate       | decimal(20,8) | YES  |     | 0.00100000 |       |
    | Margin               | decimal(20,8) | YES  |     | NULL       |       |
    | MarginRate           | decimal(20,8) | YES  |     | 0.12000000 |       |
    | AccountTypeID        | int(11)       | YES  | MUL | NULL       |       |
    | HyPlace              | varchar(24)   | YES  |     | NULL       |       |
    +----------------------+---------------+------+-----+------------+-------+
      

  6.   

    SELECT
    a.contractid,
    a.YdSettlementPrice,
    a.RisePrice,
    a.fallprice,
    a.openprice,
    b.pricetick,
    b.symbolnum
    FROM qoutdata AS a,contractinfo as b where a.contractid=b.contractid 
    图片是查询的结果,需求是:
    开始的那个存储过程里的公式,中间也有举例
      

  7.   

    贴建表及插入记录的SQL,及要求结果出来看看
      

  8.   

    #创建表
    create table contractinfo
    (
    contractid int primary key,
    symbolnum varchar(10),
    contractname varchar(24),
    PriceTick decimal(20,8),
    Price decimal(20,8)
    );create table qoutdata
    (contractid int ,
    RisePrice decimal(20,8),
    FallPrice decimal(20,8),
    OpenPrice decimal(20,8),
    NewPrice decimal(20,8),
    foreign key (contractid) references contractinfo(contractid) on delete cascade on update cascade
    );#插入数据
    insert into contractinfo values(101,'al1305','铝1305',3,2001) ;
    insert into contractinfo values(102,'au1305','金1305',5,42000) ;
    insert into contractinfo values(103,'ag1305','银1305',0.3,27000) ;
    insert into contractinfo values(104,'cu1305','铜1305',10,2550) ;
    insert into qoutdata(contractid,openprice) values(101,2001);
    insert into qoutdata(contractid,openprice) values(102,42000);
    insert into qoutdata(contractid,openprice) values(103,25000);
    insert into qoutdata(contractid,openprice) values(104,2550);#设置数据
    update qoutdata set RisePrice=1.1*openPrice,newPrice=openPrice,FallPrice=0.9*openPrice;
    #查看数据
    select a.symbolnum,a.priceTick,a.price,b.Riseprice,b.fallprice from contractinfo as a,qoutdata as b
    where a.contractid=b.contractid
    #得到数据
    'al1305', '3.00000000', '2001.00000000', '2201.10000000', '1800.90000000'
    'au1305', '5.00000000', '42000.00000000', '46200.00000000', '37800.00000000'
    'ag1305', '0.30000000', '27000.00000000', '27500.00000000', '22500.00000000'
    'cu1305', '10.00000000', '2550.00000000', '2805.00000000', '2295.00000000'
    红色标记的不满足要求,因为RisePrice MOD PriceTick 不为0,得向下取值,同样FallPrice得向上取#需求数据:
    'al1305', '3.00000000', '2001.00000000', '2201.10000000', '1800.90000000'
    'au1305', '5.00000000', '42000.00000000', '46200.00000000', '37800.00000000'
    'ag1305', '0.30000000', '27000.00000000', '27499.80000000', '22500.00000000'
    'cu1305', '10.00000000', '2550.00000000', '2800.00000000', '2300.00000000'
    外加一条需求,这里openprice=price 如果openprice<>price ,设置openprice =price请尽力帮帮忙!
      

  9.   

    其实第一行也需要改,应该是2199,1800
    我创建了个视图create view total as select a.symbolnum,a.priceTick,a.price,b.Riseprice,b.fallprice from contractinfo as a,qoutdata as b
    where a.contractid=b.contractid;
    SELECT (riseprice-riseprice mod pricetick)  as  price  FROM test.total;
      

  10.   


    riseprice=riseprice-(riseprice mod priceTick);
    fallprice=fallprice+(fallprice mod priceTick);
      

  11.   

    楼主期望得到的数据是

    #需求数据:
    'al1305', '3.00000000', '2001.00000000', '2201.10000000', '1800.90000000'
    'au1305', '5.00000000', '42000.00000000', '46200.00000000', '37800.00000000'
    'ag1305', '0.30000000', '27000.00000000', '27499.80000000', '22500.00000000'
    'cu1305', '10.00000000', '2550.00000000', '2800.00000000', '2300.00000000'

    建议能直接准确描述问题,不要用一个回复去修补上一个回复,否则别人根本不知道你期望的正确结果是什么。 有时候多勤快一点,复制一下,然后修改一下。这样更容易让别人准确理解而不是猜来猜去。