2010-11-17 22 views
0

所以我想通過光標和callproc(使用存儲過程),但我總是得到錯誤:爲什麼在Django中使用callproc()時,PROCEDURE不存在?

OperationalError: (1305, 'PROCEDURE myapp.LatLonDistance does not exist') 

這裏的代碼拋出的錯誤我的應用程序塊:

cursor = connection.cursor() 
result = cursor.callproc("myapp.LatLonDistance", (lat1, lon1, lat2, lon2)) 
cursor.close() 

而這裏的直接查詢,我可以在數據庫運行工作得很好:

SELECT id,myapp.LatLonDistance(lat1, lon1, lat2, lon2) AS distance FROM myapp.users_userprofile; 

這裏是我用來存儲過程寫入數據庫腳本:

delimiter // 
CREATE FUNCTION airrun.LatLonDistance (lat1 double, lon1 double, lat2 double, lon2 double) 
RETURNS double 
DETERMINISTIC 
READS SQL DATA 
BEGIN 

     DECLARE theta double; 
     DECLARE dist double; 
     DECLARE miles double; 
     SET theta = lon1 - lon2; 
     SET dist = SIN(RADIANS(lat1)) * SIN(RADIANS(lat2)) + COS(RADIANS(lat1)) * COS(RADIANS(lat2)) * COS(RADIANS(theta)); 
     SET dist = ACOS(dist); 
     SET dist = DEGREES(dist); 
     SET miles = dist * 60 * 1.1515; 


     RETURN miles; 
END 
// 
delimiter ; 

使用MySQL數據庫。有什麼想法嗎?

+0

難道不是這樣認爲,儘管功能在MySQL的選擇過程被稱爲。上面的SQL是一個函數,而不是一個過程? – Raz 2010-11-17 20:46:44

+0

這完全有可能,我不是一個SQL大師。那麼實現這一目標的另一種方式是什麼? – 2010-11-17 20:58:07

+0

將其重寫爲存儲過程。 CALL sytnax應該可以工作。見http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html – Raz 2010-11-17 21:00:35

回答

3

自認爲是一個函數,而不是實際的存儲過程,你應該能夠使用cursor.execute稱之爲:

cursor = connection.cursor() 
result = cursor.execute("SELECT id,myapp.LatLonDistance(%s, %s, %s, %s) AS distance FROM myapp.users_userprofile", (lat1, lon1, lat2, lon2)) 
cursor.close() 
+0

嘿,非常感謝! – 2010-11-18 14:59:50

相關問題