Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在oracle insert语句中为null然后为空的情况_Oracle_Triggers_Sql Insert_Isnull_Is Empty - Fatal编程技术网

在oracle insert语句中为null然后为空的情况

在oracle insert语句中为null然后为空的情况,oracle,triggers,sql-insert,isnull,is-empty,Oracle,Triggers,Sql Insert,Isnull,Is Empty,我正在编写触发器,如果parent\u key表中的值发生变化,我必须将值插入track表中。我必须检查该值是否为空,然后将其设置为空,否则将使用旧值,对于新值我必须执行相同的操作。我尝试了下面的case语句,但如果初始旧/新值为null,它不会插入到跟踪表中 create or replace TRIGGER parent_key_trg AFTER UPDATE ON parent_key FOR EACH ROW BEGIN IF NOT :old.track_name=:new

我正在编写触发器,如果
parent\u key
表中的值发生变化,我必须将值插入
track
表中。我必须检查该值是否为空,然后将其设置为空,否则将使用旧值,对于新值我必须执行相同的操作。我尝试了下面的case语句,但如果初始旧/新值为null,它不会插入到跟踪表中

create or replace TRIGGER parent_key_trg AFTER UPDATE ON parent_key
  FOR EACH ROW

BEGIN

IF NOT  :old.track_name=:new.track_name THEN
    INSERT INTO track  (TRACK_OLD_VALUE,TRACK_NEW_VALUE)
    VALUES (case when :old.track_name is null then '' else to_char(:old.track_name) end,case when :new.track_name is null then '' else to_char(:new.track_name) end);
  END IF;

END;

在oracle中,空字符串
'
null
完全相同

如果,您可以将
更改为以下内容:

IF Nvl(:old.track_name, 'NULL') <> Nvl(:new.track_name, 'NULL') THEN
如果Nvl(:old.track_name,'NULL')Nvl(:new.track_name,'NULL'),则

由于无法在oracle中比较
null=null

,因此空字符串
'
null
完全相同

如果
,您可以将
更改为以下内容:

IF Nvl(:old.track_name, 'NULL') <> Nvl(:new.track_name, 'NULL') THEN
如果Nvl(:old.track_name,'NULL')Nvl(:new.track_name,'NULL'),则

由于您无法比较
null=null

因此
null=null
not(null=null)
的比较结果为false,正如您可以从该语句中看到的那样

select case
         when null = null then
          'eq'
         when not (null = null) then
          'not eq'
         else
          '?'
       end
  from dual;
--> '?'
因此,在您的情况下,您应该通过
is
运算符比较
null

IF :old.track_name <> :new.track_name 
 OR :old.track_name is null and :new.track_name is not null 
 OR :old.track_name is not null and :new.track_name is null THEN    
IF:old.track\u name:new.track\u name
或者:old.track\u name为null,而:new.track\u name不为null
或者:old.track\u name不为null,而:new.track\u name则为null

case语句
case当:old.track\u name为null时,则不需要使用“else to\u char(:old.track\u name)end
,因为
null
'
是相同的。如果
null
值为空,您希望插入什么

null=null
not(null=null)
的比较结果为false,正如您可以从该语句中看到的那样

select case
         when null = null then
          'eq'
         when not (null = null) then
          'not eq'
         else
          '?'
       end
  from dual;
--> '?'
因此,在您的情况下,您应该通过
is
运算符比较
null

IF :old.track_name <> :new.track_name 
 OR :old.track_name is null and :new.track_name is not null 
 OR :old.track_name is not null and :new.track_name is null THEN    
IF:old.track\u name:new.track\u name
或者:old.track\u name为null,而:new.track\u name不为null
或者:old.track\u name不为null,而:new.track\u name则为null

case语句
case当:old.track\u name为null时,则不需要使用“else to\u char(:old.track\u name)end
,因为
null
'
是相同的。如果
null
值为空,您希望插入什么

但为什么我需要在IF语句中进行更改?因为在if语句中,我必须只检查旧值,而不等于新值,那么当语句中我进一步解释了它时,它就会出现。基本上,您不能比较
NULL=NULL
,您可以做
NULL=NULL
'literal'='literal'
,但不能做
NULL='literal'
NULL=NULL
。在SQL中查找空比较,但为什么需要在IF语句中进行更改?因为在if语句中,我必须只检查旧值,而不等于新值,那么当语句中我进一步解释了它时,它就会出现。基本上,您不能比较
NULL=NULL
,您可以做
NULL=NULL
'literal'='literal'
,但不能做
NULL='literal'
NULL=NULL
。在SQL中查找空比较,