【问题标题】:FireDac Call Function in OracleOracle 中的 FireDac 调用函数
【发布时间】:2019-07-20 07:34:57
【问题描述】:

我的代码:

FDStoredProc1.StoredProcName := 'aaaaa' ;
with FDStoredProc1.Params do begin
  Clear;
  with Add do begin
    ParamType := ptInput;
    DataType := ftInteger;
  end;
end;  
FDStoredProc1.Params[0].Value := StrToint(edit1.Text) ;
edit1.Text := FDStoredProc1.ExecFunc() ;

我在 Oracle 中的代码:

create or replace FUNCTION AAAAA (pn number) RETURN VARCHAR2 AS 
BEGIN
  update dmnv set thuong = pn  ; 
  commit  ; 
  RETURN '3' 
END AAAAA;

运行时没有报错,但是在Oracle Server(版本12)上参数为NULL。所以函数是服务器上的exec,参数错误(真正的参数是edit1.text中的值)。我在edit1处输入了一个数字。

【问题讨论】:

  • 将 'aaaaa' 更改为 'AAAAA' 并重试。默认情况下,Oracle 数据库中的所有标识符都是大写的。祝你好运。
  • 不带引号的标识符不区分大小写,并被视为大写。所以这不重要,除非firedac会在存储的proc名称周围隐式添加引号,这很奇怪。

标签: oracle delphi firedac


【解决方案1】:

给参数一个名字。

  with Add do begin
    Name := 'pn';
    ParamType := ptInput;
    DataType := ftInteger;
  end;

【讨论】:

  • [FireDac][Phys][Ora]-338.Param [pn] 类型从 [ftMTBcd] 更改为 [ftInteger]。必须重新准备查询。可能的原因是分配给 TFDparam.AsXXX 属性隐式更改了参数数据类型。提示:使用 TFDParam.Value 或适当的 TFDParam.asXXX 属性。
【解决方案2】:
with FDQuery1.SQL do begin
    Clear;
    Add('begin');
    Add('  select  aaaaa(8) from dual ;');
    Add('end;');
 end;
 FDQuery1.ExecSQL;

也会出错。需要一个 INTO 子句

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 2019-10-19
    • 2013-04-20
    • 2012-10-20
    • 2011-08-06
    • 1970-01-01
    相关资源
    最近更新 更多