2012-09-14 26 views
6

मुझे डीबीआई पर "ट्रिगर बनाने" जारी करने में सक्षम होने की आवश्यकता है। मुझे डिलीमीटर कमांड काम नहीं कर रहा है। क्या कोई इस काम को करने का कोई तरीका ढूंढ सकता है?पर्ल, डीबीआई और MySQL delimiter

कोड:

use strict; 
use DBI; 
my $dbargs = {mysql_auto_reconnect => 1, 
       AutoCommit   => 0, 
       RaiseError   => 1, 
       ShowErrorStatement => 1}; 

my $dsn = "DBI:mysql:database=xdisp;host=cycldev06"; 
my $dbh = DBI->connect($dsn, 'sqluser', '', $dbargs); 

my $sql = qq{ 
    DELIMITER // 
     CREATE TRIGGER `hardware_last_status` BEFORE UPDATE 
      ON `hardware` FOR EACH ROW BEGIN 
           IF NEW.status != OLD.status AND NEW.last_status = OLD.last_status THEN 
            SET NEW.last_status = OLD.status; 
           END IF; 
          END 
      // 
}; 

$dbh->do($sql); 

परिणाम:

DBD::mysql::db do failed: 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 'DELIMITER // 
     CREATE TRIGGER `hardware_last_status` BEFORE UPDATE 
     ' at line 1 at test.pl line 24. 

और SQL MySQL आदेश पंक्ति पर ठीक काम करता है कि।

+2

+1 स्पष्ट रूप से 'ऑटोकॉमिट' और 'राइज एरर' निर्दिष्ट करने के लिए +1। मैं उसमें और अधिक सामान्य रूप से देखना चाहता हूं। – pilcrow

उत्तर

7

delimiter कमांड SQL प्रोग्राम की सीमा निर्धारित करने के लिए क्लाइंट प्रोग्राम द्वारा उपयोग किया जाता है। यह सर्वर (लगभग निश्चित रूप से) सर्वर द्वारा नहीं देखा जाता है। इसलिए, पर्ल + डीबीआई में, आपको बस डिलीमीटरों को छोड़ देना चाहिए। इस प्रकार, आपको निष्पादित करने का आदेश यह है:

my $sql = qq{ 
    CREATE TRIGGER `hardware_last_status` BEFORE UPDATE 
     ON `hardware` FOR EACH ROW BEGIN 
          IF NEW.status != OLD.status AND NEW.last_status = OLD.last_status THEN 
           SET NEW.last_status = OLD.status; 
          END IF; 
         END 
}; 
+0

धन्यवाद! वह चाल है। मैं कभी-कभी एक साथ कुछ कमांड ढेर करता था और परिभाषित करने से ठीक पहले "डिलीट ट्रिगर अगर एक्स्टिस्ट्स" था। वह एक निश्चित संख्या नहीं था। उन्हें तोड़कर और डेलीमीटर को हटाने से चाल चल गई। – SecondGear