adoquery怎样调用oracle存储过程?

nxfbccu 2008-04-21 01:58:28
with ADOQuery1 do
begin
Close;
Parameters.Clear;
SQL.Text :='exec PR_USERMENU ';
Parameters.CreateParameter('AUserID',ftInteger,pdInput,20,1009900);
Open;
end;
最后报“无效的SQL语句”的错误!
过程是没有问题的!

请问用ADOQUERY到底要怎样才能调用oracle的存储过程?
...全文
210 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
nxfbccu 2008-04-21
  • 打赏
  • 举报
回复
呵呵
不错,月亮就是月亮!
完全正确!
没话可分,接分!
CCC的 2008-04-21
  • 打赏
  • 举报
回复
☆、在SQLServer中建立存储过程
--DROP PROCEDURE Test;

CREATE PROCEDURE Test
@aa VARCHAR(15),
@bb INT,
@cc VARCHAR(15) OUTPUT,
@dd INT OUTPUT
AS
BEGIN
SELECT @cc=UPPER(@aa)
PRINT @cc
SELECT @dd=@bb+1
PRINT @dd
RETURN
END

/* 在SQLServer中测试
DECLARE @cc VARCHAR(15)
DECLARE @dd INT
EXECUTE Test 'Test Area', 123, @cc, @dd
*/

☆、在Delphi中调用
procedure TForm1.btn1Click(Sender: TObject);
begin
With ADOQuery1 Do Begin
Close;
SQL.Clear ;
SQL.Add(' EXECUTE Test :aa, :bb, :cc Output, :dd Output ') ;
Parameters.Items[0].Value := 'Test aa';
Parameters.Items[1].Value := 1234;
Prepared;
ExecSQL;
Edit1.Text := Parameters.Items[2].Value + ' : ' + IntToStr(Parameters.Items[3].Value);
Close;
end;
end;
hongqi162 2008-04-21
  • 打赏
  • 举报
回复
啥也别说了,给分吧!


:)
hongqi162 2008-04-21
  • 打赏
  • 举报
回复

原来是这样的
begin
AdoQuery2.Close ;
AdoQuery2.Parameters.Clear ;
AdoQuery2.SQL.Clear ;
AdoQuery2.SQL.Add('{call sp_test1(:c)}') ;
adoquery2.Parameters.ParamValues['c']:='1';
AdoQuery2.Open ;
end;
nxfbccu 2008-04-21
  • 打赏
  • 举报
回复
是的,ADODATASET也可以的
就是ADOQUERY不知道怎样用,我那里一定要用这个控件!
郁!
byteh 2008-04-21
  • 打赏
  • 举报
回复
mark 一下,用到了好找
呵呵
hongqi162 2008-04-21
  • 打赏
  • 举报
回复

adoquery不经常用,你也可以使用ADODataSet1替换它

ADODataSet1.Close;
ADODataSet1.CommandType:= cmdStoredProc;
ADODataSet1.CommandText:='sp_test1';
ADODataSet1.Parameters.CreateParameter('c',ftString,pdInput,100,'1');
ADODataSet1.Open;
nxfbccu 2008-04-21
  • 打赏
  • 举报
回复
hongqi162 、 zhu_gx
你们说的都很对,这种方式都可以,而且我也是这样用的
只是现在我碰到一定要用ADOQUERY去调用
因为为什么用这个控件,主要是一些遗留的原因就不说了
用这个控件,不知道怎么调用!
hongqi162 2008-04-21
  • 打赏
  • 举报
回复
--测试数据
create table t1(c1 varchar2(100),c2 varchar2(100));
insert into t1 select '1','1' from dual union all select '2','1' from dual;
--测试存储过程oracle 9i 中可以使用sys_refcursor ,更低版本需要定义包在包中定义动态游标
create or replace procedure sp_test1(c t1.c2%type,rst out sys_refcursor) is
begin
open rst for select * from t1 where c2=c;
end;


--delphi测试
--使用ADOCommand1执行存储过程并将返回的结果集赋予ADOQuery1
ADOCommand1.CommandType:= cmdStoredProc;
ADOCommand1.CommandText:= 'sp_test1';
ADOCommand1.Parameters.CreateParameter('c',ftString,pdInput,100,'1');
ADOQuery1.Recordset:=ADOCommand1.Execute;
zhu_gx 2008-04-21
  • 打赏
  • 举报
回复
ADOSP:=TADOStoredProc.Create(nil);
with ADOSP do
begin
Close;
Parameters.Clear;
Connection:=FAdoConn;
ProcedureName:=OraPackageName +'procName';
Parameters.CreateParameter('User',ftString,pdInput,20,'aaa');
Parameters.CreateParameter('test',ftString,pdInput,10,'bbb');
Prepared;
ExecProc;
Retstr := Parameters.ParamValues['Retstr'];
end ;


这样试试行不。。。。。。
zhu_gx 2008-04-21
  • 打赏
  • 举报
回复

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