oracle 触发器number判断空值,:NEW赋值,for each row,sql变量引号,to_date,to_char

1.number类型在库中可能存在null这种数据

  判断是否为空时要用如下:

  IF(nvl(:NEW.BACAH,0) <>0)

 不能用IF(BACAH IS NOT NULL)

2.

  2.1 、取值时,需要到:NEW中取,有时也要到:OLD中取,具体情况具体分析

         赋值如红色

         1.SELECT B38_CODE INTO code FROM TEMP WHERE BAC_BACAW=:NEW.BACAW AND BAC_BACAE=:NEW.BACAE;

          变量赋值

          2.temp:==:NEW.BACAE

  2.2、 FOR EACH ROW代表一条一条数据执行

      create or replace TRIGGER TR_BAC
      BEFORE  INSERT OR UPDATE
      ON BAC_BACK
      FOR EACH ROW
      DECLARE

3. sql语句放入变量中,并执行,注意引号的运用

sql_temp := 'UPDATE b38_back SET '||code||'='||:NEW.BACAH || ' WHERE B0110= '''||:NEW.B0110||''' AND  TO_CHAR (B38Z0,''YYYYMM'') = TO_CHAR(TO_DATE('''||:NEW.BACZ0||'''),''YYYY'')||''01''';    

execute immediate sql_temp;

number型一个引号,varchar2三个引号,看例子分析一下,很简单,为啥yyyymm是俩个引号,因为时间执行的sql时yyyy要放入到’yyyy‘中,所以俩个引号,同理'''||:NEW.B0110||'''也要是’1000‘,这种格式,第一个引号与前面的引号相连,后面俩个空1000左右俩个引号

4.  TO_CHAR 与   TO_DATE的使用,如3,

TO_CHAR (B38Z0,''YYYYMM'') = TO_CHAR(TO_DATE('''||:NEW.BACZ0||'''),''YYYY'')||''01''';  

注意如下: 要将变量转为date类型,不然会出现to_char('01-1月-15',‘yyyy’)出错

posted on 2015-12-03 00:21  struggle_beiJing  阅读(1897)  评论(0编辑  收藏  举报

导航