2015-08-09 99 views
0

我是mysql存儲過程的新手。我一直試圖通過我在下面創建的存儲過程插入數據。該過程確實返回@USER_ID。但是,該過程不會將數據插入表中。MySQL存儲過程沒有插入數據,儘管返回ID

//存儲過程

DELIMITER $$ 
CREATE PROCEDURE USP_USR_PROFILE_InsProfile(
IN FIRST_NAME varchar(50), 
IN LAST_NAME varchar(50), 
IN EMAIL_ADDRESS varchar(50), 
IN PASSWORD varchar(256), 
IN DOB date, 
IN GENDER varchar(10), 
IN TIMEZONE varchar(100), 
IN NATIONALITY_ID int(11), 
IN RESIDENCE_CTRY_ID int(11), 
IN ADDRESS_LINE1 varchar(200), 
IN ADDRESS_LINE2 varchar(200), 
IN ADDRESS_LINE3 varchar(200), 
IN PO_BOX varchar(50), 
IN CITY_TOWN varchar(50), 
IN POSTCODE_ZIP varchar(50), 
IN STATE_PROVINCE_REGION VARCHAR(50), 
IN DESCRIPTION varchar(500), 
IN PROFILE_IMAGE_NAME varchar(50), 
IN PROFILE_IMAGE_LOCATION varchar(100), 
IN LAST_UPDATED_USER int(11), 
OUT USER_ID int(11)) 
BEGIN 

--table with only auto increate col 
INSERT INTO SEQ_USR_PROFILE_USER_ID(ID) VALUES (NULL); 

SELECT @USER_ID := MAX(ID) FROM SEQ_USR_PROFILE_USER_ID; 

    INSERT INTO TBL_USR_PROFILE (
     USER_ID, 
     FIRST_NAME, 
     LAST_NAME, 
     EMAIL_ADDRESS, 
     PASSWORD, 
     DOB, 
     GENDER, 
     TIMEZONE, 
     NATIONALITY_ID, 
     RESIDENCE_CTRY_ID, 
     ADDRESS_LINE1, 
     ADDRESS_LINE2, 
     ADDRESS_LINE3, 
     PO_BOX, 
     CITY_TOWN, 
     STATE_PROVINCE_REGION, 
     DESCRIPTION, 
     CREATED_DATE, 
     PROFILE_IMAGE_NAME, 
     PROFILE_IMAGE_LOCATION, 
     STATUS_ID, 
     LAST_UPDATED_DATE, 
     LAST_UPDATED_USER) 
    VALUES (
     @USER_ID, 
     @FIRST_NAME, 
     @LAST_NAME, 
     @EMAIL_ADDRESS, 
     @PASSWORD, 
     @DOB, 
     @GENDER, 
     @TIMEZONE, 
     @NATIONALITY_ID, 
     @RESIDENCE_CTRY_ID, 
     @ADDRESS_LINE1, 
     @ADDRESS_LINE2, 
     @ADDRESS_LINE3, 
     @PO_BOX, 
     @CITY_TOWN, 
     @STATE_PROVINCE_REGION, 
     @DESCRIPTION, 
     CURRENT_TIMESTAMP, 
     @PROFILE_IMAGE_NAME, 
     @PROFILE_IMAGE_LOCATION, 
     1, -- STATUS ACTIVE 
     CURRENT_TIMESTAMP, 
     @LAST_UPDATED_USER) 

END $$ 

DELIMITER ; 

//執行

CALL `USP_USR_PROFILE_InsProfile`('System Administrator', '', '[email protected]', '1234567', '2015-08-09', 'MALE', 'Universal Time', '1', '1','','','','','','','','','','',0, @USER_ID); 

//創建表

DROP TABLE IF EXISTS `TBL_USR_PROFILE`; 

CREATE TABLE `TBL_USR_PROFILE` (
    `RUNNING_ID` int(11) NOT NULL AUTO_INCREMENT, 
    `USER_ID` int(11) NOT NULL, 
    `FIRST_NAME` varchar(50) NOT NULL, 
    `LAST_NAME` varchar(50) NOT NULL, 
    `EMAIL_ADDRESS` varchar(50) NOT NULL, 
    `PASSWORD` varchar(256) NOT NULL, 
    `DOB` date NOT NULL, 
    `GENDER` varchar(10) NOT NULL, 
    `TIMEZONE` varchar(100) NOT NULL, 
    `NATIONALITY_ID` int(11) NOT NULL, 
    `RESIDENCE_CTRY_ID` int(11) NOT NULL, 
    `ADDRESS_LINE1` varchar(200) DEFAULT NULL, 
    `ADDRESS_LINE2` varchar(200) DEFAULT NULL, 
    `ADDRESS_LINE3` varchar(200) DEFAULT NULL, 
    `PO_BOX` varchar(50) DEFAULT NULL, 
    `CITY_TOWN` varchar(50) DEFAULT NULL, 
    `POSTCODE_ZIP` varchar(50) DEFAULT NULL, 
    `STATE_PROVINCE_REGION` varchar(50) DEFAULT NULL, 
    `DESCRIPTION` varchar(500) DEFAULT NULL, 
    `CREATED_DATE` datetime NOT NULL, 
    `PROFILE_IMAGE_NAME` varchar(50) DEFAULT NULL, 
    `PROFILE_IMAGE_LOCATION` varchar(100) DEFAULT NULL, 
    `STATUS_ID` int(11) NOT NULL, 
    `LAST_UPDATED_DATE` datetime NOT NULL, 
    `LAST_UPDATED_USER` int(11) NOT NULL, 
    PRIMARY KEY (`USER_ID`), 
    KEY `RUNNING_ID` (`RUNNING_ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

感激,如果任何一個可以提供幫助。提前致謝。

回答

0

首先:你在做什麼本質上是錯誤的。

  • INSERT INTO SEQ_USR_PROFILE_USER_ID(ID) VALUES (NULL);SELECT @USER_ID := MAX(ID) FROM SEQ_USR_PROFILE_USER_ID;之間的競爭條件,可能在使用wromng用戶ID結束。
  • 使用SELECT LAST_INSERT_ID();會避免
  • 使用事務也將避免

現在的代碼:即彈簧的眼睛的第一件事情是,CURRENT_TIMESTAMP是一個函數,所以你需要寫CURRENT_TIMESTAMP()

我還建議通過SELECT LAST_INSERT_ID();

0
SELECT @USER_ID := MAX(ID) FROM SEQ_USR_PROFILE 

滴速序列表,直接在user表使用AUTO_INCREMENT,具有易於還給ID是你的第一道防線。無論返回(或甚至是否存在)插入語句,您的函數都會返回該函數