1

在 Oracle 数据库中,我在一个包中有一些存储过程。当参数列表包含整数并且我尝试绑定 atSQLStoredProc并导航到正确的过程时,Param列表将参数列表中的整数显示为ftFMTBcd而不是ftInteger.

只要整数参数OUT在 Oracle 中声明,传输就可以了。

但是如果整数在IN列表中,我会ORA-05602在调用过程时得到。

原因似乎是在 Datasnap 服务器中将ftFMTBcd字段转换为整数只是失败,并且 Datasnap 服务器正在向 Oracle 发送一个空白字符串而不是整数或数字(参数列表IN INTEGERIN Number参数列表最终ftFMTBcd都以空白字符串结尾转移时)。

使用下表:

CREATE TABLE achristo_adm.paalogget(
paaloggetID       NUMBER(38, 0)    NOT NULL,
utstyrID          NUMBER(38, 0),
BrukerID          NUMBER(38, 0),
sist_paalogget    TIMESTAMP(6),
CONSTRAINT PK22 PRIMARY KEY (paaloggetID)
USING INDEX
    LOGGING)
LOGGING;

以及以下封装功能

PROCEDURE registrer_paalogget(
    FUTSTYRID       IN INTEGER,
    FBRUKERID       IN INTEGER,
    FSIST_PAALOGGET IN TIMESTAMP,
    fpaaloggetID OUT INTEGER) AS paaloggetC hl_recur_typ;
BEGIN
  OPEN paaloggetC FOR SELECT paaloggetID FROM paalogget WHERE utstyrID = FUTSTYRID;
  FETCH paaloggetC INTO fpaaloggetID;
  IF paaloggetC%notfound THEN
    fpaaloggetID := PAALOGGET_SEQ.NEXTVAL;
    INSERT
    INTO paalogget
      (
        paaloggetID,
        utstyrID,
        BrukerID,
        sist_paalogget
      )
      VALUES
      (
        fpaaloggetID,
        FUTSTYRID,
        FBRUKERID,
        FSIST_PAALOGGET
      );
    else
      update paalogget
        set 
          sist_paalogget=FSIST_PAALOGGET
      where
        utstyrID=FUTSTYRID;
  END IF;
EXCEPTION
WHEN OTHERS THEN
   raise_application_error(-20001,'An error was encountered in registrer_paalogget - '
       ||SQLCODE||' -ERROR- '||SQLERRM);
END registrer_paalogget;

这些在 Delphi-XE4 中会有同样的问题吗?(在 QC 中没有发现任何类似的东西)

如果在 Delphi-XE4 中仍然存在同样的问题,我必须在 QC 中输入 :-)

希望能够同时访问 Delphi XE4 (XE3) 和 Oracle XE 的人可以对此进行测试。

对我来说,可能的错误现在是一个阻碍。

添加在:

这个问题(我忘了标记为问题:-()是否会涉及?

https://stackoverflow.com/questions/17567604/is-there-something-essential-missing-or-wrong-in-this-datasnap-server-method

4

3 回答 3

1

问题解决了 !!

如果有人两次阅读包含的例程(或者可能三次:-),则应该触发了一个巨大的钟声,比自由钟大:-D

NUMBER(38, 0) 实际上是一个 128 位整数,在 32 位 Delphi 中不受支持。

解决方案是重新设计数据库以使用 BIGINT insted,在 Oracle 中使用与 RAD Studio Architect 捆绑的 ER-Studio Data Architect DE 将其声明为 NUMBER(19, 0)。

还应该实施一个关于不支持 128 位整数和字段转换为 ftFMTBCD 的新警告。

现在,为什么在 tSQLStoredProcedure 中更新具有 128 位整数的记录确实会失败,这也许是 Embarcadero 应该研究的。据我了解其他人,关于错误整数导出的相同错误消息,ORA-01722:tFDStoredProc 似乎也发生了无效数字。有关该问题的消息已发送给开发人员。

如果您在 ER/Studio 中对数据库模型进行建模并将字段声明为 INTEGER 而不是 BIGINT 或更低精度的整数并将模型与存储过程一起导出到 Oracle 数据库,则会出现问题。这将在原始 questin 中以 NUMBER(38, 0) 的形式结束。

于 2014-07-31T03:18:26.830 回答
1

如果您在本地计算机上安装 ORacle XE 11g 并且不安装最新的即时客户端并复制也存储在服务器目录中的文件,例如 oci.dll 等,那么罪魁祸首就存在。

所有 dll 文件必须是最新版本,而不是随服务器分发的版本。

整数、bcd 等和日期的传输都在原始服务器安装中失败。

于 2014-08-05T16:44:44.627 回答
0

一种解决方法(当然在长度上不可用)是重写所有过程以仅使用字符串而不是整数作为参数,并在调用原始过程之前使用 to_number

:-(

我这样做的方法是通过将_string添加到过程名称并将整数或数字参数转换为字符串来重命名接口过程,并在实现部分将字符串参数转换为数字并调用原始方法

于 2013-07-22T18:00:49.813 回答