9

この手順は、リモートとローカルホストの両方で MySQL コマンドラインから機能し、PHP から呼び出されたときに機能します。すべての場合において、助成金は適切です。

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

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)

裸のクエリは正常に実行されます。プロシージャ コールは次のエラーで失敗します。

RApache 警告/エラー!!! mysqlExecStatement(conn、ステートメント、...) のエラー: RS-DBI ドライバー: (ステートメントを実行できませんでした: PROCEDURE myDB.lee_expout は、指定されたコンテキストで結果セットを返すことができません)

MySQLのドキュメントによると

実行時にのみ結果セットを返すと判断できるステートメントの場合、PROCEDURE %s can't return a result set in the given context エラーが発生します。

プロシージャがそのエラーをスローする場合、R からだけでなく、すべての状況でスローされると考える人もいるでしょう。

これを修正する方法について何か考えはありますか?

4

3 に答える 3

3

私の知る限り、R からの SQL プロシージャの呼び出し (dbCallProc) はまだ正式に実装されていません (2010 年 7 月 24 日のリファレンス マニュアルを参照してください: http://cran.r-project.org/web/packages/RMySQL/RMySQL.pdf ) 。

RMySQL は S3 から S4 プログラミング スタイルに移行され、現在も開発中です (バージョン 0.7 が現在のものです)。R のデータベース メーリング リストで同じ質問をすることをお勧めします。

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

可能であれば、その方法を教えてくれます。そうでない場合は、理由を教えてくれます。

于 2010-08-30T21:45:13.960 に答える
3

追加してみてください:

client.flag=CLIENT_MULTI_STATEMENTS

接続パラメーターに。それは役立つかもしれません。

これについては、RMySQL PDF に詳細が記載されています。

于 2010-11-02T08:46:39.390 に答える
1

Rについては今はやめてください、しかしこれは

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

文字列の連結のように、少し醜く見えます。たぶん、R のデータベース ドライバーはそれをひどく受け入れます。一般に、変数にプレースホルダーを使用して、値を個別の引数として渡すことができます。さまざまなセキュリティ引数に加えて、これは型/アポストロフィ/その他の問題も処理します - おそらくここでも?

于 2010-08-30T20:28:48.090 に答える