2013-04-14 69 views
0

所以我試圖從一個病人,我從存儲過程中使用FName的參數提前添加到數據庫中的PatientID(主鍵,非空,自動增量)和LName傳入我的選擇語句來設置變量,但我得到一個語法錯誤。所以任何幫助,爲什麼語法失敗,將不勝感激。MySQL StoredProcedure從選擇參數作爲條件設置的變量

下面是相關的代碼,pFName和pLName是傳遞給存儲過程的參數。

DECLARE pPolicyHolder INT; 
SET pPolicyHolder = (SELECT PatientID FROM Patient WHERE Fname = pFName AND LName = pLName); 

這裏是整個過程。我意識到這可能不是最好/最乾淨的方式,但表格的設置方式是需要在添加患者之前添加MedicalHistory,並且必須在添加PatientInsurance之前添加患者,因爲外鍵約束。

DELIMITER // 
CREATE PROCEDURE AddNewPatient(
    IN pAllergies TEXT, IN pMedications TEXT, IN pExistingConditions TEXT, IN pMisc  
    TEXT, IN pFName VARCHAR(30), IN pLName VARCHAR(45), IN pGender CHAR(1), IN pDOB 
    DATE, IN pSSN DOUBLE, IN pMedicalHistory INT, IN pPrimaryPhysician INT, IN 
    pInsuranceCompany INT, IN pCoPay INT) 
BEGIN 
    START TRANSACTION; 
     INSERT INTO MedicalHistory(Allergies, Medications, ExistingConditions, Misc) 
     VALUES(pAllergies, pMedications, pExistingConditions, pMisc); 
    COMMIT; 
     START TRANSACTION; 
       INSERT INTO Patient(FName, LName, Gender, DOB, SSN, 
       MedicalHistory,PrimaryPhysician) VALUES(pFName, 
       LName,pGender,pDOB,pSSN,pMedicalHistory,pPrimaryPhysician); 
     COMMIT; 

     DECLARE pPolicyHolder INT; 
     SET pPolicyHolder = (SELECT PatientID FROM Patient WHERE Fname = pFName AND 
          LName = pLName); 
    START TRANSACTION; 
     INSERT INTO PatientInsurance(PolicyHolder, InsuranceCompany, CoPay) 
     VALUES(pPolicyHolder, pInsuranceCompany, pCoPay); 
    COMMIT; 
    END // 
DELIMITER ; 

錯誤:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE pPolicyHolder INT; 
    SELECT PatientID into pPolicyHolder FROM Patient W' at line 15 

回答

2

你需要在你的程序的開頭聲明變量,而不是在中間。

CREATE PROCEDURE AddNewPatient(...) 
BEGIN 
    DECLARE pPolicyHolder INT; <------declare here 

    START TRANSACTION; 
    ... 
    COMMIT; 

    SET pPolicyHolder = (SELECT PatientID FROM Patient WHERE Fname = pFName AND 
         LName = pLName); 
    ... 
+0

只注意到第一個括號沒能到我的職位,但雙再次檢查代碼,並試圖運行設置它的兩種方式後,我仍然得到同樣的語法錯誤在同一地點。在帖子中添加了錯誤。 – joshuaegclark

+0

更新了我的答案。 –

+0

工作正常!有趣的是,你必須在開始時聲明它們。感謝你的幫助! – joshuaegclark