2010-08-30 10 views
9

Quy trình này hoạt động từ dòng lệnh MySQL cả từ xa lẫn trên máy chủ cục bộ và nó hoạt động khi được gọi từ PHP. Trong mọi trường hợp tài trợ này đủ:Quy trình lưu trữ MySQL không thành công khi được gọi từ 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 

Tôi đang cố gắng để gọi nó từ R:

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) 

Truy vấn trần chạy tốt. Cuộc gọi thủ tục không thành công với

RApache Cảnh báo/Lỗi !!! Lỗi trong mysqlExecStatement (conn, tuyên bố, ...): điều khiển RS-DBI: (không thể chạy tuyên bố: THỦ TỤC myDB.lee_expout không thể trở về một kết quả thiết lập trong bối cảnh nhất định)

các MySQL docs nói

Đối với báo cáo có thể được xác định chỉ trong thời gian chạy để trả lại kết quả thiết lập, một PROCEDURE% s không thể trả lại kết quả được đặt trong lỗi ngữ cảnh đã cho xảy ra.

Chúng tôi từng nghĩ rằng nếu một thủ tục được sẽ ném lỗi đó, nó sẽ được ném trong mọi hoàn cảnh thay vì chỉ từ R.

Bất kỳ suy nghĩ về làm thế nào để sửa lỗi này?

+0

bạn có quản lý để chạy proc cửa hàng của mình không? bạn có thể đánh dấu câu trả lời đúng giúp bạn? hoặc nếu không ai trong số họ tạo bài đăng và tự trả lời.Vì vậy, những người quan tâm có thể tìm thấy một giải pháp ở đây. Cảm ơn – jangorecki

+1

@JanGorecki: Tôi đã không quản lý để chạy các thủ tục được lưu trữ. Tôi đã phải sử dụng truy vấn trần. Đây là một thời gian trước đây mặc dù và có lẽ gói DBI của R là tốt hơn về thủ tục lưu trữ ngay bây giờ. – dnagirl

+0

Tôi không sử dụng MySQL, nhưng tôi đã chạy truy vấn SQL trên cơ sở dữ liệu Microsoft SQL sử dụng R. Tôi nhận thấy rằng bất cứ khi nào, trong truy vấn, có bất cứ điều gì nhưng câu lệnh chọn trần, quá trình không thành công. Tôi không biết nếu nó là cần thiết trong MySQL, nhưng có bạn đã cố gắng loại bỏ các "tạo thủ tục", "bắt đầu" và "kết thúc" dòng? – thepule

Trả lời

1

Do không phải bây giờ về R, nhưng điều này

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

không nhìn một chút xấu xí, tức là như nối chuỗi. Có thể trình điều khiển cơ sở dữ liệu của R mất rất nhiều. Nói chung, bạn có thể sử dụng trình giữ chỗ cho các biến và chuyển các giá trị trên dưới dạng các đối số riêng biệt. Bên cạnh các đối số bảo mật khác nhau, điều này cũng sẽ chăm sóc bất kỳ loại/dấu nháy đơn/bất kỳ vấn đề nào - có thể ở đây?

+0

vâng, tôi biết nó xấu xí. Nhưng tôi đã không tìm thấy một cách tốt hơn trong R; tôi tin rằng tôi đang tìm kiếm trình giữ chỗ! Trong mọi trường hợp, tôi đã lặp lại các chuỗi và chúng đúng. Và truy vấn trần được tạo ra thông qua phương thức 'paste'. Vì vậy, tôi không nghĩ rằng đó là một vấn đề chuỗi. Bạn nói đúng rằng đó là một nơi tốt để bắt đầu gỡ lỗi mặc dù. – dnagirl

+2

Nó là chuỗi nối, nhưng được sử dụng thường xuyên hơn trong R. Bạn không phải thêm các sep = '' bằng cách này, không gian là dấu phân cách mặc định. –

3

Theo như tôi biết, gọi thủ tục SQL từ R (dbCallProc) vẫn chưa được chính thức thực hiện (xem hướng dẫn tham khảo của 24 tháng 7 năm 2010: http://cran.r-project.org/web/packages/RMySQL/RMySQL.pdf)

RMySQL được chuyển từ S3 đến phong cách lập trình S4, và là hiện vẫn đang được phát triển (phiên bản 0.7 là phiên bản hiện tại). Tôi đề nghị bạn hỏi cùng một câu hỏi trên mailing list cơ sở dữ liệu cho R:

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

Nếu có thể, họ sẽ chỉ cho bạn cách. Nếu không, họ sẽ cho bạn biết lý do.

+1

Tôi đã thấy rằng 'dbCallProc' chưa được triển khai. Đó là lý do tại sao tôi đã thử một truy vấn thẳng, cho rằng những gì làm việc trong các ngôn ngữ khác cũng có thể làm việc trong R. Cảm ơn bạn đã liên kết tới danh sách gửi thư. Tôi chắc chắn sẽ thử ở đó và báo cáo lại. – dnagirl

3

Hãy thử thêm:

client.flag = CLIENT_MULTI_STATEMENTS

các thông số kết nối của bạn. Nó có thể giúp.

Có một số chi tiết về điều này trong PDF RMySQL.