2010-08-30 15 views
9

से यह प्रक्रिया दूरस्थ रूप से और स्थानीयहोस्ट दोनों पर MySQL कमांडलाइन से काम करती है और यह PHP से कॉल होने पर काम करती है। सभी मामलों में अनुदान पर्याप्त हैं:MySQL संग्रहीत प्रक्रिया विफल होती है जब R

CREATE PROCEDURE `myDB`.`lee_expout` (IN e int, IN g int) 
BEGIN 

select lm.groupname, lee.location, starttime, dark, 
    inadist,smldist,lardist,emptydur,inadur,smldur,lardur,emptyct,entct,inact,smlct,larct 
from lee join leegroup_map lm using (location) 
where exp_id= e and std_interval!=0 and groupset_id= g 
order by starttime,groupname,location; 

END 

मैं इसे आर से कॉल करने के लिए कोशिश कर रहा हूँ:

library(DBI) 
library(RMySQL) 

db <- dbConnect(MySQL(), user="user", password="pswd", 
     dbname="myDB", host="the.host.com") 

#args to pass to the procedure 
exp_id<-16 
group_id<-2 

#the procedure call 
p <- paste('CALL lee_expout(', exp_id, ',', group_id,')', sep= ' ') 

#the bare query 
q <- paste('select lm.groupname, lee.location, starttime, dark, 
inadist,smldist,lardist,emptydur,inadur,smldur,lardur,emptyct,entct,inact,smlct,larct 
from lee join leegroup_map lm using (location) 
where exp_id=', 
exp_id, 
' and std_interval!=0 and groupset_id=', 
group_id, 
'order by starttime,groupname,location', sep=' ') 

rs_p <- dbSendQuery(db, statement=p) #run procedure and fail 
p_data<-fetch(rs_p,n=30) 

rs_q <- dbSendQuery(db, statement=q) #or comment out p, run query and succeed 
q_data<-fetch(rs_q,n=30) 

नंगे क्वेरी ठीक चलाता है। प्रक्रिया कॉल mysqlExecStatement (कोन, बयान, ...) में

RApache चेतावनी/त्रुटि के साथ विफल !!! त्रुटि: RS-DBI चालक: (कर सकते थे नहीं रन बयान: प्रक्रिया myDB.lee_expout एक परिणाम दिए गए संदर्भ में सेट)

MySQL docs कहना

बयान है कि 0 निर्धारित किया जा सकता के लिए वापस नहीं लौट सकते परिणामकेवल सेट करने के लिए रनटाइम पर, एक प्रोसेसर% s परिणाम संदर्भ त्रुटि में सेट परिणाम परिणाम नहीं लौटा सकता है।

एक सोच सकता है कि यदि एक प्रक्रिया है जो त्रुटि फेंक करने जा रहे थे, यह सिर्फ आर

से

इसे ठीक करने पर कोई विचार करने के बजाय सभी परिस्थितियों में फेंक दिया होगा?

+0

क्या आपने अपनी स्टोर प्रो चलाने के लिए प्रबंधन किया था? क्या आप सही उत्तर चिह्नित कर सकते हैं जो आपकी मदद करता है? या यदि उनमें से कोई भी आप स्वयं को पोस्ट नहीं करते हैं और इसका उत्तर देते हैं।तो इच्छुक लोगों को यहां एक समाधान मिल सकता है। धन्यवाद – jangorecki

+1

@JanGorecki: मैं संग्रहीत प्रक्रिया को चलाने के लिए प्रबंधन नहीं किया था। मुझे नंगे क्वेरी का उपयोग करना पड़ा। यह थोड़ी देर पहले था और शायद आर के डीबीआई पैकेज अब संग्रहित प्रक्रियाओं के बारे में बेहतर है। – dnagirl

+0

