【问题标题】:FireDAC could not handle parameter names longer than 30 charsFireDAC 无法处理超过 30 个字符的参数名称
【发布时间】:2021-05-05 14:55:26
【问题描述】:

我使用 Oracle 数据库版本 19.3.0,它可以处理超过 30 个字符的参数名称。如果我在 Delphi FireDAC 过程“ExecProc”中执行以调用 SQL 中的存储过程,Delphi 会抛出“ORA-01036:非法变量名称/编号”异常并且该过程的调用过早终止,因为一个参数名称长于 30 个字符。 是否有一些 FireDAC 属性可以在不更改参数名称长度的情况下更改此行为?

“C:\Program Files (x86)\Embarcadero\Studio\19.0\source\data\firedac\FireDAC.Phys.Oracle.pas”

【问题讨论】:

  • ORA-01036 : illegal Variable name/number 来自 Oracle 而不是 Delphi。通常是因为尝试在不使用 EXECUTE IMMEDIATE 的情况下进行 DDL。
  • 你知道Oracle的“兼容”参数设置成什么吗?
  • 运行 select * from database_compatible_level; 如果结果级别为 12.2 或更高,那么您的数据库支持 128 字节的变量名称。不幸的是,许多 DBA 都不愿意设置它(尽管是默认设置)。注意:这并不像看起来那么遥远。 Oracle 改变了分配版本号的方式,从 12x 直接变为 18x。
  • 兼容级别没有问题,compatible=19.0.0。我在 FireDAC.Phys.Oracle 单元中发现了一个 if 语句,如果长度大于 30 个字符,则参数名称长度会缩短(见上文)。我不明白为什么 FireDAC 不使用 128 个字符。
  • 该代码仍在 10.4.2 中。看起来 Firedac 尚未更新以完全支持更长的名称,正如已经提到的 Oracle 12.2 附带的(大约 2017/2018 时间框架)。

标签: sql oracle delphi firedac


【解决方案1】:

解决方案:将 pbByName 更改为 pbByNumber

procedure TForm5.Button1Click(Sender: TObject); begin
FDStoredProc1.ParamBindMode := pbByNumber;
FDStoredProc1.FetchOptions.Items := [fiBlobs, fiDetails]; //This disables automatic fetching of parameters from server
FDStoredProc1.Params.CreateParam(ftString,'Averylongparamternamethathopefullyislongerthanthirtycharacters',ptInput);
FDStoredProc1.params.CreateParam(ftString,'outparam',ptOutput);
FDStoredProc1.Params[0].AsString := 'Hello World';  

FDStoredProc1.ExecProc; 

ShowMessage(FDStoredProc1.Params[1].AsString);
end;

【讨论】:

  • 最好使用代码块而不是图像。
  • 好的,我已经改了:)谢谢
猜你喜欢
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 2018-10-24
  • 2011-05-15
  • 2011-06-28
  • 2020-07-21
  • 1970-01-01
相关资源
最近更新 更多