2012-08-31 119 views
4

將值傳遞給此存儲過程的正確方法是什麼?很明顯,我沒有按照正確的方式做,並且在一個過程中執行兩個語句是安全的,還是應該製作兩個單獨的語句?存儲過程問題


DELIMITER $$ 

    CREATE DEFINER=`root`@`localhost` PROCEDURE `drop_student`(IN section_id VARCHAR(20), IN student_id VARCHAR(20)) 
    BEGIN 

    SET @section_id=section_id; 
    SET @student_id=student_id; 

    PREPARE STMT2 FROM 
    "DELETE FROM transcript 
    WHERE STUDENT_ID = @student_id 
    AND SECTION_ID = @section_id "; 


    PREPARE STMT FROM 
    "DELETE FROM course 
    WHERE STUDENT_ID = @student_id 
    AND SECTION_ID = @section_id "; 


    EXECUTE STMT2 USING @section_id,@student_id; 

    EXECUTE STMT USING @section_id,@student_id; 

    END 

回答

3

你確定你使用的是SQL Server我看sql server標籤)在上面的代碼?我想這是MySQL。像這樣做

PREPARE STMT2 FROM "DELETE FROM transcript WHERE STUDENT_ID = ? AND 
                SECTION_ID = ?"; 
EXECUTE STMT2 USING @student_id, @section_id; 
DEALLOCATE PREPARE STMT2; 

-- same as STMT 

SQL Syntax for Prepared Statements

+0

謝謝你的工作,我以錯誤的順序發送報表。 – Undermine2k

+0

不客氣@ Undermine2k! –

0

您是否嘗試過這樣做呢?

EXEC STMT2 @section_id @student_id; 

EXEC STMT @section_id @student_id; 
1

要調用的程序,你會怎麼做:

CALL drop_student( '富', '棒');

0

您不需要在此處使用預準備語句。事實上,你甚至可以結合你的兩個DELETE語句到一個單一的一個:

CREATE PROCEDURE drop_student (
    IN p_section_id VARCHAR(20), 
    IN p_student_id VARCHAR(20) 
) 
DELETE transcript, course 
FROM transcript JOIN course USING (STUDENT_ID, SECTION_ID) 
WHERE STUDENT_ID = p_student_id AND SECTION_ID = p_section_id; 

此外,它看起來像你可能試圖手動工具,用於自動foreign key constraintsON DELETE CASCADE選項提供行爲。