oracle OCCI - SQL执行>=而不是>

but5z9lq  于 2023-08-04  发布在  Oracle
关注(0)|答案(1)|浏览(100)

编辑:看起来问题在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;

0ejtzxu1

0ejtzxu11#

谢谢你。没有什么是相关的:-(我通过使用不同类型的变量解决了我的问题。它被定义为long long(OCCI不支持),所以幸运的是,我发现我可以使用'long'。这对我来说已经足够了(该系统最初是为32个系统而构建的)。因此,现在将正确的值移动到OCCI没有问题。顺便说一句,当试图打印我发送给OCCI的值时,它返回给我5.999999999而不是6(我发送给他的是long double(OCCI::Number))。- 谢谢-谢谢

相关问题