मैं MySQL का उपयोग नहीं करता, लेकिन मैंने आर का उपयोग कर माइक्रोसॉफ्ट एसक्यूएल डेटाबेस पर एसक्यूएल प्रश्नों को चलाया है। मैंने देखा है कि जब भी, क्वेरी में, नंगे चयन कथन के अलावा कुछ भी है, प्रक्रिया विफल हो जाती है। मुझे नहीं पता कि यह MySQL में आवश्यक है, लेकिन क्या आपने "निर्माण प्रक्रिया", "प्रारंभ करें" और "अंत" रेखाओं को हटाने का प्रयास किया है? – thepule

उत्तर

1

आर के बारे में अब नहीं है, लेकिन इस

p <- paste('CALL lee_expout(', exp_id, ',', group_id,')', sep= ' ') 

स्ट्रिंग संयोजन की तरह एक सा बदसूरत, यानी दिखता है। शायद आर का डेटाबेस ड्राइवर बुरी तरह लेता है। आम तौर पर, आप चर के लिए प्लेसहोल्डर्स का उपयोग कर सकते हैं और मूल्यों को अलग तर्क के रूप में पास कर सकते हैं। विभिन्न सुरक्षा तर्कों के अलावा, यह किसी भी प्रकार/एस्ट्रोफ़े/जो भी मुद्दों का ख्याल रखता है - शायद यहां भी?

+0

हाँ, मुझे पता है कि यह बदसूरत है। लेकिन मुझे आर में बेहतर तरीका नहीं मिला है; मेरा विश्वास करो मैं प्लेसहोल्डर्स की तलाश में था! किसी भी घटना में, मैंने तारों को गूंज लिया है और वे सही हैं। और नंगे क्वेरी उसी 'पेस्ट' विधि के माध्यम से बनाई गई है। तो मुझे नहीं लगता कि यह एक स्ट्रिंग समस्या है। आप सही हैं कि हालांकि डीबगिंग शुरू करने के लिए यह एक अच्छी जगह है। – dnagirl

+2

यह स्ट्रिंग कॉन्सटेनेशन है, लेकिन आर में अधिक बार उपयोग किया जाता है। आपको sep = '' को रास्ते में जोड़ने की ज़रूरत नहीं है, स्पेस डिफ़ॉल्ट विभाजक है। –

3

जहाँ तक मुझे पता है, आर (dbCallProc) से एसक्यूएल प्रक्रियाओं बुला अभी तक औपचारिक रूप से लागू नहीं किया जाता है (देखें 24 के संदर्भ मैनुअल जुलाई 2010: http://cran.r-project.org/web/packages/RMySQL/RMySQL.pdf)

RMySQL S3 से एस 4 प्रोग्रामिंग शैली करने के लिए स्थानांतरित कर रहा है, और है वर्तमान में अभी भी विकास के तहत (संस्करण 0.7 वर्तमान वाला है)। मेरा सुझाव है कि आप आर के लिए डेटाबेस मेलिंग सूची पर एक ही सवाल पूछते हैं:

https://stat.ethz.ch/mailman/listinfo/r-sig-db

यदि यह संभव है, वे बताएंगे कि कैसे करेंगे। यदि यह नहीं है, तो वे आपको बताएंगे क्यों।

+1

मैंने देखा कि 'dbCallProc' अभी तक लागू नहीं किया गया था। यही कारण है कि मैंने सीधी सवाल की कोशिश की, यह पता लगाया कि अन्य भाषाओं में क्या काम करता है आर में भी काम कर सकता है। मेलिंग सूची के लिंक के लिए धन्यवाद। मैं निश्चित रूप से वहां कोशिश करूँगा और रिपोर्ट करूंगा। – dnagirl

3

जोड़ने का प्रयास करें:

client.flag = CLIENT_MULTI_STATEMENTS

अपने कनेक्शन मापदंडों के। यह मदद कर सकता है।

आरएमवाईएसक्यूएल पीडीएफ में इसके बारे में कुछ विवरण हैं।

संबंधित मुद्दे