2010-08-30 27 views
9

çağrıldığında başarısız oluyor Bu yordam, hem uzaktan hem de yerel ana bilgisayardaki MySQL komut satırından çalışır ve PHP'den çağrıldığında çalışır. Her durumda hibe yeterli:MySQL saklı yordamı, 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 

Ben R diyoruz çalışıyorum:

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) 

çıplak sorgu iyi çalışır. yordam çağrısı

RApache Uyarı/Hata ile başarısız !!! Hata mysqlExecStatement (conn, deyim, ...) içinde: RS-DBI sürücüsü: (yapamadı çalıştırmak beyanı: USULÜ myDB.lee_expout verilen bağlamda geçen bir sonuç)

MySQL docs 0 belirlenebilir ifadeleri için

demek döndüremezyalnızca bir çalışma zamanı döndürmek için set, bir PROSEDÜR% s bir sonucunu döndüremiyor, verilen bağlam hatası oluşur.

biri bir prosedür hatayı atacak olsaydı, bunun yerine sadece R.

den

bu nasıl giderileceği ile ilgili herhangi bir düşünce her koşulda atılmış olacağını düşünürsünüz?

+0

Mağazanızın proc'sini çalıştırmayı başardınız mı? Size yardımcı olan doğru cevabı işaretleyebilir misiniz? ya da bunların hiçbiri gönderemezsiniz ve kendiniz cevaplayın.Böylece ilgilenen insanlar burada bir çözüm bulabilir. Teşekkürler – jangorecki

+1

@JanGorecki: Saklı yordamı çalıştırmayı başaramadım. Çıplak sorguyu kullanmak zorundaydım. Bu bir süre önce oldu ve belki de R'nin DBI paketi şimdi depolanmış prosedürler hakkında daha iyi. – dnagirl

+0

MySQL kullanmıyorum, ancak SQL kullanarak Microsoft SQL veritabanlarında SQL sorguları çalıştırdım. Sorguda, her ne kadar bir şey olursa olsun, çıplak seçim deyiminde işlemin başarısız olduğunu fark ettim. MySQL'de gerekli olup olmadığını bilmiyorum, ancak "oluşturma prosedürü", "başlangıç" ve "bitiş" satırlarını kaldırmayı denediniz mi? – thepule

cevap

1

Ar hakkında artık etmeyin, ancak bu

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

dizisi birleştirme gibi çirkin biraz, yani bakmak yok. Belki R'nin veritabanı sürücüsü bunu çok kötü bir şekilde alır. Genelde değişkenler için yer tutucuları kullanabilir ve değerleri ayrı argümanlar olarak iletebilirsiniz. Çeşitli güvenlik argümanlarının yanı sıra, bu herhangi bir tür/kesme/sorun ne olursa olsun ilgilenir - belki de burada?

+0

Evet, çirkin olduğunu biliyorum. Fakat R'de daha iyi bir yol bulamadım; bana yer tutucuları aradığına inanıyorum! Her halükarda, dizeleri ekledim ve doğrular. Ve çıplak sorgu aynı "paste" yöntemi ile oluşturulur. Yani bunun bir dize problemi olduğunu düşünmüyorum. Doğru olsa da, hata ayıklamaya başlamak için iyi bir yer. – dnagirl

+2

Bu dize birleştirme, ancak daha sık kullanılan R kullanılır. Bu arada sep = '' eklemek zorunda değilsiniz, boşluk varsayılan ayırıcıdır. –

3

Bildiğim kadarıyla, (Temmuz 2010 24 referans kılavuzuna bakın: http://cran.r-project.org/web/packages/RMySQL/RMySQL.pdf) henüz resmen uygulanmadı R (dbCallProc) SQL prosedürleri çağıran bildiği gibi RMySQL S4 programlama stiline S3 transfer ve ise

Şu anda hala geliştirme aşamasındadır (mevcut sürüm olan 0.7 versiyonu). Sana R veritabanı posta listesinde aynı soruyu sormak öneririz: Mümkünse nasıl

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

, onlar göstereceğiz. Eğer değilse, nedenini size söylerler. ekleyerek

+1

'dbCallProc'un henüz uygulanmadığını gördüm. Bu yüzden diğer dillerde çalışanların da R'de çalışabileceğini düşünerek düz bir sorguyu denedim. Mail listemize bağlantı için teşekkürler. Kesinlikle orada deneyeceğim ve rapor vereceğim. – dnagirl

3

Dene:

client.flag = CLIENT_MULTI_STATEMENTS bağlantı parametrelerine

. Yardımcı olabilir.

RMySQL PDF ile ilgili bazı ayrıntılar vardır.

İlgili konular