Oracle合并查询中的数字限制为9位?

Oracle合并查询中的数字限制为9位?,oracle,oracle-sqldeveloper,Oracle,Oracle Sqldeveloper,我试图在oracle db(11g)中使用带参数的合并查询。我遇到了一个困扰我的问题。当我对会话\u ID使用大于9位的数字运行查询时,将不发生匹配,并创建一个会话\u ID设置为0的新行 表: CREATE TABLE CLASSES ("SESSION_ID" NUMBER(19,0), "CLASS_NAME" NCHAR(255)) 此查询适用于会话ID的任意位数(最多19位): MERGE INTO CLASSES db USING (select 22507410978 AS SE

我试图在oracle db(11g)中使用带参数的合并查询。我遇到了一个困扰我的问题。当我对会话\u ID使用大于9位的数字运行查询时,将不发生匹配,并创建一个会话\u ID设置为0的新行

表:

CREATE TABLE CLASSES ("SESSION_ID" NUMBER(19,0), "CLASS_NAME" NCHAR(255))
此查询适用于会话ID的任意位数(最多19位):

MERGE INTO CLASSES db
USING (select 22507410978 AS SESSION_ID from dual) geo
ON (geo.SESSION_ID = db.SESSION_ID)
WHEN MATCHED THEN
UPDATE SET db.CLASS_NAME = 'My Class Name'
WHEN NOT MATCHED THEN
INSERT (db.SESSION_ID, db.CLASS_NAME) VALUES (22507410978, 'My Class Name');
此查询适用于任意数字,最多9位。在9位数字之后,会话ID设置为0。(我正在使用SQL Developer进行测试,并通过ENTER BIND对话框输入SESSION_ID和CLASS_NAME的值

MERGE INTO CLASSES db
USING (select :session_id AS SESSION_ID from dual) geo
ON (geo.SESSION_ID = db.SESSION_ID)
WHEN MATCHED THEN UPDATE SET db.CLASS_NAME = :class_name
WHEN NOT MATCHED THEN
INSERT (db.SESSION_ID, db.CLASS_NAME) VALUES (:session_id, :class_name);
因此,该值适用于会话_ID(2250741091),但不适用于会话_ID(22507410911)


有什么想法吗?

问题与您试图执行
merge
语句的事实无关。但在使用
Enter binds
对话框时,Oracle SQL Developer绑定数字变量的方式似乎存在限制(bug?)

似乎当您为绑定变量键入值时,它会尝试聪明地确定您输入的值的数据类型。如果它检测到一个数字,它会尝试将其绑定为4字节有符号整数值。但是,如果您的数字对于4字节有符号整数值来说太大(小于
-1147483648
,或大于
1147483647
),绑定失败,并将默认值设置为
0
(我不知道我在本段中描述的内容是否都是事实,但测试表明必须按照这些思路进行)

<> >为了避免SQL开发中的“Bugy”行为,请考虑绕过<代码>输入绑定对话框,完全定义和设置绑定变量值作为脚本的一部分。

例如,如果在SQL Developer中运行以下命令,则不会提示您输入绑定值,您会发现插入的值是正确的:

var session_id number
var class_name nchar(255)
begin
  :session_id := 22507410978;
  :class_name := 'My Class Name';

  MERGE INTO CLASSES db
  USING (select :session_id AS SESSION_ID from dual) geo
  ON (geo.SESSION_ID = db.SESSION_ID)
  WHEN MATCHED THEN UPDATE SET db.CLASS_NAME = :class_name
  WHEN NOT MATCHED THEN
  INSERT (db.SESSION_ID, db.CLASS_NAME) VALUES (:session_id, :class_name);
end;
/
编辑

David Aldridge提出了一个有趣的想法,即输入绑定值作为文本值,然后让SQL将其转换回数字,方法是如下更改SQL:

to_number(:session_id)
不幸的是,
Enter Binds
对话框不允许您在输入值时指定数据类型。因此,即使SQL语句需要字符串值,当您在提示符中键入
22507410978
时,它也会检测到输入的值看起来像一个数字,并尝试转换该值(错误地)转换为4字节有符号整数,结果仍然是
0

更进一步说,这实际上意味着绑定到
nchar
列的
:class\u name
绑定变量也可能在键入非常大的数字时中断。如果您尝试原始测试,并在提示输入
:class\u name
值时键入
22507410978
,您将看到字符ter
0
插入到
class\u name
列中


根据我的观察,如果我是您,我会尽可能远离
输入绑定
对话框。

我尝试了您的代码,但没有得到该行为。“此值适用于会话ID(2250741091)”:这是10位数字。我想你说过只能增加到9位。你是对的,它是10位,而不是9位。任何超过10位的数字都会插入一个0。但是问题是一样的。如果你不通过SQL Developer绑定变量设置值呢?嗯,很有趣。我将删除我的建议。希望这将在SQLDeveloper中得到修复R