Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL सीमांकक कथन त्रुटि

ऐसा लगता है कि यह Play Framework 2.0 विकास और ट्रिगर बनाएं का डुप्लीकेट लगता है (ध्यान दें कि, मेरे विचार में, बेहतर उत्तर वह है जिसे रोजर ने 24 मई 2013 को पोस्ट किया था, यानी ऊपर दिया गया लिंक)

विकास स्क्रिप्ट पाठ में "सीमांकक" का उपयोग नहीं किया जा सकता है; मुझे ऐसा कोई दस्तावेज नहीं मिल रहा है कि ऐसा क्यों है। लेकिन शायद यह इस तथ्य से जुड़ा है कि "सीमांकक" एक SQL कथन नहीं बल्कि एक SQL संपत्ति है।

हालांकि, Play 2 डॉक्स के इवोल्यूशन सेक्शन में एक समाधान है। :

Play आपकी .sql फ़ाइलों को डेटाबेस के विरुद्ध एक-एक करके निष्पादित करने से पहले अर्धविराम-सीमांकित कथनों की एक श्रृंखला में विभाजित करता है। इसलिए यदि आपको किसी कथन के भीतर अर्धविराम का उपयोग करने की आवश्यकता है, तो इसे दर्ज करके बचें; के बजाय;। उदाहरण के लिए, INSERT INTO punctuation(name, character) VALUES ('अर्धविराम', ';;');.

तो आपके मामले में,

  1. "सीमांकक" गुण निकालें, और
  2. ";;" का प्रयोग करें के बजाय ";" आपके आंतरिक . के लिए 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;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL में करंट कनेक्शन के लिए लोकेल कैसे सेट करें

  2. MySQL - डिलीट कैस्केड पर विदेशी कुंजी - क्या कोई परिभाषित निष्पादन आदेश है?

  3. बड़े 3D बिंदु डेटा सेट के साथ SELECT क्वेरी पर प्रदर्शन बढ़ाना

  4. MySQL एक्सएमएल कार्यों का प्रदर्शन?

  5. कनेक्ट विफल:php फ़ंक्शन से उपयोगकर्ता 'रूट' @ 'लोकलहोस्ट' (पासवर्ड का उपयोग करके:हाँ) के लिए प्रवेश निषेध