用VB6和ADO怎么调用oracle的函数(function),而不是调用存储过程(procedure)

samsam28 2002-09-19 10:52:15
用VB6和ADO怎么调用oracle的函数(function),而不是调用存储过程(procedure)

代码如下:

Dim con As ADODB.Connection
Dim com As ADODB.Command
Dim para_in As ADODB.Parameter
Dim para_out As ADODB.Parameter
Dim constr As String

Set con = New ADODB.Connection
constr = "....."
con.Open constr
Set com = New ADODB.Command
com.ActiveConnection = con
com.CommandText = "...." //???,这里是写存储过程名还是函数名?
com.CommandType = adCmdStoredProc //??? ,这里不知道写什么好
com.Prepared = true

Set parm_in = New ADODB.Parameter
parm_in.Name = "in"
parm_in.Type = adVarChar
parm_in.Size = 15
parm_in.Direction = adParamInput
parm_date.Value = "....."
com.Parameters.Append parm_in

Set parm_out = New ADODB.Parameter
parm_out.Name = "out"
parm_out.Type = adDecimal
parm_v1.Direction = adParamOutput
com.Parameters.Append parm_out

com.Execute()

开始执行后就报错了
vb 实时错误 '-2147217900 (80040e14)';

oracle错误代码为:
ora-06550:
pls-00221:'....' is not a procedureor is undefined
ora-06550:
pl/sql: statement ignored

注释:
该函数肯定是存在与oracle内的,肯定不是存储过程,而且我是以
系统admin角色登录数据库的,不存在函数或者存储过程的授权
问题

所以,请专家高手指点用ADO怎么调用oracle的函数(function),
不是调用存储过程(procedure)

能用其他办法解决这个问题也可以,但还是必须调用这个函数
万分感谢

...全文
163 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
samsam28 2002-09-20
  • 打赏
  • 举报
回复
你好
关键是test2有out,还有return //请看我的函数定义 test1和test2

用test1的时候
vb程序里这么写
......
com.CommandText = "select test1('hello') as ccc from dual"
com.CommandType = adCmdText
set rs =new ADODB.Recordset
rs=com.execute
....
xxx=rs("ccc")
.....
可以拿到返回值

但对于test2,我就不知道怎么写那个commandtext了
试了很多次都是错误

如果用
com.CommandText = "test1('hello') as ccc from dual"
com.CommandType =adCmdStoredProc
就会报错,说存储过程不存在或者undifined

请教了,谢谢
beckhambobo 2002-09-20
  • 打赏
  • 举报
回复
select func_name(parameter) into result from dual;----是ORACLE语句

会得该函数的返回值

用Command可以实现调用存储过程,把函数写在存储过程

imtiger 2002-09-19
  • 打赏
  • 举报
回复
直接执行SQL语句就可以了
"select func_name(parameter) as result from dual;"
wqb 2002-09-19
  • 打赏
  • 举报
回复
再编一个存储过程调用这个函数,然后vb调用存储过程怎样?
samsam28 2002-09-19
  • 打赏
  • 举报
回复
很急,没办法了
往上提一提吧
online wait...
samsam28 2002-09-19
  • 打赏
  • 举报
回复
因为在生产数据库上我没有权限,只有自己在本地装了个oracle做测试
(实在是没办法了),做了2个测试用的函数

第1个
create function test1
(
var1 in varchar2
)
return varchar2
is
begin
return (var1||' 测试一');
end;
/

用select test1('hello') from dual;
程序运行正常,能得到我需要的一个正确的返回值 'hello 测试一'

第2个
create function test2
(
var1 in varchar2,
var2 out varchar2
)
return varchar2
is
begin
var2:='测试二';
return (var1||' 测试二');
end;
/
再用select test2('hello') from dual;
程序就不能运行了,得不到我需要的二个返回值。

错误信息如下:
ora-06553:pls-306:wrong number or types of arguments in call to 'test2'

我已经为这问题头痛了2天了,请斑竹和专家高手帮忙了,并请尽量解决
问题,直到最终可以保证程序可以调用这个函数
万分感谢

samsam28 2002-09-19
  • 打赏
  • 举报
回复
再提
请问怎么写这个sql?
select 函数名(参数) 返回值 from dual;

oracle函数定义见上
谢谢
samsam28 2002-09-19
  • 打赏
  • 举报
回复
说直了吧,我没有权限在数据库上建过程,
甚至连函数也不能建,我只能调用公司已
经建好的函数,这是事实。
所以还是请各位帮忙了,谢谢
yzf01 2002-09-19
  • 打赏
  • 举报
回复
那你怎么要做成函数呢?明明用procedure可以轻松搞定的。
samsam28 2002-09-19
  • 打赏
  • 举报
回复
不知道这条语句的规范,所以试了几下总是出错
能否给我个具体的sql吗?万分谢谢

我的function如下,请注意是返回3个值,不只是
两个OUT,还有一个返回状态(ok或者错误信息)

function vb_fun
(
var_in_1 in varchar2,
var_in_2 in varchar2,
var_out_1 out number,
var_out_2 out varchar2
)
return varchar2
is
begin
.......
var_out_1:=12345;
var_out_2:='12345';
return('ok');
exception
when others then
return(sqlerrm);
end;

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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