首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >代码实例说明:关于建立“代码管理监控机制”的思路(0311案例持续更新中...)

代码实例说明:关于建立“代码管理监控机制”的思路(0311案例持续更新中...)

原创
作者头像
用户12032828
修改2026-03-11 18:06:12
修改2026-03-11 18:06:12
1120
举报

《20260311 更新 实例3》

经过年复一年的开发积累,企业的代码仓逐渐变得臃肿,甚至变成屎山代码。

这些屎山代码,往往经过N个程序员之手,他们水平参差不起,风格不一。

如何对这些屎山代码进行统一的管理,让它们可以被监控、评价和批量改造?

建立“代码管理系统”的第一个难点在于,如何在庞大的代码仓中,快速的查找出具有某些特征的代码段。

由于我们需要查找的是代码段,而不是代码行,用传统的正则表达式难以实现,需要通过语法解析器进行自定义语法配置,然后进行代码查找。

以小实例说明 :

### 实例1: 找出JAVA代码中,入参数量超过4个的函数:

# 配置查找规则(Code_manage.syn)如下所示:

代码语言:txt
复制
__DEF_CASE_SENSITIVE__    Y
__DEF_FUZZY__             Y 
__DEF_DEBUG__             N

__DEF_LINE_COMMENT__     //
__DEF_LINES_COMMENT__    /*  */


