我在编写SQL Update语句时遇到问题,我需要在其中使用空字符串更新非null字段。
UPDATE channel_mgmt.channels
SET registered_address_id=p_address_id
,vendor_id=p_spc_code
WHERE id=v_channel_id;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,可以将p_spc_code设置为”,并且在运行此命令时我遇到了SQL错误:
Error report:
ORA-01407: cannot update ("CHANNEL_MGMT"."CHANNELS"."VENDOR_ID") to NULL
ORA-06512: at line 8973
01407. 00000 - "cannot update (%s) to NULL"
*Cause:
*Action:
Run Code Online (Sandbox Code Playgroud)
有什么想法可以解决这个问题吗?在某些情况下,我需要使用空字符串,但是我不确定为什么oracle在抱怨空值。
desc channel_mgmt.channels
Name Null Type
--------------------- -------- ------------------
ID NOT NULL NUMBER(16)
CHANNEL_STATUS_KEY NOT NULL VARCHAR2(64 CHAR)
REGISTERED_ADDRESS_ID NOT NULL NUMBER(16)
VENDOR_ID NOT NULL VARCHAR2(64 CHAR)
Run Code Online (Sandbox Code Playgroud)
如果NOT NULL在列上定义了约束,则不能通过将null零长度string('')指定为列的新值来更新表。Oracle将零长度的字符串(''分配给varchar2列或变量时)视为NULL,因此从oracle的角度来看,这两个语句与set col_name = null和相同set col_name = ''。如果要允许列接受NULLs,则需要从该列中移除不为null的约束(如果它会造成任何危害):
alter table <<table_name>> modify (<<column_name>> [<<data type>>] null)
Run Code Online (Sandbox Code Playgroud)
您是否尝试过使用' '(其中包含一个空格的字符串)?如果是 varchar,我相信比较(对于大多数情况,即您没有指定比较白色字符)会按预期工作。
我的意思是' ' = ' '(单个和双空白)应该评估为true字段varchar。
(我没有 Oracle 实例,所以我不能确定......)