2013-10-06 65 views
3

我遇到了編寫SQL更新語句的問題,其中需要使用空字符串更新非空字段。Oracle SQL使用空字符串更新非空列

UPDATE channel_mgmt.channels 
    SET registered_address_id=p_address_id 
     ,vendor_id=p_spc_code 
    WHERE id=v_channel_id; 

在這種情況下,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: 

任何想法如何,我可以解決這個問題?我需要使用空字符串的一些情況,但我不確定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) 

回答

4

您是否嘗試過(在這串一個空格),使用' '?如果varchar,比我認爲比較(大多數情況下,即你沒有指定比較白色字符)按預期工作。

我的意思是' ' = ' '(單個和雙空白)的varchar字段應計算爲true

(我沒有甲骨文的一個實例,所以我不能肯定......)

+0

這是行得通的,不知道爲什麼我沒有早點想到它,只是試圖將事情複雜化:( –

3

Oracle無法區分空字符串和空值。它使用相同的標記(一個字節爲零)。

+0

好吧,但是oracle如何讓插入語句在這種情況下工作?如果我做一個插入,我可以將列中的值設置爲'',我想複製這是一個更新陳述 –

4

如果在列上定義了約束條件NOT NULL,則無法通過指定null或零長度字符串('')作爲列的新值來更新表。 Oracle將零長度字符串(分配給varchar2列或變量時的'')視爲NULL,所以從的角度來看,這兩個語句與set col_name = nullset col_name = ''相同。如果你想允許列接受NULL是你需要的,如果它贏得做任何傷害從該列中刪除NOT NULL約束:

alter table <<table_name>> modify (<<column_name>> [<<data type>>] null) 
+0

不幸的是我不能更新表..是否有可能檢查到插入語句和如果null將列更新爲''?作爲小騙子 –

+0

不,因爲Oracle無法區分NULL和空字符串之間的區別。禁止NULL的相同約束將禁止空字符串。您將要得到的最接近的是將其設置爲包含單個空白的字符串。 –

0

如果你有一個NOT NULL列,你去更新它NULL,也許你需要思考的問題你的應用程序中的邏輯。 否則,你可以定義一個nvl(column,some_pattern)例如'???' (當然取決於列的長度),當你知道你不允許插入/更新NULL時,會出現未知的空數據。

比你有東西要檢查,看看是否有什麼行爲不正確或過濾視圖或其他東西的三個問號,並再次顯示爲NULL。

0

您的ID不爲空,並且您希望將其設爲空 您可以將所有錶行作爲備份插入到另一個表中,然後刪除您的表並使用空能夠標識的行再次創建它並從備份中再次插入行 只是關心你用你的ID作爲主鍵將不會空再次

另一種方法是使用「」作爲您的更新,並返回只是空間,但它不是空

CREATE TABLE備份( 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));

INSERT INTO BACKUP(SELECT * FROM YourTable);

ALTER TABLE YourTable( ID號碼(16),
CHANNEL_STATUS_KEY NOT NULL VARCHAR2(64 CHAR),
REGISTERED_ADDRESS_ID NOT NULL NUMBER(16),
VENDOR_ID NOT NULL VARCHAR2(64 CHAR));

INSERT INTO YourTable(SELECT * FROM BACKUP);

現在使用您的查詢