在Oracle数据库中,我在一个包中有一些存储过程。当参数列表包含整数,并且我尝试绑定tSQLStoredProc并导航到正确的过程时,Param列表将参数列表中的整数显示为ftFMTBcd而不是ftInteger。
只要整数参数在Oracle中声明为OUT,传输就可以正常进行。
但是,如果整数在IN列表中,则在调用该过程时会得到ORA-05602。
原因似乎是Datasnap服务器将ftFMTBcd字段转换为整数失败,并且Datasnap服务器向Oracle发送空字符串,而不是整数或数字(参数列表中的IN INTEGER和IN 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的人可以测试一下。
对我来说,可能的错误是现在的显示停止。
加载项:
这个问题(我忘了标记为问题:-( ))会涉及到吗?
发布于 2014-08-06 00:44:45
如果您在本地计算机上安装了ORacle XE 11g,但没有安装最新的即时客户端并复制存储在服务器目录中的文件(如oci.dll等),则罪魁祸首就存在。
所有dll文件必须是最新版本,而不是随服务器一起分发的文件。
对于原始服务器安装,整数、bcd等和日期的传输都会失败。
发布于 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。
发布于 2013-07-23 02:00:50
一种变通方法(长度当然不可用)是重写所有过程,使其仅使用字符串而不是整数作为参数,并在调用原始过程之前使用to_number
:-(
我的方法是通过在过程名中添加_string来重命名接口过程,并将integer或number参数转换为字符串,并在实现部分将字符串参数转换为数字并调用原始方法
https://stackoverflow.com/questions/17546873
复制相似问题