2017-08-16 45 views
0

这里是mycode用于在游标中读取15行......但是它读取一行而不读取15行这段代码中的任何错误.ANY帮助将提前我用cursor_loop:循环在sql存储过程中它没有读取所有15行只读取一行

delimiter $$ 

drop procedure if exists retrieve_relstr_roc_price; 

create procedure retrieve_relstr_roc_price(
    in p_begin_date  datetime 
) 
begin 

    declare no_more_rows  boolean; 
    declare l_symbol   varchar(10); 
    declare l_commit_rows int default 60; 
declare l_row_num  int default 0; 

declare roc_value_cursor cursor for 
     select * from(select distinct(symbol) as symbol from 
eqt_price_ta_relstr where category_name in ((select * from (select 
sn.category_name from eqt_price_ta_relstr ept 
inner join sectornames sn on sn.symbol = ept.symbol where ept.category_name 
= "SPsector" and ept.close_date >= p_begin_date group by sn.category_name order by ept.rank5 limit 0,1) t4 )) and close_date >= p_begin_date group by symbol order by rank5 limit 15) as t1;  
    declare continue handler for not found set no_more_rows = true; 


    open roc_value_cursor; 
    cursor_loop: loop 
    fetch roc_value_cursor 
    into l_symbol; 
    if no_more_rows 
    then 
    close roc_value_cursor; 
    leave cursor_loop; 
    end if; 

/*next part code used the cursor value*/ 
+0

使用列名而不是*,因为接收变量只有一个。 –

+0

我尝试了使用列名称,但仍然获取一行。 –

+0

游标查询是否实际返回15个元组? – wchiquito

回答

0

理解.Thanks我不能重现该问题:

mysql> DROP TABLE IF EXISTS `t1`; 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TABLE IF NOT EXISTS `t1` (
    -> `symbol` VARCHAR(10) 
    ->); 
Query OK, 0 rows affected (0.01 sec) 

mysql> INSERT INTO `t1` 
    -> VALUES ('symbol 1'), ('symbol 2'), 
    ->  ('symbol 3'), ('symbol 4'), 
    ->  ('symbol 5'), ('symbol 6'), 
    ->  ('symbol 7'), ('symbol 8'), 
    ->  ('symbol 9'), ('symbol 10'), 
    ->  ('symbol 11'), ('symbol 12'), 
    ->  ('symbol 13'), ('symbol 14'), 
    ->  ('symbol 15'); 
Query OK, 15 rows affected (0.00 sec) 
Records: 15 Duplicates: 0 Warnings: 0 

mysql> DROP PROCEDURE IF EXISTS `retrieve_relstr_roc_price`; 
Query OK, 0 rows affected (0.00 sec) 

mysql> DELIMITER // 

mysql> CREATE PROCEDURE `retrieve_relstr_roc_price`() 
    -> BEGIN 
    -> DECLARE `no_more_rows` BOOL DEFAULT FALSE; 
    -> DECLARE `l_symbol` VARCHAR(10); 
    -> DECLARE `l_row_num` INT UNSIGNED DEFAULT 0; 
    -> DECLARE `roc_value_cursor` CURSOR FOR 
    -> SELECT * -- It's recommended to identify the columns: SELECT `symbol` ... 
    -> FROM (
    ->   SELECT `symbol` 
    ->   FROM `t1` 
    ->  ) `der`; 
    -> DECLARE CONTINUE HANDLER FOR NOT FOUND SET `no_more_rows` := TRUE; 
    -> OPEN `roc_value_cursor`; 
    -> `cursor_loop`: LOOP 
    ->  FETCH `roc_value_cursor` INTO `l_symbol`; 
    ->  IF `no_more_rows` THEN 
    ->  CLOSE `roc_value_cursor`; 
    ->  LEAVE `cursor_loop`; 
    ->  END IF; 
    ->  SET `l_row_num` := `l_row_num` + 1; 
    -> END LOOP `cursor_loop`; 
    -> SELECT `l_row_num`; 
    -> END// 
Query OK, 0 rows affected (0.00 sec) 

mysql> DELIMITER ; 

mysql> CALL `retrieve_relstr_roc_price`; 
+-------------+ 
| `l_row_num` | 
+-------------+ 
|   15 | 
+-------------+ 
1 row in set (0.01 sec) 

Query OK, 0 rows affected (0.01 sec) 

db-fiddle

相关问题