linux的计划任务操作

1.cron服务来设置

计划任务查看与设置命令:crontab

包括条目:

分钟m:0-59

小时h:0-23

月日dom:1-31

月份mon:1-12

星期dow:0-7

例子:

每隔2小时处理一个文件用:*/2

1,3,5,7,9 点间隔执行

0-4,8-12点执行

或者是*/2每隔2个小时备份文件或执行数据库操作

下面是工作中用到的sell脚本:

0 1 * * * /home/oracle/psql-jobs.sh
*/1 * * * * /usr/bin/curl http://127.0.0.1:60030/admin/serpro/qianzhangcron >/dev/null 2>&1

  0 5 * * * /home/oracle/xbin-1.0.0/autolog.sh

 
#password stored in ~/.pgpass
#psql -w -U acc_user -h localhost -d Factoring -c "select acc_user.p_loop_count_sheet()"
psql -w -U acc_user Factoring -c "select acc_user.p_loop_count_sheet()"

 

 

案例:输入命令 打开任务编辑器

crontab -e

可以看到

# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# For more information see the manual pages of crontab(5) and cron(8)
# m h dom mon dow command 这样的格式

我们每5分钟把 /home/myfile 路径下的文件打包一次放到 /home/rar 目录下

我们就可以这样写:

*/5 * * * * tar czf /home/rar/myfile.tgz /home/myfile/*

然后重启服务:

daokr@DK:~/rar$ sudo service cron restart 
[sudo] daokr 的密码:

 利用stat 命令查看文件时间更新时间看是否已经执行成功

daokr@DK:~/rar$ stat myfile.tgz 
  文件:'myfile.tgz'
  大小:128           块:8          IO 块:4096   普通文件
设备:801h/2049d    Inode:530109      硬链接:1
权限:(0664/-rw-rw-r--)  Uid:( 1000/   daokr)   Gid:( 1000/   daokr)
最近访问:2018-03-29 23:15:21.837168254 +0800
最近更改:2018-03-29 23:17:01.897642845 +0800
最近改动:2018-03-29 23:17:01.897642845 +0800

 

crontab -l 查看任务

crontab -r 删除任务

工作中用到的计划任务

 

 

CREATE OR REPLACE FUNCTION "acc_user"."p_loop_count_sheet"(inccy varchar='CNY'::character varying)
  RETURNS "pg_catalog"."void" AS $BODY$
  declare
    --v_ccy     VARCHAR(100);
    --v_rate    VARCHAR(100);
    v_code    numeric;
    v_errm    VARCHAR(256);
    v_count   VARCHAR(1);
    v_s_count VARCHAR(20);
    v_a_count VARCHAR(20);
    v_b_count VARCHAR(20);
    v_c_count VARCHAR(20);
    v_d_count VARCHAR(20);
  
  BEGIN

  raise notice 'begin  call p_count_sheet1';

      INSERT INTO t_errors
        (code, MESSAGE, PRO_NAME, RUN_DATE)
      VALUES
        (0, 'run', 'p_loop_count_sheet', now());
  
    perform p_count_sheet1('CNY','1');
  
  raise notice 'begin  insert into acc_user.t_acc_general_ledger_ac_his';
  
    insert into acc_user.t_acc_general_ledger_ac_his
      (br_no, gl_code, d_curr_amt, c_curr_amt, d_count, c_count)
      WITH path1 AS
       (SELECT ent_id as agent_id,
               parent_ent_id as parent_id,
               SYS_CONNECT_BY_PATH(ent_id, ',') p_child
          FROM crm_user.t_enterprise
        CONNECT BY ent_id = PRIOR parent_ent_id),
      allpath AS
       (SELECT agent_id,
               SUBSTR(string_agg(p_child,','), 1, 4000) all_c_p
          FROM path1
         GROUP BY agent_id),
      trade1 AS
       (SELECT BR_NO,
               GL_CODE,
               AC_DATE,
               d_curr_amt,
               c_curr_amt,
               d_count,
               c_count
          FROM acc_user.t_acc_general_ledger_his_temp
         WHERE (ac_date) = trunc(now() - 1))
      SELECT allpath.agent_id,
             trade1.GL_CODE,
             SUM(DECODE(instr(all_c_p, trade1.BR_NO),0,0,nvl(d_curr_amt,  0))) d_curr_amt_sum,
             SUM(DECODE(instr(all_c_p, trade1.BR_NO),0,0,nvl(c_curr_amt,  0))) c_curr_amt_sum,
             SUM(DECODE(instr(all_c_p, trade1.BR_NO),0,0,nvl(d_count,  0))) d_count_sum,
             SUM(DECODE(instr(all_c_p, trade1.BR_NO),0,0,nvl(c_count,  0))) c_count_sum
        FROM allpath                 
                inner join     trade1 on instr(all_c_p, trade1.BR_NO) > 0
       GROUP BY allpath.agent_id, trade1.GL_CODE;
  
    update t_acc_general_ledger_ac_his
       set seq_no  = t_acc_general_ledger_ac_his_seq_no_seq.nextval,
           ccy     = INCCY,
           ac_date = trunc(now() - 1)
     where ac_date is null;
  
    select count(*)
      into v_s_count
      from (select br_no,
                   sum(nvl(d_prev_bal,  0) +
                       nvl(d_curr_amt,  0) -
                       nvl(c_curr_amt,  0)) s_d,
                   sum(nvl(c_prev_bal,  0) +
                       nvl(c_curr_amt,  0) -
                       nvl(d_curr_amt,  0)) s_c
              from t_acc_general_ledger_ac_his
             where ac_date =  trunc(now() - 2)
             group by br_no)
     where s_d != s_c;
  
  raise notice 'v_s_count: %', v_s_count;

    if (v_s_count = '0') then

      raise notice 'begin update  t_acc_general_ledger_ac_his -79';

      update t_acc_general_ledger_ac_his t2
         set t2.d_prev_bal =
             (with kk as (select br_no,
                                 gl_code,
                                 ac_date,
                                 lag(d_curr_bal::bigint, 1,0::bigint) over(partition by br_no, gl_code order by ac_date) d_prev_bal_next
                            from t_acc_general_ledger_ac_his)
               select kk.d_prev_bal_next
                 from kk
                where kk.br_no = t2.br_no
                  and kk.gl_code = t2.gl_code
                  and kk.ac_date = t2.ac_date)
                where ac_date = trunc(now() - 1);
    
      raise notice 'begin update  t_acc_general_ledger_ac_his -95';

      update t_acc_general_ledger_ac_his t2
         set t2.c_prev_bal =
             (with kk as (select br_no,
                                 gl_code,
                                 ac_date,
                                 lag(c_curr_bal::bigint, 1,0::bigint) over(partition by br_no, gl_code order by ac_date) c_prev_bal_next
                            from t_acc_general_ledger_ac_his)
               select kk.c_prev_bal_next
                 from kk
                where kk.br_no = t2.br_no
                  and kk.gl_code = t2.gl_code
                  and kk.ac_date = t2.ac_date)
                where ac_date = trunc(now() - 1);
    
      raise notice 'begin update  t_acc_general_ledger_ac_his -111';

      update t_acc_general_ledger_ac_his t2
         set d_curr_bal =
             (with kk as (SELECT br_no,
                                 t1.gl_code,
                                 debit_credit,
                                 t1.ac_date,
                                 CASE
                                   WHEN debit_credit = 'D' THEN
                                    nvl(d_prev_bal,  0) +
                                    nvl(d_curr_amt,  0) -
                                    nvl(c_curr_amt,  0)
                                 
                                   WHEN debit_credit = 'C' THEN
                                    nvl(c_prev_bal,  0) +
                                    nvl(c_curr_amt,  0) -
                                    nvl(d_curr_amt,  0)
                                 
                                   WHEN debit_credit = 'B' AND
                                        nvl(d_prev_bal, 0) = 0 and
                                        nvl(c_prev_bal, 0) = 0 and
                                        (d_curr_amt - c_curr_amt) > 0 THEN
                                    abs(nvl(d_curr_amt,0) -
                                        nvl(c_curr_amt,0))
                                 
                                   when debit_credit = 'B' and
                                        nvl(d_prev_bal,  0) > 0 and
                                        (d_prev_bal + d_curr_amt -
                                        nvl(c_curr_amt,  0)) > 0 then
                                    abs(d_prev_bal + d_curr_amt -
                                        nvl(c_curr_amt,  0))
                                 
                                   when debit_credit = 'B' and
                                        nvl(c_prev_bal,  0) > 0 and
                                        (c_prev_bal + c_curr_amt -
                                        nvl(d_curr_amt,  0)) < 0 then
                                    abs(c_prev_bal + c_curr_amt -
                                        nvl(d_curr_amt,  0))
                                 
                                 --ELSE abs(c_prev_bal+c_curr_amt-nvl(d_curr_amt,d_curr_amt,0))
                                 END curr_bal
                            FROM t_acc_general_ledger_ac_his t1,
                                 t_acc_subject
                           WHERE t1.gl_code = t_acc_subject.gl_code
                             and ac_date = trunc(now() - 1))
               select decode(kk.debit_credit,
                             'D',
                             kk.curr_bal,
                             'B',
                             kk.curr_bal,
                             0)
                 from kk
                where kk.br_no = t2.br_no
                  and kk.gl_code = t2.gl_code
                  and kk.ac_date = t2.ac_date
                  and t2.ac_date = trunc(now() - 1))
                where ac_date = trunc(now() - 1);
      
      
      raise notice 'update t_acc_general_ledger_ac_his';
    
      update t_acc_general_ledger_ac_his t2
         set c_curr_bal =
             (with kk as (SELECT br_no,
                                 t1.gl_code,
                                 debit_credit,
                                 t1.ac_date,
                                 CASE
                                   WHEN debit_credit = 'D' THEN
                                    nvl(d_prev_bal,0) +
                                    nvl(d_curr_amt,0) -
                                    nvl(c_curr_amt,0)
                                 
                                   WHEN debit_credit = 'C' THEN
                                    nvl(c_prev_bal,  0) +
                                    nvl(c_curr_amt,  0) -
                                    nvl(d_curr_amt,  0)
                                 
                                   WHEN debit_credit = 'B' AND
                                        nvl(d_prev_bal, 0) = 0 and
                                        nvl(c_prev_bal, 0) = 0 and
                                        (d_curr_amt - c_curr_amt) < 0 THEN
                                    abs(nvl(d_curr_amt,  0) -
                                        nvl(c_curr_amt,  0))
                                 
                                   when debit_credit = 'B' and
                                        nvl(c_prev_bal, 0) > 0 and
                                        (c_prev_bal + c_curr_amt -
                                        nvl(d_curr_amt, 0)) > 0 then
                                    abs(c_prev_bal + c_curr_amt -
                                        nvl(d_curr_amt, 0))
                                 
                                   when debit_credit = 'B' and
                                        nvl(d_prev_bal,  0) > 0 and
                                        (d_prev_bal + d_curr_amt -
                                        nvl(c_curr_amt,  0)) < 0 then
                                    abs(d_prev_bal + d_curr_amt -
                                        nvl(c_curr_amt,  0))
                                 
                                 --ELSE abs(c_prev_bal+c_curr_amt-nvl(d_curr_amt,d_curr_amt,0))
                                 END curr_bal
                            FROM t_acc_general_ledger_ac_his t1,
                                 t_acc_subject
                           WHERE t1.gl_code = t_acc_subject.gl_code
                             and ac_date = trunc(now() - 1))
               select decode(kk.debit_credit,
                             'C',
                             kk.curr_bal,
                             'B',
                             kk.curr_bal,
                             0)
                 from kk
                where kk.br_no = t2.br_no
                  and kk.gl_code = t2.gl_code
                  and kk.ac_date = t2.ac_date
                  and t2.ac_date =  trunc(now() - 1)) 
                where ac_date =  trunc(now() - 1);
    
      select count(*)
        into v_count
        from t_acc_general_ledger_ac_his
       where 1=1
         and ac_date = trunc(now() - 1);

      raise notice 'v_count: %',v_count;

      if (v_count > 0) then
        select count(*)
          into v_d_count
          from t_acc_general_ledger_ac_his
         where 1=1
           and d_prev_bal > '0'
           and ac_date = trunc(now() - 1);
        select count(*)
          into v_c_count
          from t_acc_general_ledger_ac_his
         where 1=1
           and c_prev_bal > '0'
           and ac_date = trunc(now() - 1);
        select count(*)
          into v_b_count
          from t_acc_general_ledger_ac_his
         where 1=1
           and ac_date = trunc(now() - 1)
           and (d_prev_bal is null or d_prev_bal = '0')
           and (c_prev_bal is null or c_prev_bal = '0')
           and cast (d_curr_amt as numeric ) > cast (c_curr_amt as numeric);
        select count(*)
          into v_a_count
          from t_acc_general_ledger_ac_his
         where 1=1
           and ac_date = trunc(now() - 1)
           and (d_prev_bal is null or d_prev_bal = '0')
           and (c_prev_bal is null or c_prev_bal = '0')
           and cast(d_curr_amt  as numeric) < cast (c_curr_amt  as numeric);
        if v_d_count > 0 then
          update t_acc_general_ledger_ac_his
             set d_curr_bal =
                 (with kk as (select br_no,
                                     gl_code,
                                     d_prev_bal,
                                     c_prev_bal,
                                     ac_date,
                                     curr_bal
                                from (SELECT br_no,
                                             gl_code,
                                             ac_date,
                                             d_prev_bal,
                                             c_prev_bal,
                                             CASE
                                               WHEN c_prev_bal > '0' THEN
                                                nvl(c_prev_bal, 0) +
                                                nvl(c_curr_amt, 0) -
                                                nvl(d_curr_amt, 0)
                                               when d_prev_bal > '0' then
                                                nvl(d_prev_bal,  0) +
                                                nvl(d_curr_amt,  0) -
                                                nvl(c_curr_amt,  0)
                                               ELSE
                                                nvl(d_curr_amt,  0) -
                                                nvl(c_curr_amt,  0)
                                             END curr_bal
                                        FROM t_acc_general_ledger_ac_his
                                       WHERE ac_date = trunc(now() - 1)
                                         and 1=1)
                               where d_prev_bal > '0')
                   select decode(sign(curr_bal), 1, curr_bal, 0)
                     from kk
                    where t_acc_general_ledger_ac_his.br_no = kk.br_no
                      and t_acc_general_ledger_ac_his.gl_code = kk.gl_code)
                    where 1=1
                      and d_prev_bal > '0'
                      and ac_date = trunc(now() - 1);
        
        
          update t_acc_general_ledger_ac_his
             set c_curr_bal =
                 (with kk as (select br_no,
                                     gl_code,
                                     d_prev_bal,
                                     c_prev_bal,
                                     ac_date,
                                     curr_bal
                                from (SELECT br_no,
                                             gl_code,
                                             ac_date,
                                             d_prev_bal,
                                             c_prev_bal,
                                             CASE
                                               WHEN c_prev_bal > '0' THEN
                                                nvl(c_prev_bal,  0) +
                                                nvl(c_curr_amt,  0) -
                                                nvl(d_curr_amt,  0)
                                               when d_prev_bal > '0' then
                                                nvl(d_prev_bal,  0) +
                                                nvl(d_curr_amt,  0) -
                                                nvl(c_curr_amt,  0)
                                               ELSE
                                                nvl(d_curr_amt,  0) -
                                                nvl(c_curr_amt,  0)
                                             END curr_bal
                                        FROM t_acc_general_ledger_ac_his
                                       WHERE ac_date = trunc(now() - 1)
                                         and 1=1)
                               where d_prev_bal > '0')
                   select decode(sign(curr_bal), 1, 0, abs(curr_bal))
                     from kk
                    where t_acc_general_ledger_ac_his.br_no = kk.br_no
                      and t_acc_general_ledger_ac_his.gl_code = kk.gl_code)
                    where 1=1
                      and d_prev_bal > '0'
                      and ac_date = trunc(now() - 1);
        
        end if;
      
        if v_c_count > 0 then
          update t_acc_general_ledger_ac_his
             set d_curr_bal =
                 (with kk as (select br_no,
                                     gl_code,
                                     d_prev_bal,
                                     c_prev_bal,
                                     ac_date,
                                     curr_bal
                                from (SELECT br_no,
                                             gl_code,
                                             ac_date,
                                             d_prev_bal,
                                             c_prev_bal,
                                             CASE
                                               WHEN c_prev_bal > '0' THEN
                                                nvl(c_prev_bal,  0) +
                                                nvl(c_curr_amt,  0) -
                                                nvl(d_curr_amt,  0)
                                               when d_prev_bal > '0' then
                                                nvl(d_prev_bal,  0) +
                                                nvl(d_curr_amt,  0) -
                                                nvl(c_curr_amt,  0)
                                               ELSE
                                                nvl(d_curr_amt,  0) -
                                                nvl(c_curr_amt,  0)
                                             END curr_bal
                                        FROM t_acc_general_ledger_ac_his
                                       WHERE ac_date = trunc(now() - 1)
                                         and 1=1)
                               where c_prev_bal > '0')
                   select decode(sign(curr_bal), 1, 0, abs(curr_bal))
                     from kk
                    where t_acc_general_ledger_ac_his.br_no = kk.br_no
                      and t_acc_general_ledger_ac_his.gl_code = kk.gl_code)
                    where 1=1
                      and c_prev_bal > '0'
                      and ac_date = trunc(now() - 1);
        
        
          update t_acc_general_ledger_ac_his
             set c_curr_bal =
                 (with kk as (select br_no,
                                     gl_code,
                                     d_prev_bal,
                                     c_prev_bal,
                                     ac_date,
                                     curr_bal
                                from (SELECT br_no,
                                             gl_code,
                                             ac_date,
                                             d_prev_bal,
                                             c_prev_bal,
                                             CASE
                                               WHEN c_prev_bal > '0' THEN
                                                nvl(c_prev_bal,  0) +
                                                nvl(c_curr_amt,  0) -
                                                nvl(d_curr_amt,  0)
                                               when d_prev_bal > '0' then
                                                nvl(d_prev_bal,  0) +
                                                nvl(d_curr_amt,  0) -
                                                nvl(c_curr_amt,  0)
                                               ELSE
                                                nvl(d_curr_amt,  0) -
                                                nvl(c_curr_amt,  0)
                                             END curr_bal
                                        FROM t_acc_general_ledger_ac_his
                                       WHERE ac_date = trunc(now() - 1)
                                         and 1=1)
                               where c_prev_bal > '0')
                   select decode(sign(curr_bal), 1, abs(curr_bal), 0)
                     from kk
                    where t_acc_general_ledger_ac_his.br_no = kk.br_no
                      and t_acc_general_ledger_ac_his.gl_code = kk.gl_code)
                    where 1=1
                      and c_prev_bal > '0'
                      and ac_date = trunc(now() - 1);
        
        end if;
      
        if v_b_count > 0 then
          UPDATE t_acc_general_ledger_ac_his
             SET d_curr_bal =
                 (WITH kk AS (SELECT br_no,
                                     gl_code,
                                     ac_date,
                                     d_prev_bal,
                                     c_prev_bal,
                                     d_curr_amt,
                                     c_curr_amt,
                                     CASE
                                       WHEN c_prev_bal > '0' THEN
                                        nvl(c_prev_bal,  0) +
                                        nvl(c_curr_amt,  0) -
                                        nvl(d_curr_amt,  0)
                                       WHEN d_prev_bal > '0' THEN
                                        nvl(d_prev_bal,  0) +
                                        nvl(d_curr_amt,  0) -
                                        nvl(c_curr_amt,  0)
                                       ELSE
                                        nvl(d_curr_amt, 0) -
                                        nvl(c_curr_amt, 0)
                                     END curr_bal
                                FROM t_acc_general_ledger_ac_his
                               WHERE ac_date = TRUNC(now() - 1)
                                 AND 1=1
                                 AND (c_prev_bal IS NULL OR c_prev_bal = '0')
                                 AND (d_prev_bal IS NULL OR d_prev_bal = '0')
                                 AND (cast(t_acc_general_ledger_ac_his.D_CURR_AMT  as numeric) >
                                     cast(t_acc_general_ledger_ac_his.C_CURR_AMT  as numeric)))
                   SELECT DECODE(SIGN(curr_bal), 1, curr_bal, 0)
                     FROM kk
                    WHERE t_acc_general_ledger_ac_his.br_no = kk.br_no
                      AND t_acc_general_ledger_ac_his.gl_code = kk.gl_code)
                    WHERE 1=1
                      AND (c_prev_bal IS NULL OR c_prev_bal = '0')
                      AND (d_prev_bal IS NULL OR d_prev_bal = '0')
                      AND cast(t_acc_general_ledger_ac_his.D_CURR_AMT  as numeric) >
                          cast (t_acc_general_ledger_ac_his.C_CURR_AMT  as numeric)
                      AND ac_date = trunc(now() - 1);
        
        
          UPDATE t_acc_general_ledger_ac_his
             SET c_curr_bal =
                 (WITH kk AS (SELECT br_no,
                                     gl_code,
                                     ac_date,
                                     d_prev_bal,
                                     c_prev_bal,
                                     d_curr_amt,
                                     c_curr_amt,
                                     CASE
                                       WHEN c_prev_bal > '0' THEN
                                        nvl(c_prev_bal,  0) +
                                        nvl(c_curr_amt,  0) -
                                        nvl(d_curr_amt,  0)
                                       WHEN d_prev_bal > '0' THEN
                                        nvl(d_prev_bal, 0) +
                                        nvl(d_curr_amt, 0) -
                                        nvl(c_curr_amt, 0)
                                       ELSE
                                        nvl(d_curr_amt,  0) -
                                        nvl(c_curr_amt,  0)
                                     END curr_bal
                                FROM t_acc_general_ledger_ac_his
                               WHERE ac_date = TRUNC(now() - 1)
                                 AND 1=1
                                 AND (c_prev_bal IS NULL OR c_prev_bal = '0')
                                 AND (d_prev_bal IS NULL OR d_prev_bal = '0')
                                 AND (cast(t_acc_general_ledger_ac_his.D_CURR_AMT  as numeric) >
                                     cast(t_acc_general_ledger_ac_his.C_CURR_AMT  as numeric)))
                   SELECT DECODE(SIGN(curr_bal), 1, 0, ABS(curr_bal))
                     FROM kk
                    WHERE t_acc_general_ledger_ac_his.br_no = kk.br_no
                      AND t_acc_general_ledger_ac_his.gl_code = kk.gl_code)
                    WHERE 1=1
                      AND (c_prev_bal IS NULL OR c_prev_bal = '0')
                      AND (d_prev_bal IS NULL OR d_prev_bal = '0')
                      AND cast(t_acc_general_ledger_ac_his.D_CURR_AMT  as numeric) >
                          cast(t_acc_general_ledger_ac_his.C_CURR_AMT  as numeric)
                      AND ac_date = trunc(now() - 1);
        
        end if;
      
        if v_a_count > 0 then
          UPDATE t_acc_general_ledger_ac_his
             SET c_curr_bal =
                 (WITH kk AS (SELECT br_no,
                                     gl_code,
                                     ac_date,
                                     d_prev_bal,
                                     c_prev_bal,
                                     d_curr_amt,
                                     c_curr_amt,
                                     CASE
                                       WHEN c_prev_bal > '0' THEN
                                        nvl(c_prev_bal,  0) +
                                        nvl(c_curr_amt,  0) -
                                        nvl(d_curr_amt,  0)
                                       WHEN d_prev_bal > '0' THEN
                                        nvl(d_prev_bal, 0) +
                                        nvl(d_curr_amt, 0) -
                                        nvl(c_curr_amt, 0)
                                       ELSE
                                        nvl(d_curr_amt,  0) -
                                        nvl(c_curr_amt,  0)
                                     END curr_bal
                                FROM t_acc_general_ledger_ac_his
                               WHERE ac_date = trunc(now() - 1)
                                 AND 1=1
                                 AND (c_prev_bal IS NULL OR c_prev_bal = '0')
                                 AND (d_prev_bal IS NULL OR d_prev_bal = '0')
                                 AND (cast(t_acc_general_ledger_ac_his.D_CURR_AMT  as numeric) <
                                     cast(t_acc_general_ledger_ac_his.C_CURR_AMT  as numeric)))
                   SELECT DECODE(SIGN(curr_bal), -1, ABS(curr_bal), 0)
                     FROM kk
                    WHERE t_acc_general_ledger_ac_his.br_no = kk.br_no
                      AND t_acc_general_ledger_ac_his.gl_code = kk.gl_code)
                    WHERE 1=1
                      AND (c_prev_bal IS NULL OR c_prev_bal = '0')
                      AND (d_prev_bal IS NULL OR d_prev_bal = '0')
                      AND cast(t_acc_general_ledger_ac_his.D_CURR_AMT  as numeric) <
                          cast(t_acc_general_ledger_ac_his.C_CURR_AMT  as numeric)
                      AND ac_date = trunc(now() - 1);
        
          UPDATE t_acc_general_ledger_ac_his
             SET d_curr_bal =
                 (WITH kk AS (SELECT br_no,
                                     gl_code,
                                     ac_date,
                                     d_prev_bal,
                                     c_prev_bal,
                                     d_curr_amt,
                                     c_curr_amt,
                                     CASE
                                       WHEN c_prev_bal > '0' THEN
                                        nvl(c_prev_bal,  0) +
                                        nvl(c_curr_amt,  0) -
                                        nvl(d_curr_amt,  0)
                                       WHEN d_prev_bal > '0' THEN
                                        nvl(d_prev_bal,  0) +
                                        nvl(d_curr_amt,  0) -
                                        nvl(c_curr_amt,  0)
                                       ELSE
                                        nvl(d_curr_amt,  0) -
                                        nvl(c_curr_amt,  0)
                                     END curr_bal
                                FROM t_acc_general_ledger_ac_his
                               WHERE ac_date = trunc(now() - 1)
                                 AND 1=1
                                 AND (c_prev_bal IS NULL OR c_prev_bal = '0')
                                 AND (d_prev_bal IS NULL OR d_prev_bal = '0')
                                 AND (cast(t_acc_general_ledger_ac_his.D_CURR_AMT  as numeric) <
                                     cast(t_acc_general_ledger_ac_his.C_CURR_AMT  as numeric)))
                   SELECT DECODE(SIGN(curr_bal), -1, 0, ABS(curr_bal))
                     FROM kk
                    WHERE t_acc_general_ledger_ac_his.br_no = kk.br_no
                      AND t_acc_general_ledger_ac_his.gl_code = kk.gl_code)
                    WHERE 1=1
                      AND (c_prev_bal IS NULL OR c_prev_bal = '0')
                      AND (d_prev_bal IS NULL OR d_prev_bal = '0')
                      AND cast(t_acc_general_ledger_ac_his.D_CURR_AMT  as numeric) <
                          cast(t_acc_general_ledger_ac_his.C_CURR_AMT  as numeric)
                      AND ac_date = trunc(now() - 1);
        
        end if;
      end if;

    raise notice 'begin insert  t_acc_general_ledger_ac_his T1';

      insert into t_acc_general_ledger_ac_his
        (br_no, gl_code)
        select br_no, gl_code
          from t_acc_general_ledger_ac_his
         where ac_date = trunc(now() - 2)
        minus
        select br_no, gl_code
          from t_acc_general_ledger_ac_his
         where ac_date = trunc(now() - 1);

      UPDATE t_acc_general_ledger_ac_his t2
         SET (d_prev_bal) =
             (WITH kk AS (SELECT br_no,
                                 gl_code,
                                 ac_date,
                                 lag(d_curr_bal::bigint, 1,0::bigint) over(order by ac_date) d_prev_bal_next,
                                 lag(c_curr_bal::bigint, 1,0::bigint) over(order by ac_date) c_prev_bal_next
                            FROM t_acc_general_ledger_ac_his
                           WHERE (br_no, gl_code) IN
                                 (SELECT br_no, gl_code
                                    FROM t_acc_general_ledger_ac_his
                                   WHERE ac_date =  trunc(now() - 2)
                                  MINUS
                                  SELECT br_no, gl_code
                                    FROM t_acc_general_ledger_ac_his
                                   WHERE ac_date = trunc(now() - 1)))
               SELECT d_prev_bal_next
                 FROM kk
                WHERE kk.br_no = t2.br_no
                  AND kk.gl_code = t2.gl_code
                  AND kk.ac_date IS NULL)
                WHERE ac_date IS NULL
                  AND (br_no, gl_code) IN
                      (SELECT br_no, gl_code
                         FROM t_acc_general_ledger_ac_his
                        WHERE ac_date =  trunc(now() - 2)
                       MINUS
                       SELECT br_no, gl_code
                         FROM t_acc_general_ledger_ac_his
                        WHERE ac_date = trunc(now() - 1));

    raise notice 'begin updte  t_acc_general_ledger_ac_his T2';
    
      UPDATE t_acc_general_ledger_ac_his t2
         SET (c_prev_bal) =
             (WITH kk AS (SELECT br_no,
                                 gl_code,
                                 ac_date,
                                 lag(d_curr_bal::bigint, 1,0::bigint) over(partition BY br_no, gl_code order by ac_date) d_prev_bal_next,
                                 lag(c_curr_bal::bigint, 1,0::bigint) over(partition BY br_no, gl_code order by ac_date) c_prev_bal_next
                            FROM t_acc_general_ledger_ac_his
                           WHERE (br_no, gl_code) IN
                                 (SELECT br_no, gl_code
                                    FROM t_acc_general_ledger_ac_his
                                   WHERE ac_date =  trunc(now() - 2)
                                  MINUS
                                  SELECT br_no, gl_code
                                    FROM t_acc_general_ledger_ac_his
                                   WHERE ac_date = trunc(now() - 1)))
               SELECT c_prev_bal_next
                 FROM kk
                WHERE kk.br_no = t2.br_no
                  AND kk.gl_code = t2.gl_code
                  AND kk.ac_date IS NULL)
                WHERE ac_date IS NULL
                  AND (br_no, gl_code) IN
                      (SELECT br_no, gl_code
                         FROM t_acc_general_ledger_ac_his
                        WHERE ac_date =  trunc(now() - 2)
                       MINUS
                       SELECT br_no, gl_code
                         FROM t_acc_general_ledger_ac_his
                        WHERE ac_date = trunc(now() - 1));
        
      update t_acc_general_ledger_ac_his
         set d_curr_bal = d_prev_bal, c_curr_bal = c_prev_bal
       where ac_date is null;

    raise notice 'begin updte [last]  t_acc_general_ledger_ac_his';
    
      UPDATE t_acc_general_ledger_ac_his
         SET seq_no     = t_acc_general_ledger_ac_his_seq_no_seq.nextval,
             d_count    = '0',
             c_count    = '0',
             d_curr_amt = '0',
             c_curr_amt = '0',
             ac_date    = trunc(now() - 1),
             ccy        = INCCY
       WHERE ac_date IS NULL
         AND (br_no, gl_code) IN
             (SELECT br_no, gl_code
                FROM t_acc_general_ledger_ac_his
               WHERE ac_date = trunc(now() - 2)
              MINUS
              SELECT br_no, gl_code
                FROM t_acc_general_ledger_ac_his
               WHERE ac_date = trunc(now() - 1));
      --commit;
    else
      --dbms_output.put_line('error!');
      raise notice 'error!'; --for language plpgsql
    end if;
    raise notice 'begin call P_SUBJECT_SHEET';
    perform P_SUBJECT_SHEET('CNY');
  EXCEPTION
    WHEN OTHERS THEN
      v_code := 0;
      v_errm := SUBSTR(SQLERRM, 1, 256);
      INSERT INTO t_errors
        (code, MESSAGE, PRO_NAME, RUN_DATE)
      VALUES
        (v_code, v_errm, 'P_LOOP_COUNT_SHEET', now());
  END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE COST 100
;

ALTER FUNCTION "acc_user"."p_loop_count_sheet"(inccy varchar) OWNER TO "acc_user";

 

posted @ 2018-03-29 23:05  王默默  阅读(496)  评论(0)    收藏  举报