5

null 以外のフィールドを空の文字列で更新する必要がある SQL Update ステートメントの作成に問題があります。

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:

これを回避する方法はありますか?場合によっては空の文字列を使用する必要がありますが、オラクルが null 値について不平を言っている理由がわかりません。

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

5 に答える 5

0

NOT NULL 列があり、それを NULL に更新する場合は、アプリケーションのロジックについて考える必要があるかもしれません。それ以外の場合は、たとえば '???' のように nvl(column, some_pattern) を定義できます。(もちろん、列の長さに応じて)不明な空のデータの場合、NULLの挿入/更新が許可されていないことがわかっている場合。

何かが正しく動作していないかどうかを確認したり、ビューまたは何かでその 3 つの疑問符をフィルター処理して再度 NULL として表示したりするためにチェックする必要があるよりも。

于 2013-10-07T07:09:21.933 に答える
0

IDがnullではなく、nullにしたい場合は、すべてのテーブル行をバックアップとして別のテーブルに挿入してから、テーブルを削除して、null可能なID行で再度作成し、バックアップから行を再度挿入することができますあなたの主キーとしてのあなたのIDは再びnullではありません

別の方法は、更新のように ' ' を使用することで、スペースだけを返しますが、null ではありません

CREATE TABLE BACKUP(
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                             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 YourTable (SELECT * FROM BACKUP);

そして今あなたのクエリを使用してください

于 2013-10-07T08:31:12.923 に答える