如何从 Delphi 调用 Oracle 函数?

Posted

技术标签:

【中文标题】如何从 Delphi 调用 Oracle 函数?【英文标题】:How can I call an Oracle function from Delphi? 【发布时间】:2011-02-26 15:10:48 【问题描述】:

我在 Oracle 中创建了一个函数,用于在特定表中插入记录并根据函数内发生的情况返回输出。例如(ins_rec 返回编号)

如何调用此函数并在 Delphi 中查看其输出?

我收到了关于 sql plus 的回复(非常感谢),但我需要知道如何在 Delphi 中执行此操作

【问题讨论】:

欢迎来到***!您可以通过将答案标记为正确来向回答问题的人表示感谢。点击答案旁边的绿色勾号。恐怕我无法帮助您解决这个问题 - 我对德尔福一无所知。 :) 【参考方案1】:

只需在查询中将用户定义的函数作为列名传递即可。

例子:

Var
  RetValue: Integer;
begin
  Query1.Clear;
  Query1.Sql.Text := 'Select MyFunction(Param1) FunRetValue from dual';
  Query1.Open;

  if not Query1.Eof then
  begin
    RetValue := Query1.FieldByName('FunRetValue').AsInteger;
  end;
end;

【讨论】:

Oracle 有 DUAL 特殊表,当您需要这样的东西时可以使用。您的代码可能无法执行您所期望的 - 它可以为 的每一行调用函数 【参考方案2】:

如何实现它可能取决于您使用的 DB 访问库(BDE?dbExpress?ADO?其他),有些可能会提供一个“存储过程”组件,它也可以与函数一起使用。

使用匿名 PL/SQL 块调用函数(以及读取返回值的参数)的一般方法,PL/SQL 与 Pascal 非常相似...:

Qry.SQL.Clear;
Qry.SQL.Add('BEGIN');
Qry.SQL.Add('  :Rez := ins_rec;');
Qry.SQL.Add('END;');
// Set the parameter type here...
...
Qry.ExecSQL;
...
ReturnValue :=  Qry.ParamByName('Rez').Value;

不过,我不会使用函数,而是使用具有 OUT 值的存储过程。此外,Oracle 提供了,它们是组织过程和函数的一种非常好的方式,它们还提供了有用的特性,如会话变量和初始化/终结部分......非常类似于 Delphi 单元。 p>

【讨论】:

【参考方案3】:

我们使用此代码运行 Oracle 存储过程,该代码利用了 BDE(我知道请不要 bash,因为我们使用了 BDE!)

Try
  DMod.Database1.Connected:= False;
  DMod.Database1.Connected:= True;
  with DMod.StoredProc1 do
  begin
    Active:= False;

    ParamByName('V_CASE_IN').AsString:= Trim(strCaseNum);
    ParamByName('V_WARRANT_IN').AsString:= strWarrantNum;
    ParamByName('V_METRO_COMMENTS').AsString:= strComment;

    Prepare;
    ExecProc;

    Result:= ParamByName('Result').AsString;
  end;
Except

【讨论】:

以上是关于如何从 Delphi 调用 Oracle 函数?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle如何创建存储过程和如何调用存储过程

如何从 Delphi 调用 _putenv?

oracle 函数中能调用存储过程吗

delphi 三层架构如何调用oracle 存储过程,应该使用哪个部件,最好有实例

如何从 oracle 的 java 代码输出到 oracle 控制台?

delphi如何调用dll函数