2017-03-24 2 views
1

weiß nicht, warum, aber ich bin halten 0 als Ausgabeparameter immer ... Ich lief wie folgt vor:MySQL Prozedur hält den Wert 0 zurück

INSERT INTO users (first_name, last_name, email, image, date_of_registration) 
VALUES ("xx", "xx", "xxx", null, sysdate());SELECT LAST_INSERT_ID(); 

und ich bekam gutes Ergebnis (! = 0) als ich annehme, dass PersistentConnections auf true gesetzt ist. irgendwelche anderen Konfigurationen, die das verursachen könnten?

Verfahren

DROP PROCEDURE IF EXISTS partners.create_user; 
CREATE DEFINER=`partnersmaster`@`%` PROCEDURE `create_user`(
    IN p_first_name NVARCHAR(30), 
    IN p_last_name NVARCHAR(30), 
    IN p_email NVARCHAR(100), 
    IN p_image NVARCHAR(200), 
    IN p_date_of_registration TIMESTAMP, 
    OUT p_user_id INT 
) 
BEGIN 
    INSERT INTO users (first_name, last_name, email, image, date_of_registration) 
    VALUES (p_first_name, p_last_name, p_email, p_image, p_date_of_registration); 
    SET @p_user_id = LAST_INSERT_ID(); 
END; 

Java

conn = engine.getDal().getConnection(); 
st = conn.prepareCall("{call partners.create_user(?,?,?,?,?,?)}"); 
st.setString("p_first_name", user.getFirstName()); 
st.setString("p_last_name", user.getLastName()); 
st.setString("p_email", user.getEmail()); 
if(user.getImage() != null) 
    st.setString("p_image", user.getImage()); 
else 
    st.setNull("p_image", Types.NVARCHAR); 
st.setTimestamp("p_date_of_registration", new Timestamp(System.currentTimeMillis())); 
st.registerOutParameter("p_user_id", Types.INTEGER); 
st.execute(); 
userId = st.getInt("p_user_id"); 
+1

Wenn Sie das Verfahren nativ aufrufen, erhalten Sie das erwartete Ergebnis, auch? Und wenn Sie die Einfügung innerhalb von Java ausführen und last_insert_id() auswählen, erhalten Sie dann auch das erwartete Ergebnis? – slowy

+0

guter Punkt ... Überprüfung –

Antwort

0

Es gibt ein Problem mit Prozedurparameter und Session-Variablen - p_user_id vs @p_user_id. In Ihrem Fall ist die p_user_id nicht eingestellt.

Code ändern auf diese Weise -

BEGIN 
    ... 
    ... 
    ... 
    SET p_user_id = LAST_INSERT_ID(); 
END; 
+0

danke, das es zu beheben. Kannst du auf den Unterschied zwischen den beiden hinweisen? –

+0

p_user_id ist ein Prozedurparameter, es ist ein routinemäßiger Codebereich. @p_user_id ist eine Sitzungsvariable, auf die von jedem Teil des Skripts aus zugegriffen werden kann, es ist ein Verbindungsbereich. – Devart