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
缺少结束符
1. strsql 变量没有定义
2. execute immediate strSql into buf2
缺少结束符
#2
晕
楼主的输出参数明明是
strnow out varchar2,
strversion out varchar2,
strsid out varchar2
怎么在程序中写为out1,out2,out3呢
楼主的输出参数明明是
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,这个难道有问题吗?
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”
谢谢!
然后设置ADOStoredProc的connection属性为ADOConnection。
其他什么都没设置。
出现的错误是:
“提供者不能导出参数信息,没有调用SetParameterInfo”
谢谢!
#6
是不是你的权限不够
如果你在oracle中执行权限不够是执行不了这个存储过程的
如果你在oracle中执行权限不够是执行不了这个存储过程的
#7
把这句话去掉试试
ADOStoredProc1.Parameters.Refresh;
ADOStoredProc1.Parameters.Refresh;
#8
不对啊!
1。我在SQLWorkSheet中可以执行这个存储过程,并获得输出值
2。我这个用户已经拥有DBA、CONNECT、RESOURCE等角色以及EXCUTE ANY PROCEDURE等系统权限
谢谢!
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;
去掉后,错误变了:
“表或视图不存在”,
我也以为我权限不够,但是我在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 你选的是普通用户也是不能执行这个存储过程的
比如你用的是pl/sql dev 你选的是普通用户也是不能执行这个存储过程的
#11
请问如何在Delphi中以DBA的身份登陆Oracle?怎样写ConnectionString?谢谢
#1
一看楼主的程储过程就有两个错误
1. strsql 变量没有定义
2. execute immediate strSql into buf2
缺少结束符
1. strsql 变量没有定义
2. execute immediate strSql into buf2
缺少结束符
#2
晕
楼主的输出参数明明是
strnow out varchar2,
strversion out varchar2,
strsid out varchar2
怎么在程序中写为out1,out2,out3呢
楼主的输出参数明明是
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,这个难道有问题吗?
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”
谢谢!
然后设置ADOStoredProc的connection属性为ADOConnection。
其他什么都没设置。
出现的错误是:
“提供者不能导出参数信息,没有调用SetParameterInfo”
谢谢!
#6
是不是你的权限不够
如果你在oracle中执行权限不够是执行不了这个存储过程的
如果你在oracle中执行权限不够是执行不了这个存储过程的
#7
把这句话去掉试试
ADOStoredProc1.Parameters.Refresh;
ADOStoredProc1.Parameters.Refresh;
#8
不对啊!
1。我在SQLWorkSheet中可以执行这个存储过程,并获得输出值
2。我这个用户已经拥有DBA、CONNECT、RESOURCE等角色以及EXCUTE ANY PROCEDURE等系统权限
谢谢!
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;
去掉后,错误变了:
“表或视图不存在”,
我也以为我权限不够,但是我在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 你选的是普通用户也是不能执行这个存储过程的
比如你用的是pl/sql dev 你选的是普通用户也是不能执行这个存储过程的
#11
请问如何在Delphi中以DBA的身份登陆Oracle?怎样写ConnectionString?谢谢