2013-11-03 5 views
0

Мне нужно написать сценарий, который создает и вызывает хранимую процедуру с именем test. Эта процедура должна вычислять общие факторы между 10 и 20. Чтобы найти общий коэффициент, вы можете использовать оператор modulo (%), чтобы проверить, можно ли равномерно делиться числом на оба числа. Затем в этой процедуре должна отображаться строка, которая отображает общие факторы следующим образом: Общие факторы 10 и 20: 1 2 5 Спасибо заранее!Петли в MySQL Хранимые процедуры

Вот то, что я до сих пор:

`USE my_guitar_shop; 

DROP PROCEDURE IF EXISTS test; 

-- Change statement delimiter from semicolon to double front slash 
DELIMITER // 

CREATE PROCEDURE test() 
BEGIN 
    DECLARE counts INT Default 1; 
    DECLARE factor10; 
    DECLARE factor20; 
    DECLARE FACTORS varchar(100); 

    simple_loop: LOOP 

    SELECT 10 
    MOD counts 
    into factor10; 
    SELECT 20 
    MOD counts 
    into factor20; 

    WHEN (factor10 = 0 && factor20 = 0) THEN 
    SELECT concat("Common factors of 10 and 20:"; 
WHEN 
END// 

-- Change statement delimiter from semicolon to double front slash 
DELIMITER ; 

CALL test(); ` 
+0

http://dev.mysql.com/doc/refman/5.0/en/while.html для цикл while, который выходит после указанного условия, является истинным или http://dev.mysql.com/doc/refman/5.0/en/loop.html для ручного выхода после выполнения определенного условия. попробуй. также, что нужно делать в этом цикле? Вы никогда не говорили об этом. – ps2goat

+0

, например, более надежное решение будет иметь параметры для двух чисел, а не статические «10» и «20». – ps2goat

ответ

1

Как насчет версии без петель?

CREATE PROCEDURE test(IN _first INT, _second INT) 
SELECT CONCAT('Common factors of ', LEAST(_first, _second), ' and ', GREATEST(_first, _second), ': ', GROUP_CONCAT(n)) result 
    FROM 
(
    SELECT n 
    FROM 
    (
    SELECT a.N + b.N * 10 + c.N * 100 + 1 n 
     FROM 
    (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a 
    ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b 
    ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) c 
    ORDER BY n 
) n 
    WHERE n <= LEAST(_first, _second) 
    HAVING _first MOD n = 0 
    AND _second MOD n = 0 
) q; 

Использование:

 
mysql> CALL test(10, 20); 
+---------------------------------------+ 
| result        | 
+---------------------------------------+ 
| Common factors of 10 and 20: 1,2,5,10 | 
+---------------------------------------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

mysql> CALL test(800, 1000); 
+------------------------------------------------------------------+ 
| result               | 
+------------------------------------------------------------------+ 
| Common factors of 800 and 1000: 1,2,4,5,8,10,20,25,40,50,100,200 | 
+------------------------------------------------------------------+ 
1 row in set (0.01 sec) 

Query OK, 0 rows affected (0.01 sec) 

Вот SQLFiddle демо

1
USE my_guitar_shop; 

DROP PROCEDURE IF EXISTS test; 

DELIMITER // 

CREATE PROCEDURE test() 
BEGIN 
    DECLARE factor10 INT; 
    DECLARE factor20 INT; 
    DECLARE counter INT; 
    DECLARE result VARCHAR(50); 

    SET factor10 = 10; 
    SET factor20 = 20; 
    SET counter = 1; 
    SET result = 'Common factors of 10 and 20: '; 

    WHILE (counter <= factor10/2) DO 

     IF (factor10 % counter = 0 AND factor20 % counter = 0) THEN 
      SET result = CONCAT(result, counter, ' '); 
     END IF; 

     SET counter = counter+1; 
    END WHILE; 

/* IF (factor10 % factor10 = 0 AND factor20 % factor10 = 0) THEN 
     SET result = CONCAT(result, factor10, ' '); 
    END IF; 
*/ 
    SELECT result AS message; 
END // 

DELIMITER ; 

CALL test(); 
Смежные вопросы