2014-05-23 119 views
0

我試圖創建一個mysql函數,但是我一直在收到以下錯誤。我的查詢有什麼問題?mysql程序函數返回錯誤

您的SQL語法有錯誤;檢查對應於你的MySQL服務器版本使用附近的正確語法手冊 'BEGIN INSERT INTO order(carID,clientID的)選擇car.id,client.id FROM' 第2行

我的查詢:

DELIMITER // 
    CREATE FUNCTION orderCreate(LicenseNumber varchar(30), Phonenumber varchar(20)) 
    BEGIN 


    INSERT INTO `order` (carID, clientID) Select car.id, client.id FROM car, client, owns WHERE car.licensenumber = LicenseNumber AND client.phonenumber = Phonenumber AND car.id = owns.carID AND owns.clientID = client.id; 


    RETURN mysql_insert_id(); 

    END // 
DELIMITER ; 
+2

功能的不能改變在表中的數據。程序和包可以。 http://dev.mysql.com/doc/refman/5.7/en/stored-program-restrictions.html – xQbert

+0

好吧,那麼如果我將其更改爲過程,那麼如何返回創建的訂單ID – user3660361

+0

過程已將參數與結果集。 http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html文檔和示例。 http://www.mysqltutorial.org/stored-procedures-parameters.aspx – xQbert

回答

0

FUNTION定義簽名必須有RETURNS子句。
你的代碼沒有使用它。

而且您不能在MySQL內使用mysql_insert_id(),但不能使用PHP
您必須使用LAST_INSERT_ID()

功能

delimiter // 
drop function if exists orderCreate // 

CREATE FUNCTION orderCreate(_LicenseNumber varchar(30), _Phonenumber varchar(20)) 
    RETURNS INTEGER 
BEGIN 
    INSERT 
     INTO `order` (carID, clientID) 
    SELECT car.id, client.id 
     FROM car, client, owns 
    WHERE car.licensenumber = _LicenseNumber 
     AND client.phonenumber = _Phonenumber 
     AND car.id = owns.carID 
     AND owns.clientID = client.id; 

    RETURN LAST_INSERT_ID(); 
END; 
// 
delimiter ; 

而且這將是一個更好的做法在列名使用不同的功能/程序的參數名稱。因爲除非使用具有列名的表名限定符,否則在識別它們時會產生歧義,並且可能會對列名上的參數名賦予優先級。

select phonenumber from client; 

上述聲明可能導致的輸入值PhoneNumber但不是你期望的所有行。

mysql> create procedure sp_so_q23838311(in deptno int) 
    ->  select deptno from department 
    ->  union all 
    ->  select department.deptno from department; 
Query OK, 0 rows affected (0.00 sec) 

mysql> select deptno from department; 
+--------+ 
| deptno | 
+--------+ 
|  10 | 
|  20 | 
|  30 | 
|  40 | 
+--------+ 
4 rows in set (0.00 sec) 

mysql> call sp_so_q23838311(20); 
+--------+ 
| deptno | 
+--------+ 
|  20 | 
|  20 | 
|  20 | 
|  20 | 
|  10 | 
|  20 | 
|  30 | 
|  40 | 
+--------+ 
8 rows in set (0.15 sec) 

文檔上FUNCTION
CREATE FUNCTION Syntax for User-defined Functions

CREATE [AGGREGATE] FUNCTION function_name RETURNS {STRING|INTEGER|REAL|DECIMAL} 
SONAME shared_library_name