__DEF_STR__   __NAME__  
<1,200>
[1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_$??
[0,199]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_??
[NO] import if else for while break continue class return try except finally final static public private


__DEF_PATH__    __FUNCTION_DEF__
0101          : x1         @              | public
              : x2         @              + private
0 0           : x3         @ CAN_SKIP     | static
1 1           : x4         @              | __NAME__
              : x5         @              | __NAME__
              : x6         @              | (
1111          : p1         @ CAN_SKIP     | final
              : p11        @              | __NAME__
              : p111       @              | __NAME__
              : p2         @              | ,
              : p22        @ CAN_SKIP     | final
              : p222       @              | __NAME__
              : p2222      @              | __NAME__
              : p3         @              | ,
              : p33        @ CAN_SKIP     | final
              : p333       @              | __NAME__
              : p3333      @              | __NAME__
NNNN          : p4         @              | ,
              : p44        @ CAN_SKIP     | final
              : x444       @              | __NAME__
              : x4444      @              | __NAME__
1111          : xx         @              | )

# 假设java代码(MyCode.java) 如下所示:

代码语言:txt
复制

private int alreadyBufferedSize = 0;

// The index in the byte[] found at buffers.getLast() to be written next
private int index = 0;

// Is the stream closed?
private boolean closed = false;

public FastByteArrayOutputStream(int initialBlockSize) {
	Assert.isTrue(initialBlockSize > 0, "Initial block size must be greater than 0");
	this.initialBlockSize = initialBlockSize;
	this.nextBlockSize = initialBlockSize;
}

@Override
public void applyBeanPropertyValues(Object existingBean, String beanName, int autowireMode, boolean dependencyCheck, int initSize) 
throws BeansException {
	markBeanAsCreated(beanName);
	BeanDefinition bd = getMergedBeanDefinition(beanName);
	BeanWrapper bw = new BeanWrapperImpl(existingBean);
	initBeanWrapper(bw);
	applyPropertyValues(beanName, bd, bw, bd.getPropertyValues());
}

@Override
public Object initializeBean(Object existingBean, String beanName) {
	return initializeBean(beanName, existingBean, null);
}

根据配置规则,执行查找命令: ZGLanguage -e Code_manage.syn -f MyCode.java

可以得到结果:

代码语言:txt
复制
C:\>ZGLanguage -e Code_manage.syn -f MyCode.java
Run type : Find
Syntax file : Code_manage.syn
code file : MyCode.java
Output file : out.zgl

--------------------------------------------------------------------
### Found code by : __FUNCTION_DEF__ | Lines : 17 ~ 17 :
--------------------------------------------------------------------
public void applyBeanPropertyValues(Object existingBean, String beanName, int autowireMode, boolean dependencyCheck, int initSize)

可以看出,查找结果只输出了函数 applyBeanPropertyValues,它的入参数量为5个,其他2个函数的入参均不超过4个,因此被忽略。

### 实例2: 检查代码中 for循环的判断 中是否存在重复计算的情况:

检查代码中 for循环的判断 中是否存在重复计算的情况:

例如: for (int i=0; i < list.size(); i++) 是重复计算

for (int i=0; i < 100; i++) 不是重复计算

即要检查 for的中间表达式 部分是否存在值运算的情况

思路是可以利用“排除法”,先检查是否是简单的(不超过2个对象)比较,否则视为存在重复计算。

“简单”的标识为“GOOD”,“复杂”的标识为“BAD”,并且提取出代码和行号。

# 检查语法配置如下(test.syn)

代码语言:txt
复制
__DEF_FUZZY__             Y
__DEF_DEBUG__             N
__DEF_CASE_SENSITIVE__    Y
 
__DEF_LINE_COMMENT__      //
__DEF_LINES_COMMENT__     /*     */
 
 
__DEF_PATH__    __FOR__
1             : for            @          | for
              : lkh            @          | (
              : lex            @          | __ANY__
              : fh1            @          | ;
1             : mex            @          | __ANY__
              : fh2            @          | ;
+             : mex1           @          | __NORM_NAME__
              : op1            @          | >
              : op2            @          + >=
              : op3            @          + <
              : op4            @          + <=
              : op5            @          + ==
              : op6            @          + !=
              : va1            @          | __NORM_NAME__
              : va2            @          + __STRING__
              : va3            @          + __FLOAT__
              : va4            @          + __INT__
              : fh22           @          | ;
+             : mex2           @          | __NORM_NAME__
              : fh23           @          | ;
+             : fh24           @          | ;
1             : rex            @          | __ANY__
              : rkh            @          | )
-------------------------------------------------------------
1             : for            @          | __\n__
1             : fh2            @ STRING   | BAD | Line :
              : fh22           @ STRING   | GOOD | Line :
              : fh23           @ STRING   | GOOD | Line :
              : fh24           @ STRING   | GOOD | Line :
              : fh2            @          | __LINE__
              : fh22           @          | __LINE__
              : fh23           @          | __LINE__
              : fh24           @          | __LINE__
1             : for            @          | |
              : for            @          | for
              : lkh            @          | (
              : lex            @          | __ANY__
              : fh1            @          | ;
              : mex            @          | __ANY__
              : fh2            @          | ;
              : mex1           @          | __NORM_NAME__
              : op1            @          | >
              : op2            @          | >=
              : op3            @          | <
              : op4            @          | <=
              : op5            @          | ==
              : op6            @          | !=
              : va1            @          | __NORM_NAME__
              : va2            @          | __STRING__
              : va3            @          | __FLOAT__
              : va4            @          | __INT__
              : fh22           @          | ;
              : mex2           @          | __NORM_NAME__
              : fh23           @          | ;
              : fh24           @          | ;
              : rex            @          | __ANY__
              : rkh            @          | )
 
 
__DEF_STR__   __NORM_NAME__
<1,100>
[0,100]0123456789
[1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_??
[0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_??
[NO] for
 
__DEF_SUB_PATH__   __STRING__
1       : x1                  | "
        : x2                  | __ANY__
        : x3                  | "
 
__DEF_STR__   __FLOAT__
<1,100>
[1,50]0123456789
[1,1].
[1,50]0123456789
 
 
__DEF_STR__   __INT__
<1,100>
[1,100]0123456789

# 假设代码文件内容如下(debug.code):

代码语言:txt
复制
for(int i=0; i < 100; i++)
{
    for(int i=0; i >= j + 1; i++)
    {
        for(int i=0; i == "abc"; i++)
        {....}
	}
}
 
for(; fun(a) != i; i++ )
{....}
 
for( ; ; )
{....}
 
for( ; i; i -- )
{....}
 
for(int i=0; i < list.size(); i++)
{....}
 
for(int i=0, int length=list.size(); i < length; i++)
{....}

# 执行命令:  ZGLanguage -e test.syn -t debug.code -o out.zgl > log.log

# 得到结果(out.zgl):

代码语言:txt
复制
GOOD | Line : 1 | for ( int i=0 ; i < 100 ; i++ )
    
BAD | Line : 3 | for ( int i=0 ; i >= j + 1 ; i++ )
        
GOOD | Line : 5 | for ( int i=0 ; i == "abc" ; i++ )
 
BAD | Line : 10 | for ( ; fun(a) != i ; i++ )
 
GOOD | Line : 13 | for (  ; ; )
 
GOOD | Line : 16 | for (  ; i ; i -- )
 
BAD | Line : 19 | for ( int i=0 ; i < list.size() ; i++ )
 
GOOD | Line : 22 | for ( int i=0, int length=list.size() ; i < length ; i++ )

可以看到,结果第1列为判断结果,第2列为所在行号,第3列为代码。

### 实例3:提取SQL脚本where、on模块代码,并标识分类其中的条件语句

# 提取 SQL 脚本中的 where、on模块代码 的语法配置如下(GET_SQL_ON_WHERE.syn):

代码语言:txt
复制
__DEF_FUZZY__             Y
__DEF_DEBUG__             N
__DEF_CASE_SENSITIVE__    N
 
__DEF_LINE_COMMENT__      --
__DEF_LINES_COMMENT__     /*     */

__DEF_STR__   __IF_KW__
<1,100>
[1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
[0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_
 
__DEF_PATH__    __WHERE__
1         : x1          @             | __\b__
          : x2          @             + __\t__
          : x3          @             + __\n__
          : x4          @ %__IF_KW__  | where
          : x5          @             | __PATH_4_EXPR__
------------------------------------------------------------
1         : x4          @             | __\n__
          : x4          @             | __\n__
          : x4          @             | ################
          : x4          @ STRING      / Line :
          : x4          @             / __LINE__
          : x4          @             / ################
          : x4          @             | __\n__
          : x4          @             | __\n__
          : x4          @             | where
          : x5          @             | __PATH_4_EXPR__
          
__DEF_PATH__    __ON__
1         : x1          @             | __\b__
          : x2          @             + __\t__
          : x3          @             + __\n__
          : x4          @ %__IF_KW__  | on
          : x5          @             | __PATH_4_EXPR__
------------------------------------------------------------
1         : x4          @             | __\n__
          : x4          @             | __\n__
          : x4          @             | ################
          : x4          @ STRING      / Line :
          : x4          @             / __LINE__
          : x4          @             / ################
          : x4          @             | __\n__
          : x4          @             | __\n__
          : x4          @             | on
          : x5          @             | __PATH_4_EXPR__
 
__DEF_SUB_PATH__     __PATH_4_EXPR__
N          : int          @                       | __INT__
           : flo          @                       + __FLOAT__
           : nm           @                       + __NAME__
           : caw          @                       + __CASE_WHEN__
           : str          @                       + __STRING__
           : vsl          @                       + __SUB__
           : fun          @                       + __FUNCTION__
           : otn          @                       + __OTH_NAME__
           : otf          @                       + __OTH_FUN__
           : eq           @                       + =
           : eq2          @                       + :=
           : neq          @                       + <>
           : beq          @                       + !=
           : dyh          @                       + >
           : ddy          @                       + >=
           : xyh          @                       + <
           : xdy          @                       + <=
           : add          @                       + +
           : sub          @                       + -
           : cyh          @                       + *
           : dev          @                       + /
           : ssx          @                       + ||
           : bfh          @                       + %
           : bd1          @                       + &
           : bd2          @                       + ~
           : mh           @                       + :
           : mh2          @                       + ::
           : wh           @                       + ?
           : btw          @ %__IF_KW__            + between
           : and          @ %__IF_KW__            + and
           : or           @ %__IF_KW__            + or
           : lik          @ %__IF_KW__            + like
           : in           @ %__IF_KW__            + in
           : is           @ %__IF_KW__            + is
           : not          @ %__IF_KW__            + not
           : nul          @ %__IF_KW__            + null
           : exi          @ %__IF_KW__            + exists
 
__DEF_SUB_PATH__   __OTH_NAME__
1       : otrnm          @         | __NAME__
        : pp             @         | .
        : column         @         | __NAME__
 
__DEF_SUB_PATH__   __OTH_FUN__
N       : schema      | __NAME__
        : pp          | .
1       : fun         | __FUNCTION__
 
__DEF_SUB_PATH__      __FUNCTION__      
1           : fun         @             | __NAME__
            : lkh         @             | __SUB__
 
__DEF_STR__   __ALL_STR__
<1,20000>
[1,20000]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`~!@#$%^&*-_+={}[]\|:;'"<,>.?/??

__DEF_SUB_PATH__   __SUB__
1       :            | ( 
N       :            | __ALL_STR__
        :            + __SUB__
1       :            | )

__DEF_SUB_PATH__   __CASE_WHEN__
1          : cas         @ %__IF_KW__          | case
           : exp1        @ CAN_SKIP            | __PATH_4_EXPR__
N          : whe         @ %__IF_KW__          | when
           : exp2        @                     | __PATH_4_EXPR__
           : the         @ %__IF_KW__          | then
           : exp3        @                     | __PATH_4_EXPR__
1          : els         @ %__IF_KW__ CAN_SKIP | else
           : exp4        @ CAN_SKIP            | __PATH_4_EXPR__
           : end         @ %__IF_KW__          | end

__DEF_SUB_PATH__   __NAME__
1       : lsy            @         | "
        : nm1            @         | __ANY__
        : rsy            @         | "
+       : ldy            @         | `
        : nm2            @         | __ANY__
        : rdy            @         | `
+       : dol            @         | $
        : lkh            @         | {
        : nm3            @         | __NORM_NAME__
        : rkh            @         | }
+       : nm4            @         | __NORM_NAME__

__DEF_STR__   __NORM_NAME__
<1,100>
[0,100]0123456789
[1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_??
[0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_??
[NO] create insert into update delete truncate drop merge table select inner left join on from where exists group distribute distributed order partition by having union minus intersect except all with as set reset between and or like in is not null case when then else end pivot lateral view start connect while do repeat until loop call open close cursor fetch analyze vacuum                                        

__DEF_STR__   __NAME_WITH_KW__
<1,100>
[0,100]0123456789
[1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_??
[0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_??

__DEF_SUB_PATH__   __STRING__
1       : x1                  | '
        : x2                  | __ANY__
        : x3                  | '

__DEF_STR__   __FLOAT__
<1,100>
[1,50]0123456789
[1,1].
[1,50]0123456789

__DEF_STR__   __INT__
<1,100>
[1,100]0123456789

# 假设SQL脚本如下(debug.code)只展示部分:

代码语言:txt
复制
CREATE OR REPLACE PROCEDURE PROC_F_CWWS_LOAN
(
    。。。。。。
) IS
 
  。。。。。。。。
 
BEGIN
 
 
  --设置会话日期格式
  EXECUTE IMMEDIATE ' ALTER SESSION SET NLS_DATE_FORMAT = ''YYYY-MM-DD''';
  --查询参数表中,该程序对应的频率值
  SELECT P_FREQ
    INTO V_P_FREQ
    FROM ETL_PROC_STATUS_DEF
   WHERE PROC_NAME = V_PROC_NAME;
  --判断是调度频率
  IF P_AS_OF_DATE = FUNC_GET_FREQ_DAYS(P_AS_OF_DATE, V_P_FREQ) THEN
    --调用分区维护程序
 
    ETL.ETL_ADD_PARTITION('MA_F_LOAN', P_AS_OF_DATE, 'ETL');
 
    。。。。。。
 
    --从还款计划表中取每笔账户最近一次小于等于数据日期还款日,作为上次还款日
    INSERT INTO ETL.TMP_XD_LAST_PAYDATE
      (OBJECTNO, LAST_PAYDATE)
      SELECT OBJECTNO, LAST_PAYDATE
        FROM (SELECT T.OBJECTNO,
                     MAX(TO_DATE(PAYDATE, 'YYYY-MM-DD')) LAST_PAYDATE
                FROM NYBDP.O_CWWS_ACCT_PAYMENT_SCHEDULE T
               WHERE T.AS_OF_DATE = P_AS_OF_DATE
                 AND T.SEQID <> '999'
                 AND TO_DATE(T.PAYDATE, 'YYYY-MM-DD') < P_AS_OF_DATE
               GROUP BY T.OBJECTNO);
    INSERT INTO M_RUNLOG VALUES (SYSDATE, V_PROC_NAME, 'it is 3');
    COMMIT;
    --从还款计划表中取每笔账户最近一次大于数据日期还款日,作为下次还款日
    INSERT INTO ETL.TMP_XD_NEXT_PAYDATE
      (OBJECTNO, NEXT_PAYDATE)
      SELECT OBJECTNO, NEXT_PAYDATE
        FROM (SELECT T.OBJECTNO,
                     MIN(TO_DATE(PAYDATE, 'YYYY-MM-DD')) NEXT_PAYDATE
                FROM NYBDP.O_CWWS_ACCT_PAYMENT_SCHEDULE T
               WHERE T.AS_OF_DATE = P_AS_OF_DATE
                 AND T.SEQID <> '999'
                 AND TO_DATE(T.PAYDATE, 'YYYY-MM-DD') >= P_AS_OF_DATE
               GROUP BY T.OBJECTNO);
    INSERT INTO M_RUNLOG VALUES (SYSDATE, V_PROC_NAME, 'it is 4');
    COMMIT;
    --xxxx业务数据ETL处理
    INSERT INTO MA_F_LOAN
      SELECT CASE
               WHEN CL.LOAN_STATUS = '0' AND CL.DUE_BALANCE <> 0 THEN
               'AK-' || AL.ACCOUNTNO || 'YQ'
               ELSE
                AL.ACCOUNTNO
             END ACCOUNT_NUMBER, --20180319
             .......
             AL.REPRICETYPE REPRICE_TYPE
        FROM NYBDP.O_SS_CL_LOAN_ACCT_STATIS CL --xxxx账户状态表
        LEFT JOIN NYBDP.O_CWWS_ACCT_LOAN AL --xxxx账户统计表
          ON (CL.DRAW_NO = AL.SERIALNO AND P_AS_OF_DATE = AL.AS_OF_DATE)
        LEFT JOIN NYBDP.O_CWWS_BUSINESS_DUEBILL BD --借据表
          ON (AL.SERIALNO = BD.SERIALNO AND P_AS_OF_DATE = BD.AS_OF_DATE)
        LEFT JOIN NYBDP.O_CWWS_BUSINESS_CONTRACT BC --合同表
          ON (BD.RELATIVESERIALNO2 = BC.SERIALNO AND
             BC.AS_OF_DATE = P_AS_OF_DATE) --EDIT BY MSW20160302
      -- ON (BD.RELATIVESERIALNO2=BC.SERIALNO AND BD.AS_OF_DATE=BC.AS_OF_DATE)
        LEFT JOIN NYBDP.O_CWWS_BUSINESS_PUTOUT BP --业务出账表
          ON (BD.RELATIVESERIALNO1 = BP.SERIALNO AND
             BP.AS_OF_DATE = P_AS_OF_DATE) --EDIT BY MSW20160302
      -- ON (BD.RELATIVESERIALNO1=BP.SERIALNO AND BD.AS_OF_DATE=BP.AS_OF_DATE)
      --关联客户信息表,取客户信息
        LEFT JOIN (SELECT T6.CUSTOMERID,
                          T6.MFCUSTOMERID,
                          T6.CUSTOMERTYPE,
                          T7.CREDITLEVEL C_EVALUATE
                     FROM (SELECT DISTINCT CUSTOMERID,
                                           CUSTOMERTYPE,
                                           MFCUSTOMERID
                             FROM NYBDP.O_CWWS_CUSTOMER_INFO
                            WHERE AS_OF_DATE = P_AS_OF_DATE) T6
                     LEFT JOIN (SELECT CUSTOMERID,
                                      CREDITLEVEL,
                                      OTHERCREDITLEVEL,
                                      EVALUATELEVEL,
                                      INDUSTRYTYPE
                                 FROM NYBDP.O_CWWS_ENT_INFO
                                WHERE AS_OF_DATE = P_AS_OF_DATE) T7
                       ON T6.CUSTOMERID = T7.CUSTOMERID) CI
          ON AL.CUSTOMERID = CI.CUSTOMERID
        LEFT JOIN --取减值准备金额和利息调整金额
       (SELECT ACCOUNTNO,
               。。。。。。
                      0
                   END) ACCRUED_INTEREST
          FROM ETL.O_CWWS_ACCT_SUBSIDIARY_LEDGER A,
               (SELECT DISTINCT SUB_CODE, SUB_NAME
                  FROM ETL.O_CAS_COMC_SUBJECT
                 WHERE AS_OF_DATE = P_AS_OF_DATE) B
         WHERE A.CORESUBJECTNO = B.SUB_CODE
           AND DECODE(DIRECTION,
                      'D',
                      DEBITBALANCE - CREDITBALANCE,
                      CREDITBALANCE - DEBITBALANCE) <> 0
           AND A.AS_OF_DATE = P_AS_OF_DATE
         GROUP BY A.ACCOUNTNO) SL
          ON AL.ACCOUNTNO = SL.ACCOUNTNO
        LEFT JOIN NYBDP.O_CAS_COMC_CURR CC --币种表
          ON (CL.CCY = CC.CUR_CODE AND P_AS_OF_DATE = CC.AS_OF_DATE)
        LEFT JOIN ETL.TMP_XD_LAST_PAYDATE LP --上次支付日临时表
          ON CL.DRAW_NO = LP.OBJECTNO
        LEFT JOIN ETL.TMP_XD_NEXT_PAYDATE NP --下次支付日临时表
          ON CL.DRAW_NO = NP.OBJECTNO
        LEFT JOIN --关联还款计划表,取下次支付本金和下次支付利息
       (SELECT A.OBJECTNO, A.PAYCORPUSAMT, A.PAYINTEAMT
          FROM NYBDP.O_CWWS_ACCT_PAYMENT_SCHEDULE A
         WHERE A.AS_OF_DATE = P_AS_OF_DATE
           AND A.SEQID <> '999'
           AND (A.OBJECTNO, TO_DATE(A.PAYDATE, 'YYYY/MM/DD')) IN
               (SELECT B.OBJECTNO, B.NEXT_PAYDATE
                  FROM ETL.TMP_XD_NEXT_PAYDATE B)
           AND A.SDATE <= TO_CHAR(P_AS_OF_DATE, 'YYYYMMDD') --add by msw 2016-03-14
           AND A.EDATE >= TO_CHAR(P_AS_OF_DATE, 'YYYYMMDD') --add by msw 2016-03-14
        ) T
          ON CL.DRAW_NO = T.OBJECTNO
        LEFT JOIN --取利息收入和利息科目信息
       (SELECT /*+PARALLEL(8)*/
         T.ACCOUNTNO,
         T.CORESUBJECTNO INT_SUB_CODE,
         T1.SUB_NAME INT_SUB_NAME,
         SUM(CASE
               WHEN DIRECTION = 'C' THEN
                T.CREDITAMT
               WHEN DIRECTION = 'D' THEN
                T.DEBITAMT --MODIFY BY ZYF 20180124
               ELSE
                0
             END) ACCRUED_INTEREST
          FROM ETL.O_CWWS_ACCT_SUBLEDGER_DETAIL T
          JOIN ETL.O_CAS_COMC_SUBJECT T1
            ON T.CORESUBJECTNO = T1.SUB_CODE
         WHERE (T1.SUB_NAME LIKE '%利息收入%')
           AND T.SENDFLAG = '1'
           AND T.AS_OF_DATE = P_AS_OF_DATE
           AND T1.AS_OF_DATE = P_AS_OF_DATE
 
         GROUP BY T.ACCOUNTNO, T.CORESUBJECTNO, T1.SUB_NAME) B
          ON AL.ACCOUNTNO = B.ACCOUNTNO
        LEFT JOIN --取减值损失准备科目
       (SELECT T.ACCOUNTNO,
               T.CORESUBJECTNO PRVN_GL_ACCOUNT_ID,
               T.SUB_NAME,
               T.OBJECTNO
          FROM (SELECT SL.ACCOUNTNO,
                       SL.SERIALNO,
                       SL.CORESUBJECTNO,
                       SL.OBJECTNO,
                       SUB.SUB_NAME,
                       RANK() OVER(PARTITION BY SL.ACCOUNTNO ORDER BY SL.SERIALNO DESC) SEQ
                  FROM ETL.O_CWWS_ACCT_SUBSIDIARY_LEDGER SL
                  JOIN ETL.O_CAS_COMC_SUBJECT SUB
                    ON SL.CORESUBJECTNO = SUB.SUB_CODE
                 WHERE SUB.SUB_NAME LIKE '%准备%'
                   AND SUB.AS_OF_DATE = P_AS_OF_DATE
                   AND SL.AS_OF_DATE = P_AS_OF_DATE) T
         WHERE T.SEQ = 1) C
          ON CL.DRAW_NO = C.ACCOUNTNO
      /*WHERE CL.LOAN_TYPE NOT IN ('2070', '2110040', '2110010') --xxxx类型
      AND CL.AGG_YTD <> 0
      AND CL.AS_OF_DATE = P_AS_OF_DATE
      AND AL.ACCOUNTNO IS NOT NULL;*/
       WHERE (CL.LOAN_TYPE NOT IN ('2070', '2110040', '2110010') --xxxx类型
             AND CL.AGG_YTD <> 0 AND CL.AS_OF_DATE = P_AS_OF_DATE AND
             AL.ACCOUNTNO IS NOT NULL)
          OR (CL.LOAN_TYPE NOT IN ('2070', '2110040', '2110010') --xxxx类型
             AND CL.AGG_YTD = 0 AND CL.AS_OF_DATE = P_AS_OF_DATE AND
             AL.ACCOUNTNO IS NOT NULL AND
             (CL.LOAN_BALANCE <> 0 OR B.ACCRUED_INTEREST <> 0)); --将原来因为年积数为0导致过滤掉的提前还款的数据在不影响原来数据的情况下重新获取
    --所以将原来的查询结果过滤条件改为其中一种情况,另一种情况为年积数为0,
    --但当天余额或者当天发生额不为0的请况,两种情况只要符合其中一种就取数据插入表
    --WZG 20170622
    INSERT INTO M_RUNLOG VALUES (SYSDATE, V_PROC_NAME, 'it is 6');
    COMMIT;
 
    MERGE INTO ETL.MA_F_LOAN A
    USING (SELECT /*+PARALLEL(8)*/
            T.ACCOUNT_NUMBER, T.GL_ACCOUNT_ID, T.INT_GL_ACCOUNT_ID
             FROM ETL.MA_F_LOAN T
            INNER JOIN ETL.MA_D_GL_SUBJECT T1
               ON T.INT_GL_ACCOUNT_ID = T1.SUBJECT_NO3
              AND T1.SUBJECT_NAME3 LIKE '%已减值%'
              AND T1.AS_OF_DATE = P_AS_OF_DATE
            WHERE T.AS_OF_DATE = P_AS_OF_DATE
              AND T.ACCOUNT_NUMBER IN
                  (SELECT ACCOUNT_NUMBER
                     FROM (SELECT /*+PARALLEL(8)*/
                            T2.ACCOUNT_NUMBER, COUNT(1)
                             FROM ETL.MA_F_LOAN T2
                            WHERE T2.AS_OF_DATE = P_AS_OF_DATE
                            GROUP BY T2.ACCOUNT_NUMBER
                           HAVING COUNT(1) > 1))) B
    ON (A.ACCOUNT_NUMBER = B.ACCOUNT_NUMBER AND A.AS_OF_DATE = P_AS_OF_DATE AND A.GL_ACCOUNT_ID = B.GL_ACCOUNT_ID AND A.INT_GL_ACCOUNT_ID = B.INT_GL_ACCOUNT_ID)
    WHEN MATCHED THEN
      UPDATE SET A.CUR_BOOK_BAL = 0, A.OVERDUE_BAL = 0;
    COMMIT;
 
    --信贷系统12月14日上线新逻辑,导致原核销xxxx数据余额为0的上线后余额不再为0,需要更新核销xxxx数据的特定金额字段值更新为0。 WZG 20171220
    UPDATE MA_F_LOAN T
       SET T.CUR_BOOK_BAL = 0, T.SUM_BOOK_BAL_M = 0, T.AVG_BOOK_BAL_M = 0
     WHERE T.AS_OF_DATE = P_AS_OF_DATE
       AND EXISTS (SELECT 1
              FROM NYBDP.O_CWWS_BUSINESS_DUEBILL BD
             WHERE T.ACCOUNT_ID = BD.SERIALNO
               AND BD.AS_OF_DATE = T.AS_OF_DATE
               AND BD.BUSINESSSTATUS = '6');
    INSERT INTO M_RUNLOG VALUES (SYSDATE, V_PROC_NAME, 'it is 6.2');
    COMMIT;
 
    --更新逾期xxxx上下次重订价日及重订价频率为起息日、到期日
    UPDATE MA_F_LOAN A
       SET LAST_REPRICE_DATE  = A.ORIGINATION_DATE,
           NEXT_REPRICE_DATE  = A.MATURITY_DATE,
           REPRICE_FREQ       = A.ORG_TERM,
           REPRICE_FREQ_MULT  = A.ORG_TERM_MULT,
           ADJUSTABLE_TYPE_CD = 0
     WHERE A.MATURITY_DATE <= P_AS_OF_DATE
       AND A.CUR_BOOK_BAL <> 0;
    /*AND A.ADJUSTABLE_TYPE_CD = '250'*/
    INSERT INTO M_RUNLOG VALUES (SYSDATE, V_PROC_NAME, 'it is 7');
 
    --资产腾挪数据
    UPDATE MA_F_LOAN
       SET ACCOUNT_ID = ACCOUNT_ID || 'A'
     WHERE AS_OF_DATE = P_AS_OF_DATE
       AND GL_ACCOUNT_ID IN ('9990101', '9990102', '9990103', '9990104'); --增加9990103科目,所以新增一个条件   WZG   20170427
    --增加9990104科目,所以新增一个条件   WZG   20170630
    INSERT INTO M_RUNLOG VALUES (SYSDATE, V_PROC_NAME, 'it is 8');
    COMMIT;
 
    --更新资产腾挪xxxx为固定利率xxxx,计息方式为act/360
    UPDATE MA_F_LOAN T
       SET T.LAST_REPRICE_DATE  = T.ORIGINATION_DATE,
           T.NEXT_REPRICE_DATE  = T.MATURITY_DATE,
           T.ORG_TERM           = T.MATURITY_DATE - T.ORIGINATION_DATE,
           T.REPRICE_FREQ       = T.MATURITY_DATE - T.ORIGINATION_DATE,
           T.ADJUSTABLE_TYPE_CD = '0',
           T.INT_GL_ACCOUNT_ID  = '972301',
           T.ACCRUED_INTEREST   = ROUND(T.CUR_BOOK_BAL * T.CUR_NET_RATE / 360 /
                                        100.00,
                                        2)
     WHERE T.AS_OF_DATE = P_AS_OF_DATE
       AND T.GL_ACCOUNT_ID = '9990101';
    INSERT INTO M_RUNLOG VALUES (SYSDATE, V_PROC_NAME, 'it is 9');
    COMMIT;
  END IF;

 
END;
/

# 执行提取命令:

代码语言:txt
复制
ZGLanguage -e GET_SQL_ON_WHERE.syn -t debug.code -o on_where.zgl > log.log

# 得到提取结果(on_where.zgl):

代码语言:txt
复制
################ Line : 26 ################ 
 
WHERE PROC_NAME = V_PROC_NAME
               
 
################ Line : 46 ################ 
 
WHERE T.AS_OF_DATE = P_AS_OF_DATE
                 AND T.SEQID <> '999'
                 AND TO_DATE(T.PAYDATE, 'YYYY-MM-DD') < P_AS_OF_DATE
               
 
################ Line : 59 ################ 
 
WHERE T.AS_OF_DATE = P_AS_OF_DATE
                 AND T.SEQID <> '999'
                 AND TO_DATE(T.PAYDATE, 'YYYY-MM-DD') >= P_AS_OF_DATE    --xxxx账户统计表
          
 
################ Line : 107 ################ 
 
ON (CL.DRAW_NO = AL.SERIALNO AND P_AS_OF_DATE = AL.AS_OF_DATE)    --借据表
          
 
################ Line : 109 ################ 
 
ON (AL.SERIALNO = BD.SERIALNO AND P_AS_OF_DATE = BD.AS_OF_DATE)    --合同表
          
 
################ Line : 111 ################ 
 
ON (BD.RELATIVESERIALNO2 = BC.SERIALNO AND
             BC.AS_OF_DATE = P_AS_OF_DATE)    --业务出账表
          
 
################ Line : 115 ################ 
 
ON (BD.RELATIVESERIALNO1 = BP.SERIALNO AND
             BP.AS_OF_DATE = P_AS_OF_DATE)
                            
 
################ Line : 127 ################ 
 
WHERE AS_OF_DATE = P_AS_OF_DATE
                                
 
################ Line : 134 ################ 
 
WHERE AS_OF_DATE = P_AS_OF_DATE
                       
 
################ Line : 135 ################ 
 
ON T6.CUSTOMERID = T7.CUSTOMERID
          
 
################ Line : 136 ################ 
 
ON AL.CUSTOMERID = CI.CUSTOMERID
                 
 
################ Line : 169 ################ 
 
WHERE AS_OF_DATE = P_AS_OF_DATE
         
 
################ Line : 170 ################ 
 
WHERE A.CORESUBJECTNO = B.SUB_CODE
           AND DECODE(DIRECTION,
                      'D',
                      DEBITBALANCE - CREDITBALANCE,
                      CREDITBALANCE - DEBITBALANCE) <> 0
           AND A.AS_OF_DATE = P_AS_OF_DATE
          
 
################ Line : 177 ################ 
 
ON AL.ACCOUNTNO = SL.ACCOUNTNO    --币种表
          
 
################ Line : 179 ################ 
 
ON (CL.CCY = CC.CUR_CODE AND P_AS_OF_DATE = CC.AS_OF_DATE)    --上次支付日临时表
          
 
################ Line : 181 ################ 
 
ON CL.DRAW_NO = LP.OBJECTNO    --下次支付日临时表
          
 
################ Line : 183 ################ 
 
ON CL.DRAW_NO = NP.OBJECTNO
         
 
################ Line : 187 ################ 
 
WHERE A.AS_OF_DATE = P_AS_OF_DATE
           AND A.SEQID <> '999'
           AND (A.OBJECTNO, TO_DATE(A.PAYDATE, 'YYYY/MM/DD')) IN
               (SELECT B.OBJECTNO, B.NEXT_PAYDATE
                  FROM ETL.TMP_XD_NEXT_PAYDATE B)
           AND A.SDATE <= TO_CHAR(P_AS_OF_DATE, 'YYYYMMDD')    --add by msw 2016-03-14
           AND A.EDATE >= TO_CHAR(P_AS_OF_DATE, 'YYYYMMDD')
          
 
################ Line : 195 ################ 
 
ON CL.DRAW_NO = T.OBJECTNO
            
 
################ Line : 211 ################ 
 
ON T.CORESUBJECTNO = T1.SUB_CODE
         
 
################ Line : 212 ################ 
 
WHERE (T1.SUB_NAME LIKE '%利息收入%')
           AND T.SENDFLAG = '1'
           AND T.AS_OF_DATE = P_AS_OF_DATE
           AND T1.AS_OF_DATE = P_AS_OF_DATE
          
 
################ Line : 218 ################ 
 
ON AL.ACCOUNTNO = B.ACCOUNTNO
                    
 
################ Line : 232 ################ 
 
ON SL.CORESUBJECTNO = SUB.SUB_CODE
                 
 
################ Line : 233 ################ 
 
WHERE SUB.SUB_NAME LIKE '%准备%'
                   AND SUB.AS_OF_DATE = P_AS_OF_DATE
                   AND SL.AS_OF_DATE = P_AS_OF_DATE
         
 
################ Line : 236 ################ 
 
WHERE T.SEQ = 1
          
 
################ Line : 237 ################ 
 
ON CL.DRAW_NO = C.ACCOUNTNO    
       /*WHERE CL.LOAN_TYPE NOT IN ('2070', '2110040', '2110010') --xxxx类型
       AND CL.AGG_YTD <> 0
       AND CL.AS_OF_DATE = P_AS_OF_DATE
       AND AL.ACCOUNTNO IS NOT NULL;*/
       
    
    ################ Line : 242 ################    
    
    WHERE (CL.LOAN_TYPE NOT IN ('2070', '2110040', '2110010')
             AND CL.AGG_YTD <> 0 AND CL.AS_OF_DATE = P_AS_OF_DATE AND
             AL.ACCOUNTNO IS NOT NULL)
          OR (CL.LOAN_TYPE NOT IN ('2070', '2110040', '2110010')
             AND CL.AGG_YTD = 0 AND CL.AS_OF_DATE = P_AS_OF_DATE AND
             AL.ACCOUNTNO IS NOT NULL AND
             (CL.LOAN_BALANCE <> 0 OR B.ACCRUED_INTEREST <> 0))
               
 
################ Line : 260 ################ 
 
ON T.INT_GL_ACCOUNT_ID = T1.SUBJECT_NO3
              AND T1.SUBJECT_NAME3 LIKE '%已减值%'
              AND T1.AS_OF_DATE = P_AS_OF_DATE
            
 
################ Line : 263 ################ 
 
WHERE T.AS_OF_DATE = P_AS_OF_DATE
              AND T.ACCOUNT_NUMBER IN
                  (SELECT ACCOUNT_NUMBER
                     FROM (SELECT /*+PARALLEL(8)*/
                            T2.ACCOUNT_NUMBER, COUNT(1)
                             FROM ETL.MA_F_LOAN T2
                            WHERE T2.AS_OF_DATE = P_AS_OF_DATE
                            GROUP BY T2.ACCOUNT_NUMBER
                           HAVING COUNT(1) > 1))
    
 
################ Line : 272 ################ 
 
ON (A.ACCOUNT_NUMBER = B.ACCOUNT_NUMBER AND A.AS_OF_DATE = P_AS_OF_DATE AND A.GL_ACCOUNT_ID = B.GL_ACCOUNT_ID AND A.INT_GL_ACCOUNT_ID = B.INT_GL_ACCOUNT_ID)
     
 
################ Line : 280 ################ 
 
WHERE T.AS_OF_DATE = P_AS_OF_DATE
       AND EXISTS (SELECT 1
              FROM NYBDP.O_CWWS_BUSINESS_DUEBILL BD
             WHERE T.ACCOUNT_ID = BD.SERIALNO
               AND BD.AS_OF_DATE = T.AS_OF_DATE
               AND BD.BUSINESSSTATUS = '6')
     
 
################ Line : 296 ################ 
 
WHERE A.MATURITY_DATE <= P_AS_OF_DATE
       AND A.CUR_BOOK_BAL <> 0
     
 
################ Line : 304 ################ 
 
WHERE AS_OF_DATE = P_AS_OF_DATE
       AND GL_ACCOUNT_ID IN ('9990101', '9990102', '9990103', '9990104')
     
 
################ Line : 321 ################ 
 
WHERE T.AS_OF_DATE = P_AS_OF_DATE
       AND T.GL_ACCOUNT_ID = '9990101'

# 接着对以上结果进行条件识别和标记,语法配置如下(MARK_SQL_ON_WHERE.syn):

代码语言:txt
复制
__DEF_FUZZY__             Y
__DEF_DEBUG__             N
__DEF_CASE_SENSITIVE__    N
 
__DEF_LINE_COMMENT__      --
__DEF_LINES_COMMENT__     /*     */
__DEF_TRY_KEEP_COMMENT__  N
 
 
__DEF_STR__   __IF_KW__
<1,100>
[1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
[0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_
 
__DEF_PATH__    __MARK_CONDITION__
1         : blk           @ %__IF_KW__          | __BLANK__
1         : whr           @ %__IF_KW__          | where
          : on            @ %__IF_KW__          + on
          : and1          @ %__IF_KW__          + and
          : or1           @ %__IF_KW__          + or
1         : exp1          @                     | __L_PATH_4_EXPR__
          : exp11         @                     + __PATH_4_EXPR__
1         : eq            @                     | =
          : neq           @                     + <>
          : beq           @                     + !=
          : dyh           @                     + >
          : ddy           @                     + >=
          : xyh           @                     + <
          : xdy           @                     + <=
+         : lik           @ %__IF_KW__          | like
          : in            @ %__IF_KW__          + in
          : is            @ %__IF_KW__          + is
          : btw           @ %__IF_KW__          + between
+         : not           @ %__IF_KW__          | not
          : in2           @ %__IF_KW__          | in
+         : not3          @ %__IF_KW__          | not
          : lik2          @ %__IF_KW__          | like
+         : is2           @ %__IF_KW__          | is
          : not2          @ %__IF_KW__          | not
1         : asb           @                     | __ANY_SUB__
          : exp2          @                     + __PATH_4_EXPR__
-----------------------------------------------------------------------------------
1         : whr           @                     | where
          : on            @                     | on
          : and1          @                     | and
          : or1           @                     | or
1         : exp1          @                     | __L_PATH_4_EXPR__
          : exp11         @                     | <condition>
          : exp11         @                     | __PATH_4_EXPR__
          : eq            @                     | =
          : neq           @                     | <>
          : beq           @                     | !=
          : dyh           @                     | >
          : ddy           @                     | >=
          : xyh           @                     | <
          : xdy           @                     | <=
          : lik           @                     | like
          : in            @                     | in
          : is            @                     | is
          : btw           @                     | between
          : not           @                     | not
          : in2           @                     | in
          : not3          @                     | not
          : lik2          @                     | like
          : is2           @                     | is
          : not2          @                     | not
          : asb           @                     | __ANY_SUB__
          : exp2          @                     | __PATH_4_EXPR__
1         : asb           @                     | </condition>
          : exp2          @                     | </condition>
 
__DEF_PATH__    __SIMPLE_CONDITION__
1         : cdt           @                     | <condition>
          : int           @                     | __INT__
          : flo           @                     + __FLOAT__
          : nm            @                     + __NAME__
          : str           @                     + __STRING__
          : otn           @                     + __OTH_NAME__
          : wh            @                     + ?
          : nul           @ %__IF_KW__          + null
1         : eq            @                     | =
          : neq           @                     + <>
          : beq           @                     + !=
          : dyh           @                     + >
          : ddy           @                     + >=
          : xyh           @                     + <
          : xdy           @                     + <=
+         : lik           @ %__IF_KW__          | like
          : in            @ %__IF_KW__          + in
          : is            @ %__IF_KW__          + is
          : btw           @ %__IF_KW__          + between
+         : not           @ %__IF_KW__          | not
          : in2           @ %__IF_KW__          | in
+         : not3          @ %__IF_KW__          | not
          : lik2          @ %__IF_KW__          | like
+         : is2           @ %__IF_KW__          | is
          : not2          @ %__IF_KW__          | not
1         : int2          @                     | __INT__
          : flo2          @                     + __FLOAT__
          : nm2           @                     + __NAME__
          : str2          @                     + __STRING__
          : otn2          @                     + __OTH_NAME__
          : sps           @                     + __SIMPLE_SET__
          : wh2           @                     + ?
          : nul2          @ %__IF_KW__          + null
          : cdte          @                     | </condition>
---------------------------------------------------------------------
1         : cdt           @                     | <simple_condition>
          : int           @                     | __INT__
          : flo           @                     | __FLOAT__
          : nm            @                     | __NAME__
          : str           @                     | __STRING__
          : otn           @                     | __OTH_NAME__
          : wh            @                     | ?
          : nul           @                     | null
          : eq            @                     | =
          : neq           @                     | <>
          : beq           @                     | !=
          : dyh           @                     | >
          : ddy           @                     | >=
          : xyh           @                     | <
          : xdy           @                     | <=
          : lik           @                     | like
          : in            @                     | in
          : is            @                     | is
          : btw           @                     | between
          : not           @                     | not
          : in2           @                     | in
          : not3          @                     | not
          : lik2          @                     | like
          : is2           @                     | is
          : not2          @                     | not
          : int2          @                     | __INT__
          : flo2          @                     | __FLOAT__
          : nm2           @                     | __NAME__
          : str2          @                     | __STRING__
          : otn2          @                     | __OTH_NAME__
          : sps           @                     | __SIMPLE_SET__
          : wh2           @                     | ?
          : nul2          @                     | null
          : cdte          @                     | </simple_condition>
 
__DEF_PATH__    __FOCUS_CONDITION__
1         : cdt           @                     | <condition>
          : any           @                     | __ANY__
          : cdte          @                     | </condition>
---------------------------------------------------------------------
1         : cdt           @                     | <focus_condition>
N         : any           @                     | __ANY__
1         : cdte          @                     | </focus_condition>
 
 
__DEF_SUB_PATH__     __L_PATH_4_EXPR__
1         : lkh           @               | (
          : exp11         @               | __PATH_4_EXPR__
--------------------------------------------------------------
1         : lkh           @               | (
          : exp11         @               | <condition>
          : exp11         @               | __PATH_4_EXPR__
 
__DEF_SUB_PATH__     __SUB_PATH_4_EXPR__
1             : x1        | (
N             : x2        | __PATH_4_EXPR__
e             : x3        | ,
1             : x4        | )
 
__DEF_SUB_PATH__     __PATH_4_EXPR__
N          : int          @                       | __INT__
           : flo          @                       + __FLOAT__
           : nm           @                       + __NAME__
           : otn          @                       + __OTH_NAME__
           : caw          @                       + __CASE_WHEN__
           : str          @                       + __STRING__
           : vsl          @                       + __SUB_PATH_4_EXPR__
           : fun          @                       + __FUNCTION__
           : otf          @                       + __OTH_FUN__
           : wh           @                       + ?
           : nul          @ %__IF_KW__            + null
           : add          @                       + +
           : sub          @                       + -
           : cyh          @                       + *
           : dev          @                       + /
           : ssx          @                       + ||
           : bfh          @                       + %
           : bd1          @                       + &
           : bd2          @                       + ~
           : mh           @                       + :
           : mh2          @                       + ::
 
__DEF_SUB_PATH__     __SIMPLE_SET__
1             : lkh        | (
N             : int        | __INT__
              : flo        + __FLOAT__
              : nam        + __NAME__
              : str        + __STRING__
e             : dh         | ,
1             : rkh        | )
 
__DEF_SUB_PATH__   __OTH_NAME__
1       : otrnm          @         | __NAME__
        : pp             @         | .
        : column         @         | __NAME__
 
__DEF_SUB_PATH__   __OTH_FUN__
N       : schema      | __NAME__
        : pp          | .
1       : fun         | __FUNCTION__
 
__DEF_SUB_PATH__      __FUNCTION__      
1           : fun         @             | __NAME__
            : lkh         @             | __ANY_SUB__
 
__DEF_STR__   __ALL_STR__
<1,20000>
[1,20000]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`~!@#$%^&*-_+={}[]\|:;'"<,>.?/

__DEF_SUB_PATH__   __ANY_SUB__
1       :            | ( 
N       :            | __ALL_STR__
        :            + __ANY_SUB__
1       :            | )

__DEF_SUB_PATH__   __CASE_WHEN__
1          : cas         @ %__IF_KW__          | case
           : exp1        @                     | __ANY__
N          : whe         @ %__IF_KW__          | when
           : exp2        @                     | __ANY__
           : the         @ %__IF_KW__          | then
           : exp3        @                     | __ANY__
1          : els         @ %__IF_KW__          | else
           : exp4        @                     | __ANY__
           : end         @ %__IF_KW__          | end
__DEF_SUB_PATH__   __NAME__
1       : lsy            @         | "
        : nm1            @         | __ANY__
        : rsy            @         | "
+       : ldy            @         | `
        : nm2            @         | __ANY__
        : rdy            @         | `
+       : dol            @         | $
        : lkh            @         | {
        : nm3            @         | __NORM_NAME__
        : rkh            @         | }
+       : nm4            @         | __NORM_NAME__

__DEF_STR__   __NORM_NAME__
<1,100>
[0,100]0123456789
[1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_??
[0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_??
[NO] create insert into update delete truncate drop merge table select inner left join on from where exists group distribute distributed order partition by having union minus intersect except all with as set reset between and or like in is not null case when then else end pivot lateral view start connect while do repeat until loop call open close cursor fetch analyze vacuum                                        

__DEF_STR__   __NAME_WITH_KW__
<1,100>
[0,100]0123456789
[1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_??
[0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_??

__DEF_SUB_PATH__   __STRING__
1       : x1                  | '
        : x2                  | __ANY__
        : x3                  | '

__DEF_STR__   __FLOAT__
<1,100>
[1,50]0123456789
[1,1].
[1,50]0123456789

__DEF_STR__   __INT__
<1,100>
[1,100]0123456789

# 执行第1次标记出所有条件 “<condition>” :

代码语言:txt
复制
ZGLanguage -e MARK_SQL_ON_WHERE.syn -r on_where.zgl -o mark_sql.zgl > log.log

# 标记结果(mark_sql.zgl 只显示一部分):

代码语言:txt
复制
################ Line : 26 ################
WHERE <condition> PROC_NAME = V_PROC_NAME </condition>
               
 
################ Line : 46 ################
WHERE <condition> T.AS_OF_DATE = P_AS_OF_DATE </condition>
                 AND <condition> T.SEQID <> '999' </condition>
                 AND <condition> TO_DATE(T.PAYDATE, 'YYYY-MM-DD') < P_AS_OF_DATE </condition>
               
 
################ Line : 59 ################
WHERE <condition> T.AS_OF_DATE = P_AS_OF_DATE </condition>
                 AND <condition> T.SEQID <> '999' </condition>
                 AND <condition> TO_DATE(T.PAYDATE, 'YYYY-MM-DD') >= P_AS_OF_DATE </condition>    --xxxx账户统计表
 
.................

# 执行第2次对以上标记条件进行判断,分成 “简单条件<simple_condition>” 和 “关注条件<focus_condition>” :

代码语言:txt
复制
ZGLanguage -e MARK_SQL_ON_WHERE.syn -r mark_sql.zgl -o out.zgl > log.log

# 标记结果(out.zgl)只展示部分:

代码语言:txt
复制
################ Line : 26 ################
WHERE <simple_condition> PROC_NAME = V_PROC_NAME </simple_condition>
               
 
################ Line : 46 ################
WHERE <simple_condition> T.AS_OF_DATE = P_AS_OF_DATE </simple_condition>
                 AND <simple_condition> T.SEQID <> '999' </simple_condition>
                 AND <focus_condition>  TO_DATE(T.PAYDATE, 'YYYY-MM-DD') < P_AS_OF_DATE </focus_condition>
               
 
################ Line : 59 ################
WHERE <simple_condition> T.AS_OF_DATE = P_AS_OF_DATE </simple_condition>
                 AND <simple_condition> T.SEQID <> '999' </simple_condition>
                 AND <focus_condition>  TO_DATE(T.PAYDATE, 'YYYY-MM-DD') >= P_AS_OF_DATE </focus_condition>    --xxxx账户统计表
          
 
################ Line : 107 ################
ON ( <simple_condition>CL.DRAW_NO = AL.SERIALNO </simple_condition> AND <simple_condition> P_AS_OF_DATE = AL.AS_OF_DATE </simple_condition>)    --借据表
          
 
################ Line : 109 ################
ON ( <simple_condition>AL.SERIALNO = BD.SERIALNO </simple_condition> AND <simple_condition> P_AS_OF_DATE = BD.AS_OF_DATE </simple_condition>)    --合同表
          
 
################ Line : 111 ################
ON ( <simple_condition>BD.RELATIVESERIALNO2 = BC.SERIALNO </simple_condition> AND <simple_condition>
             BC.AS_OF_DATE = P_AS_OF_DATE </simple_condition>)    --业务出账表
          
 
################ Line : 115 ################
ON ( <simple_condition>BD.RELATIVESERIALNO1 = BP.SERIALNO </simple_condition> AND <simple_condition>
             BP.AS_OF_DATE = P_AS_OF_DATE </simple_condition>)
                            
 
################ Line : 127 ################
WHERE <simple_condition> AS_OF_DATE = P_AS_OF_DATE </simple_condition>
                                
.........

以上可得条件标记分类结果。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档