ऐसा लगता है कि यह Play Framework 2.0 विकास और ट्रिगर बनाएं का डुप्लीकेट लगता है (ध्यान दें कि, मेरे विचार में, बेहतर उत्तर वह है जिसे रोजर ने 24 मई 2013 को पोस्ट किया था, यानी ऊपर दिया गया लिंक)
विकास स्क्रिप्ट पाठ में "सीमांकक" का उपयोग नहीं किया जा सकता है; मुझे ऐसा कोई दस्तावेज नहीं मिल रहा है कि ऐसा क्यों है। लेकिन शायद यह इस तथ्य से जुड़ा है कि "सीमांकक" एक SQL कथन नहीं बल्कि एक SQL संपत्ति है।
हालांकि, Play 2 डॉक्स के इवोल्यूशन सेक्शन में एक समाधान है। :
Play आपकी .sql फ़ाइलों को डेटाबेस के विरुद्ध एक-एक करके निष्पादित करने से पहले अर्धविराम-सीमांकित कथनों की एक श्रृंखला में विभाजित करता है। इसलिए यदि आपको किसी कथन के भीतर अर्धविराम का उपयोग करने की आवश्यकता है, तो इसे दर्ज करके बचें; के बजाय;। उदाहरण के लिए, INSERT INTO punctuation(name, character) VALUES ('अर्धविराम', ';;');.
तो आपके मामले में,
- "सीमांकक" गुण निकालें, और
- ";;" का प्रयोग करें के बजाय ";" आपके आंतरिक . के लिए SQL कथन, ताकि Play 2 पार्सर को इन आंतरिक SQL कथनों को अलग से निष्पादित करने से रोका जा सके।
यहां एक उदाहरण दिया गया है कि मैंने Play 2.3 और mysql 14.14 Distrib 5.5.40 (Ubuntu 12.04LTS) में सफलतापूर्वक परीक्षण किया है:
DROP TRIGGER IF EXISTS SOFTWARE_INSERT_CT_TRIGGER;
CREATE TRIGGER SOFTWARE_INSERT_CT_TRIGGER
BEFORE INSERT ON SOFTWARE
FOR EACH ROW
BEGIN
IF NEW.CREATED_TIME = '0000-00-00 00:00:00' THEN
SET NEW.CREATED_TIME = NOW();;
END IF;;
END;
आपकी SQL स्क्रिप्ट के मामले में, निम्नलिखित को Play 2.1 और इसके बाद के संस्करण के साथ काम करना चाहिए (ध्यान दें कि मैंने इसका परीक्षण नहीं किया है):
DROP TRIGGER IF EXISTS invoice_line_insert;
CREATE TRIGGER invoice_line_insert AFTER INSERT
ON invoice_line FOR EACH ROW
BEGIN
IF NEW.type = "DELIVERY" THEN
UPDATE invoice
SET invoice.etdelivery_amount = invoice.etdelivery_amount + NEW.amount
WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;
ELSE
UPDATE invoice
SET invoice.etexpense_amount = invoice.etexpense_amount + NEW.amount
WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;
END IF;;
UPDATE invoice
SET invoice.vatamount = (NEW.amount * ((
SELECT vat.rate
FROM vat
WHERE vat.id_vat = NEW.vat_id_vat
) / 100)) + invoice.vatamount
WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;
UPDATE invoice
SET invoice.itamount = invoice.vatamount +
invoice.etdelivery_amount +
invoice.etexpense_amount
WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;
END;