--用ADOStoredProc调用Oracle存储过程问题,忙了一天了,还没出来,高手近来帮忙--

时间:2021-09-08 20:30:51
1.我的存储过程:
create or replace procedure proc_show_db_info
(strnow out varchar2,strversion out varchar2,strsid out varchar2)
as
  buf0 varchar2(100);
  buf1 varchar2(100);
  buf2 varchar2(100);
begin
  strSql:='select SYSDATE from DUAL';--系统时间
  execute immediate strSql into buf0;
  strSql:='select BANNER from v$version where rownum=1';--数据库版本
  execute immediate strSql into buf1;
  strSql:='select name from v$database';--数据库SID
  execute immediate strSql into buf2
  strnow:=buf0;
  strversion:=buf1;
  strsid:=buf2;
end; 
编译,成功,并且在Oracle中测试过,通过没问题!
2.在D7中调用:
procedure TForm1.Button11Click(Sender: TObject);
begin
  ADOStoredProc1.Close;
  ADOStoredProc1.ProcedureName:='PROC_SHOW_DB_INFO';
  ADOStoredProc1.Parameters.Clear;
  ADOStoredProc1.Parameters.Refresh;
  with ADOStoredProc1.Parameters.AddParameter do
  begin
    Name:='out1';
    DataType:=ftString;
    Direction:=pdOutput;
    Size:=100;
  end;
  with ADOStoredProc1.Parameters.AddParameter do
  begin
    Name:='out2';
    DataType:=ftString;
    Direction:=pdOutput;
    Size:=100;
  end;
  with ADOStoredProc1.Parameters.AddParameter do
  begin
    Name:='out3';
    DataType:=ftString;
    Direction:=pdOutput;
    Size:=100;
  end;
  ADOStoredProc1.Prepared:=true;
  ADOStoredProc1.ExecProc;
  Edit1.text:=ADOStoredProc1.Parameters.ParameByName('out1').value;
  Edit2.text:=ADOStoredProc1.Parameters.ParameByName('out2').value;
  Edit3.text:=ADOStoredProc1.Parameters.ParameByName('out3').value;  
end;
3.出错了..........
请大吓帮忙啊,谢谢!

11 个解决方案

#1


一看楼主的程储过程就有两个错误
1. strsql 变量没有定义
2. execute immediate strSql into buf2
  缺少结束符

#2



楼主的输出参数明明是
strnow out varchar2,
strversion out varchar2,
strsid out varchar2
怎么在程序中写为out1,out2,out3呢

#3


对不起,
1. strsql 变量没有定义
2. execute immediate strSql into buf2
  缺少结束符
我忘记写了,是copy的错误!

怎么在程序中写为out1,out2,out3呢?
答:我在Delphi的存储过程参数中设置的三个参数为out1,out2,out3,这个难道有问题吗?

#4


楼主出现的是什么错误?

#5


我将ADOConnection连接oracle数据库,驱动是Oracle for OLEDB。
然后设置ADOStoredProc的connection属性为ADOConnection。
其他什么都没设置。
出现的错误是:
“提供者不能导出参数信息,没有调用SetParameterInfo”
谢谢!

#6


是不是你的权限不够
如果你在oracle中执行权限不够是执行不了这个存储过程的

#7


把这句话去掉试试
ADOStoredProc1.Parameters.Refresh;

#8


不对啊!
1。我在SQLWorkSheet中可以执行这个存储过程,并获得输出值
2。我这个用户已经拥有DBA、CONNECT、RESOURCE等角色以及EXCUTE ANY PROCEDURE等系统权限

谢谢!

#9


ADOStoredProc1.Parameters.Refresh;
去掉后,错误变了:
“表或视图不存在”,
我也以为我权限不够,但是我在Oracle中这样执行就出来结果了:
declare
  buf0 varchar2(100);
  buf1 varchar2(100);
  buf2 varchar2(100);
  strSql varchar2(100);
begin
  strSql:='select SYSDATE from DUAL';--系统时间
  execute immediate strSql into buf0;
  strSql:='select BANNER from v$version where rownum=1';--数据库版本
  execute immediate strSql into buf1;
  strSql:='select dbid from v$database';--数据库SID
  execute immediate strSql into buf2; 
  dbms_output.put_line(buf0); 
  dbms_output.put_line(buf1); 
  dbms_output.put_line(buf2); 
end;

#10


我觉得错误的原因是虽然你有那个权限还是普通用户登录的
比如你用的是pl/sql dev 你选的是普通用户也是不能执行这个存储过程的

#11


请问如何在Delphi中以DBA的身份登陆Oracle?怎样写ConnectionString?谢谢

#1


一看楼主的程储过程就有两个错误
1. strsql 变量没有定义
2. execute immediate strSql into buf2
  缺少结束符

#2



楼主的输出参数明明是
strnow out varchar2,
strversion out varchar2,
strsid out varchar2
怎么在程序中写为out1,out2,out3呢

#3


对不起,
1. strsql 变量没有定义
2. execute immediate strSql into buf2
  缺少结束符
我忘记写了,是copy的错误!

怎么在程序中写为out1,out2,out3呢?
答:我在Delphi的存储过程参数中设置的三个参数为out1,out2,out3,这个难道有问题吗?

#4


楼主出现的是什么错误?

#5


我将ADOConnection连接oracle数据库,驱动是Oracle for OLEDB。
然后设置ADOStoredProc的connection属性为ADOConnection。
其他什么都没设置。
出现的错误是:
“提供者不能导出参数信息,没有调用SetParameterInfo”
谢谢!

#6


是不是你的权限不够
如果你在oracle中执行权限不够是执行不了这个存储过程的

#7


把这句话去掉试试
ADOStoredProc1.Parameters.Refresh;

#8


不对啊!
1。我在SQLWorkSheet中可以执行这个存储过程,并获得输出值
2。我这个用户已经拥有DBA、CONNECT、RESOURCE等角色以及EXCUTE ANY PROCEDURE等系统权限

谢谢!

#9


ADOStoredProc1.Parameters.Refresh;
去掉后,错误变了:
“表或视图不存在”,
我也以为我权限不够,但是我在Oracle中这样执行就出来结果了:
declare
  buf0 varchar2(100);
  buf1 varchar2(100);
  buf2 varchar2(100);
  strSql varchar2(100);
begin
  strSql:='select SYSDATE from DUAL';--系统时间
  execute immediate strSql into buf0;
  strSql:='select BANNER from v$version where rownum=1';--数据库版本
  execute immediate strSql into buf1;
  strSql:='select dbid from v$database';--数据库SID
  execute immediate strSql into buf2; 
  dbms_output.put_line(buf0); 
  dbms_output.put_line(buf1); 
  dbms_output.put_line(buf2); 
end;

#10


我觉得错误的原因是虽然你有那个权限还是普通用户登录的
比如你用的是pl/sql dev 你选的是普通用户也是不能执行这个存储过程的

#11


请问如何在Delphi中以DBA的身份登陆Oracle?怎样写ConnectionString?谢谢