2013-05-06 65 views
1

我正在嘗試創建一個函數來計算圓柱體的橫向面積。用兩個參數在MYSQL中運行程序

DELIMITER $$ 

DROP PROCEDURE IF EXISTS arealateral$$ 
CREATE PROCEDURE arealateral(input_number,input_number) 
BEGIN 
DECLARE raio DECIMAL(10,5); 
DECLARE alt DECIMAL (10,5); 
SET raio = input_number; 
SET alt = input_number; 
SELECT 2*pi()*raio*alt; 
END$$ 
DELIMITER; 

當我運行

CALL arealateral(1,1)$$ 

錯誤出現

ERROR 1318 (42000): Incorrect number of arguments for PROCEDURE aula3.arealateral; expected 0, got 2 
+3

我可能誤解的東西,但你的程序似乎它的兩個參數均得到相同的名稱('input_number')。您期望如何分辨它們之間的差異? – IMSoP 2013-05-06 01:01:28

回答

0

應聲明PROC。參數類型爲IN,OUT等,變量類型爲VARCHAR(10)。 例如,

CREATE PROCEDURE arealateral(IN input_number DECIMAL(10,2),IN input_number2 DECIMAL(10,2)) 
+0

如果我想使用前面的函數計算總面積。 'DELIMITER $$'' DROP PROCEDURE IF EXISTS areatotal $$'' CREATE PROCEDURE areatotal(在RAIO DECIMAL(10,5),在ALT DECIMAL(10,5))'' BEGIN' 'SELECT 2 * areac(RAIO)+ arealateral(RAIO,ALT);'' END $$'' DELIMITER;' 'CALL areatotal(1,1)$$' 出現 'ERROR 1305(42000):功能aula3.arealateal不存在' – 2013-05-06 02:03:41

+0

嘗試添加DEFINER – Alex 2013-05-06 03:00:21

+0

例如CREATE DEFINER ='root' @' localhost' PROCEDURE。在這裏看到更多細節:http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html – Alex 2013-05-06 03:00:41

2

更新:將其更改爲

DROP PROCEDURE IF EXISTS arealateral; 

CREATE PROCEDURE arealateral(in raio DECIMAL(10,5), in alt DECIMAL(10,5)) 
SELECT 2*pi()*raio*alt; 

SQLFiddle

UPDATE2:根據張貼在評論你的後續問題,你應該利用functions

CREATE FUNCTION arealateral(raio DECIMAL(10,5), alt DECIMAL(10,5)) 
RETURNS DECIMAL(10,5) DETERMINISTIC 
RETURN 2*pi()*raio*alt; 

CREATE FUNCTION areatotal(raio DECIMAL(10,5), alt DECIMAL (10,5)) 
RETURNS DECIMAL(10,5) DETERMINISTIC 
RETURN 2*areac(raio) + arealateral(raio,alt); 

然後你可以叫他們像任何其他功能

SELECT areatotal(1,1); 
SELECT arealateral(1,1); 

不要忘記創建areac功能。

SQLFiddle

+0

一個甚至不需要使用'BEGIN ... END'複合語句塊單語句過程,因此也不需要更改分隔符:[sqlfiddle](http://sqlfiddle.com/#!2/50843/1)。提出這是否應該是一個程序的問題... – eggyal 2013-05-06 01:24:22

+0

太棒了! 非常感謝! – 2013-05-06 01:27:05

+0

@eggyal正好。謝謝。更新了答案。 – peterm 2013-05-06 01:43:58