编辑:看起来问题在occi::编号:我的bind变量是big number,所以我使用了最大的occi::Number可以得到- long double。我做了一个测试,得到了这个问题:
我把1260365696006放在occi::Number中,并将其打印为(无符号长),得到1260365696005 ==>不同的数字!!
你知道吗?
long double ld1 = (long double)1260365696006;
oracle::occi::Number num2(ld1);
LOG("num2=%.9Lf num2(unsigned long)=%ld", (long double)num2, (unsigned long)num2);
results are:
num2=1260365696006.000000000 num2(unsigned long)=1260365696005
字符串
原问题:
我在linux上使用occi 21版本。我将使用表中的最大值运行下一个查询,因此我希望不会得到任何结果。但是我得到了具有该值的行。
select * from CacheMessages where message_id > $message_id_p order by message_id, message_number"
型
当我在另一个表上运行时,我得到正确的结果(没有结果):
select * from Bank where bank_obj_num > $bank_obj_num
型
'>'返回'>='的原因是什么?
1.不存在舍入问题(均为整数值)。
1.没有太多的记录(3500)。
1.这两个查询的参数类型都是int 64(~ 1,260,364,000,000)。
1.此表有一个由触发器填充的字段。(不是“where”字段)。* CacheMessages * 表结构为:
CREATE TABLE "CACHE_MESSAGES"
( "MESSAGE_OBJ_NUM" NUMBER NOT NULL ENABLE,
"MESSAGE_TIME" DATE,
"MESSAGE_NUMBER" NUMBER,
"MESSAGE_ID" NUMBER,
"SERIAL_ID" NUMBER,
"MESSAGE" VARCHAR2(4000 CHAR),
CONSTRAINT "CACHE_MESSAGES_PK" PRIMARY KEY ("MESSAGE_OBJ_NUM", "MESSAGE_TIME")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) LOCAL
(PARTITION "CACHE_MESSAGES_MAXV"
PCTFREE 10 INITRANS 2 MAXTRANS 255 LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "TBS_RNDSAN65" ) ENABLE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "TBS_RNDSAN65"
PARTITION BY RANGE ("MESSAGE_TIME")
(PARTITION "CACHE_MESSAGES_MAXV" VALUES LESS THAN (MAXVALUE) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 8388608 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "TBS_RNDSAN65" ) ;
CREATE INDEX "CACHE_MESSAGES_IND_01" ON "CACHE_MESSAGES" ("SERIAL_ID")
PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) LOCAL
(PARTITION "CACHE_MESSAGES_MAXV"
PCTFREE 10 INITRANS 2 MAXTRANS 255 LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "TBS_RNDSAN65" ) ;
CREATE OR REPLACE TRIGGER "CACHE_MESSAGES_SERIAL_TRG"
BEFORE INSERT OR UPDATE
ON CACHE_MESSAGES
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
iCounter cache_messages.serial_id%TYPE;
cannot_change_counter EXCEPTION;
BEGIN
IF INSERTING THEN
Select cache_messages_serial_seq.NEXTVAL INTO iCounter FROM Dual;
:new.serial_id := iCounter;
END IF;
IF UPDATING THEN
IF NOT (:new.serial_id = :old.serial_id) THEN
RAISE cannot_change_counter;
END IF;
END IF;
EXCEPTION
WHEN cannot_change_counter THEN
raise_application_error(-20000, 'Cannot Change Counter Value');
END;
型
1条答案
按热度按时间0ejtzxu11#
谢谢你。没有什么是相关的:-(我通过使用不同类型的变量解决了我的问题。它被定义为long long(OCCI不支持),所以幸运的是,我发现我可以使用'long'。这对我来说已经足够了(该系统最初是为32个系统而构建的)。因此,现在将正确的值移动到OCCI没有问题。顺便说一句,当试图打印我发送给OCCI的值时,它返回给我5.999999999而不是6(我发送给他的是long double(OCCI::Number))。- 谢谢-谢谢