高手请进:怎样调用ORACLE的包中自定义的函数(非存储过程)

kmlinda 2004-08-30 01:17:13
我想调用自定义的包体中的函数myFun(a varchar2,b varchar2):return number;用了两种方法都不行;
第一种,建一个adoQuery,sql.add('select mypakage.myfun(x,y) cs from dual');(为做实验,其中的x,y都用的常量),使其active:=true,不报错;建一个dbgrid,指定它的datasouce为该query对应的dataset,但没有数据;而在sqlplus下,可以得到数据200;
第二种,建一个adostoreproc adosp_myfunc,建立3个参数,其中rt为returnValue型参数,integer类型
with adosp_myfunc do
begin
parameters.paramByName('a').value:=x;
parameters.paramByName('b').value:=y;
parameters.paramByName('rt').value:=0;
execProc;
edit1.text:=parameters.paramByName('rt').asString;
end;
报错参数个数错,如果不加rt参数,edit句报错.
csdn中,好象大家都用的output参数的存储过程,如果我不想把function 改为procedure(,,out)形式,该怎样做呢?







...全文
364 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kmlinda 2004-09-10
  • 打赏
  • 举报
回复
经过实验,我发现如果用dbedit来显示就没有问题,说明应该是数据已经取到客户端,但dbgrid的内部机制可能不支持.是Delphi的bug,(Delphi 7.0)

继续探寻问题的原因,因为想用grid形式显示多行数据




cronuz 2004-09-10
  • 打赏
  • 举报
回复
hehe, 俺也实验了一下、還真是有問題。
但是,用「To_Char」函数把数字型轉換成字符型就可顕示了、試試看。

with DataModule1.ADOQuery1 do begin
SQL.Text := 'select To_Char(myFun(''5'',''6'')) from dual';
Open;
end;
longtusoft 2004-09-02
  • 打赏
  • 举报
回复
这种贴子应该顶!
Jeff20040819 2004-09-02
  • 打赏
  • 举报
回复
帮顶,学习,接分
qizhanfeng 2004-08-30
  • 打赏
  • 举报
回复
我用sqlserver试了没问题,希望对你又帮助
sqlserver
--创建函数
Create function t_funcMin( @x int, @y int) returns int
as
begin
declare @r int
if @x< @y
set @r = @x
else
set @r = @y
return (@r)
end

//delphi调用
procedure TForm1.Button1Click(Sender: TObject);
begin
with ADOquery1 do
begin
close;
sql.clear;
sql.add('select dbo.t_funcMin(5,4) as a');
open;
showmessage(inttostr(fields[0].asinteger));
end;
end;

这里没问题
qizhanfeng 2004-08-30
  • 打赏
  • 举报
回复
不怎么与sql里function打交道
学习
up
cronuz 2004-08-30
  • 打赏
  • 举报
回复
你的第一种方法是对的,但是作为常量的x,y值可能没有传进去.

var x,y: Real;
begin
x := 2.5;
y := 5.6;
adoQuery,sql.add('select mypakage.myfun('+ FloatToStr(x) +','+ FloatToStr(y) + ') cs from dual');
{...}
end;
kmlinda 2004-08-30
  • 打赏
  • 举报
回复
难道没有人会吗?

kmlinda 2004-08-30
  • 打赏
  • 举报
回复
将direction改为pdoutput,或pdinputOutput,也报参数错,没蜇

醉马不肖 2004-08-30
  • 打赏
  • 举报
回复
这是c#,我手头没有delphi,不delphi大同效益

SqlParameter.Direction 属性请参见

获取或设置一个值,该值指示参数是只可输入、只可输出、双向还是存储过程返回值参数。

[Visual Basic]
Public Property Direction As ParameterDirection Implements _
IDataParameter.Direction
[C#]
public ParameterDirection Direction {get; set;}
[C++]
public: __property ParameterDirection get_Direction();
public: __property void set_Direction(ParameterDirection);
[JScript]
public function get Direction() : ParameterDirection;
public function set Direction(ParameterDirection);
属性值
ParameterDirection 值之一。默认值为 Input。

实现
IDataParameter.Direction

异常
异常类型 条件
ArgumentException 该属性未设置为有效的 ParameterDirection 值之一。

备注
如果 ParameterDirection 是输出,而执行的关联 SqlCommand 不返回值,则 SqlParameter 包含空值。

当读取最后一个结果集的最后一行后,将更新 Output、InputOut 和 ReturnValue 参数。

示例
[Visual Basic, C#] 下面的示例创建一个 SqlParameter 并设置它的一些属性。

[Visual Basic]
Public Sub CreateSqlParameter()
Dim myParameter As New SqlParameter("@Description", SqlDbType.VarChar)
myParameter.Direction = ParameterDirection.Output
End Sub 'CreateSqlParameter
[C#]
public void CreateSqlParameter()
{
SqlParameter myParameter = new SqlParameter("@Description", SqlDbType.VarChar);
myParameter.Direction = ParameterDirection.Output;
}

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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