用query执行Oracle的存储过程时,怎么返回参数?(100分)

D

dedema

Unregistered / Unconfirmed
GUEST, unregistred user!
如题所示!
用query来执行oracle的存储过程时,sql应当这样写的:
query1.sql.text:='begin proc:)xx,:yy);end;';
xx为in参数,yy为out参数!
我运行了它,在BDE连接的情况下,正常执行无异常,但是没有返回参数,即
query1.parambyname('yy')并没有显示存储过程起作用了,yy的值还是原样。
不过,我不感到意外,据说BDE在这种情况下执行存储过程本来就没有返回参
数的。如果是ADO,ODBC的话,那就可以返回参数的,我己经把它改成ADO,
ODBC连接到Oracle,但是一执行就产生异常,说什么非法字符什么的!
现在,我己经试过多种情况了。没辙!
请给我一个query执行oracle的存储过程且成功地返回输出参数的例子!
晚上我再来看看!行的话,马上就给啦!
 
没玩过oracle
有sql的例子行不行
 
query是不行的, 得用TStoredProc 的
 
楼上的弟兄,query是可以用的。
不信,你去搜一搜帖子呀!
 
QUERY啊?
还是用TStoredProc
 
哎。。。。
我就是要用query啦!
快快说说行不行?而不是,用其它方法绕过去的!
 
奇怪,为什么一定要钻牛角尖,有TStoredProc不用,干脆你看看TStoredProc的源码
好了,应该也有借鉴意义的.
 
兄弟,Query和StorProc都是Delphi的BDE对外表现形式,它对外没有提供那个获取参数的功能,累S你你也不能找到啊。
就像公鸡母鸡都会吃食,但是你非要公鸡下蛋……
还是使用存储过程吧。。。

粗略看了一下Query和StreProc两个控件的Exec部分的源代码,追踪到以下执行部分。
可以明显看出来,TStoredProc比TQuery多一个GetResults,你再打开GetResults看看,基本就清楚了。
除非你再继续改写VCL代码(不应该是简单的填写一个GetResults),或者做其他的工作,否则基本是没戏的了。

function TQuery.GetQueryCursor(GenHandle: Boolean): HDBICur;
var
PCursor: phDBICur;
begin
Result := nil;
if GenHandle then PCursor := @Result
else PCursor := nil;
if FParams.Count > 0 then SetQueryParams(Self, StmtHandle, Params);
Check(DbiQExec(StmtHandle, PCursor));
end;

function TStoredProc.GetCursor(GenHandle: Boolean): HDBICur;
var
PCursor: phDBICur;
begin
Result := nil;
if GenHandle then PCursor := @Result
else PCursor := nil;
BindParams;
Check(DbiQExec(StmtHandle, PCursor));
GetResults;
end;
 
同意yzhshi的
 
我用的ADO,已经搞定。
见 http://www.delphibbs.com/delphibbs/dispq.asp?lid=1321421

等会我试试BDE,看看效果如何。
 
参考Ado的两个的ExecSQL代码,可以看出来,两个基本是一样的,就是说,AdoQuery应该能够实现和AdoStoredProc一样的功能。
当然,至于能不能,也许我下面的代码不能完全说明问题,不过从表面上看,应该可以的。
但BDE就……

function TADOQuery.ExecSQL: Integer;
begin
InitializeMasterFields(Self);
Command.Execute(FRowsAffected, EmptyParam);
Result := FRowsAffected;
end;

procedure TADOStoredProc.ExecProc;
begin
InitializeMasterFields(Self);
Command.Execute;
end;
 
多人接受答案了。
 
顶部