首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Oracle 11g导入存储过程时,Delphi XE2中的tSQLStoredProc出错?

从Oracle 11g导入存储过程时,Delphi XE2中的tSQLStoredProc出错?
EN

Stack Overflow用户
提问于 2013-07-09 19:18:00
回答 3查看 765关注 0票数 1

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

只要整数参数在Oracle中声明为OUT,传输就可以正常进行。

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

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

使用下表:

代码语言:javascript
复制
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;

和下面的包函数

代码语言:javascript
复制
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的人可以测试一下。

对我来说,可能的错误是现在的显示停止。

加载项:

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-06 00:44:45

如果您在本地计算机上安装了ORacle XE 11g,但没有安装最新的即时客户端并复制存储在服务器目录中的文件(如oci.dll等),则罪魁祸首就存在。

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

对于原始服务器安装,整数、bcd等和日期的传输都会失败。

票数 1
EN

Stack Overflow用户

发布于 2014-07-31 11:18:27

问题解决了!

如果任何人正在阅读包含的例程两次(或者可能三次:-),应该已经触发了一个巨大的钟,比Liberty bell :-D更大

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

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

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

现在,为什么在tSQLStoredProcedure中更新具有128位整数的记录会失败,这可能是Embarcadero应该研究的问题。据我所知,关于错误整数导出的错误消息ORA-01722: invalid number似乎也会在tFDStoredProc中出现。已经向开发人员发送了有关该问题的消息。

如果您在ER/Studio中对数据库模型建模,并将字段声明为整数而不是BIGINT或更低精度的整数,然后将带有存储过程的模型导出到Oracle数据库,则会出现问题。这将在原始问题中作为数字(38,0)结束为shpwn。

票数 1
EN

Stack Overflow用户

发布于 2013-07-23 02:00:50

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

:-(

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17546873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档