2014-03-30 39 views
0

我已經在SQL中創建了一個名爲removeYear的函數。該功能定義爲:MySQL:無法從SELECT語句內調用函數

CREATE FUNCTION removeYear(passedTitle CHAR(255), passedYear CHAR(100)) 
RETURNS CHAR(255) DETERMINISTIC 

該功能正常工作。問題是我無法使用我的列名之一在SELECT語句中調用它。例如:

SELECT movieid, title 
FROM movies 
WHERE movieid = 40; 

工程。

SELECT movieid, title, removeYear("bluh", movies.year) 
FROM movies 
WHERE movieid = 40; 

作品。

SELECT movieid, title, removeYear(movies.title, movies.year) 
FROM movies 
WHERE movieid = 40; 

提供了以下錯誤: 錯誤代碼:1054未知列在 '字段列表' '標題'。

我只有沒有想法是什麼導致這個錯誤。 movies.title是一個有效的列。我已經嘗試調用與我的表中的其他列的功能,並且這些都工作正常。例如:

SELECT movieid, title, removeYear(movies.movieid, movies.year) 
FROM movies 
WHERE movieid = 40; 

執行得很好。

編輯: 在我沮喪的時候,我決定在無數次的時間裏檢查包含函數的100多行代碼,最後發現代碼中導致錯誤的單個單詞。

就在整個代碼塊單的時候,我不小心寫的

passedTitle 

雖然我的問題是固定的

title 

相反,這還引出了一個問題:

SQL函數是否與調用它的SELECT語句共享一個名稱空間?

+0

你可以發佈你的功能的身體嗎? –

+0

重新創建表格? – JBES

回答

0

Does an SQL function share a namespace with the SELECT statement calling it?

根據你的函數簽名的定義

CREATE FUNCTION removeYear(passedTitle CHAR(255), passedYear CHAR(100)) 
RETURNS CHAR(255) DETERMINISTIC 

第一個參數的值是使用其名稱中只passedTitle總是函數體內鑑定。

這適用於在任何存儲過程中定義的任何參數或變量。

因此,如果您在簽名中使用title作爲第一個參數的名稱,其名稱爲passedTitle,則引擎將無法識別它的運行時並引發錯誤。