【1】问题场景原代码

引起问题的原代码,访问数据库,汇总数据后,使用汇总结果报异常:

     local function amount_sum_fee(cycleid)
         local select_productid = "select product_id from np_cdr_" .. cycleid .. " group by product_id;"
         local rtn, productid_set = executeSql(select_productid)
         if rtn then

             local sql_const = "insert into compare_fee_" .. cycleid .. " (product_id, np_id, np_sum_duration, np_total_times, " ..
             " np_sum_qty, np_sum_fee, un_sum_duration, un_total_times, un_sum_fee, sum_np_fee, sum_original_fee) values "
             if type(productid_set) == 'table' and next(productid_set) ~= nil then
                 for key, record in pairs(productid_set) do
                     local amount_table = {}
                     amount_table["product_id"] = record["product_id"]
                     amount_table["np_id"] = 'all'
                     -- np总费用统计
                     local np_sum_fee = "SELECT product_id, SUM(duration) AS np_sum_duration, " ..
                     " COUNT(id) AS np_sum_cdrCnt, " ..
                     " SUM(service_qty) AS np_service_qty, " ..
                     " SUM(service_fee) AS np_service_fee, " ..
                     " SUM(np_fee) AS np_sum_fee, " ..
                     " SUM(original_fee) AS np_sum_original_fee " ..
                     " FROM np_cdr_" .. cycleid .. " WHERE product_id = '" .. record["product_id"] .. "';"
                     local rtn, desc = executeSql(np_sum_fee)
                     if rtn and next(desc) ~= nil then
                         amount_table[]["np_sum_duration"]
                         amount_table[]["np_sum_cdrCnt"]
                         amount_table[]["np_service_qty"]
                         amount_table[]["np_service_fee"]
                         amount_table[]["np_sum_fee"]
                         amount_table[]["np_sum_original_fee"]
                     end
                     -- un总费用统计
                     local un_sum_fee = "SELECT product_id, SUM(total_duration) AS un_sum_duration, " ..
                     " SUM(total_times) AS un_sum_cdrCnt, " ..
                     " SUM(total_fee) AS un_sum_fee " ..
                     " FROM dat_bill_" .. cycleid .. " WHERE call_type & 4097 > 0 AND product_id = '" .. record["product_id"] .. "';"
                     local rtn, desc = executeSql(un_sum_fee)
                     if rtn and next(desc) ~= nil then
                         amount_table[]["un_sum_duration"]
                         amount_table[]["un_sum_cdrCnt"]
                         amount_table[]["un_sum_fee"]
                     end
                     -- 构建sql语句
                      then
                         insert_sql = insert_sql .. ","
                     else
                         insert_sql = sql_const
                     end
                     insert_sql = insert_sql .. "('" ..
                     amount_table["product_id"] .. "', '" ..
                     amount_table["np_id"] .. "', " ..
                     amount_table["np_sum_duration"] .. ", " ..
                     amount_table["np_total_times"] .. ", " ..
                     amount_table["np_sum_qty"] .. ", " ..
                     amount_table["np_sum_fee"] .. ", " ..
                     amount_table["un_sum_duration"] .. ", " ..
                     amount_table["un_total_times"].. ", " ..
                     amount_table["un_sum_fee"] .. ", " ..
                     amount_table["sum_np_fee"] .. ", " ..
                     amount_table["sum_original_fee"] .. ")"
                     value_count = value_count +
                      == value_count then
                         sum_count = sum_count + value_count
                         insert_sql = insert_sql .. "; commit;"
                         local rtn, result = executeSql(insert_sql)
                         if not rtn then
                             rtnstr[
                             rtnstr["msg"] = "Error. amount_sum_fee insert into sum_fee num : " .. sum_count .. " sql : " .. insert_sql
                             return false
                         else
                             local result = "compare: success to amount_sum_fee insert into sum_fee num : " .. sum_count
                             ngx.log(ngx.ERR, result)
                         end
                         insert_sql = ""
                         value_count =
                     end
                 end
                  then
                     sum_count = sum_count + value_count
                     insert_sql = insert_sql .. "; commit;"
                     local rtn, result = executeSql(insert_sql)
                     if not rtn then
                         rtnstr[
                         rtnstr["msg"] = "Error. amount_sum_fee insert into sum_fee num : " .. sum_count .. " sql : " .. insert_sql
                         return false
                     else
                         local result = "compare: success to amount_sum_fee insert into sum_fee num : " .. sum_count
                         ngx.log(ngx.ERR, result)
                     end
                     insert_sql = ""
                     value_count =
                 end
             end
         else
             rtnstr[
             rtnstr["msg"] = "Failed to select product_id amount_sum_fee error : " .. productid_set
             return false
         end
         return true
     end

使用的是SQL中的sum函数

【2】分析原因

数据库访问汇总数据时,SUM函数的结果可能为NULL值。如下图:

修改SQL语句,添加IFNULL判断,若为NULL,则为0即可。如下图:

如上原因分析。

【3】修复后代码

     local function amount_sum_fee(cycleid)
         local select_productid = "select product_id from np_cdr_" .. cycleid .. " group by product_id;"
         local rtn, productid_set = executeSql(select_productid)
         if rtn then

             local sql_const = "insert into compare_fee_" .. cycleid .. " (product_id, np_id, np_sum_duration, np_total_times, " ..
             " np_sum_qty, np_sum_fee, un_sum_duration, un_total_times, un_sum_fee, sum_np_fee, sum_original_fee) values "
             if type(productid_set) == 'table' and next(productid_set) ~= nil then
                 for key, record in pairs(productid_set) do
                     local amount_table = {}
                     amount_table["product_id"] = record["product_id"]
                     amount_table["np_id"] = 'all'
                     -- np总费用统计
                     local np_sum_fee = "SELECT product_id, IFNULL(SUM(duration), 0) AS np_sum_duration, " ..
                     " COUNT(id) AS np_sum_cdrCnt, " ..
                     " IFNULL(SUM(service_qty), 0) AS np_service_qty, " ..
                     " IFNULL(SUM(service_fee), 0) AS np_service_fee, " ..
                     " IFNULL(SUM(np_fee), 0) AS np_sum_fee, " ..
                     " IFNULL(SUM(original_fee), 0) AS np_sum_original_fee " ..
                     " FROM np_cdr_" .. cycleid .. " WHERE product_id = '" .. record["product_id"] .. "';"
                     local rtn, desc = executeSql(np_sum_fee)
                     if rtn and next(desc) ~= nil then
                         amount_table[]["np_sum_duration"]
                         amount_table[]["np_sum_cdrCnt"]
                         amount_table[]["np_service_qty"]
                         amount_table[]["np_service_fee"]
                         amount_table[]["np_sum_fee"]
                         amount_table[]["np_sum_original_fee"]
                     end
                     -- un总费用统计
                     local un_sum_fee = "SELECT product_id, IFNULL(SUM(total_duration), 0) AS un_sum_duration, " ..
                     " IFNULL(SUM(total_times), 0) AS un_sum_cdrCnt, " ..
                     " IFNULL(SUM(total_fee), 0) AS un_sum_fee " ..
                     " FROM dat_bill_" .. cycleid .. " WHERE call_type & 4097 > 0 AND product_id = '" .. record["product_id"] .. "';"
                     local rtn, desc = executeSql(un_sum_fee)
                     if rtn and next(desc) ~= nil then
                         amount_table[]["un_sum_duration"]
                         amount_table[]["un_sum_cdrCnt"]
                         amount_table[]["un_sum_fee"]
                     end
                     -- 构建sql语句
                      then
                         insert_sql = insert_sql .. ","
                     else
                         insert_sql = sql_const
                     end
                     insert_sql = insert_sql .. "('" ..
                     amount_table["product_id"] .. "', '" ..
                     amount_table["np_id"] .. "', " ..
                     amount_table["np_sum_duration"] .. ", " ..
                     amount_table["np_total_times"] .. ", " ..
                     amount_table["np_sum_qty"] .. ", " ..
                     amount_table["np_sum_fee"] .. ", " ..
                     amount_table["un_sum_duration"] .. ", " ..
                     amount_table["un_total_times"].. ", " ..
                     amount_table["un_sum_fee"] .. ", " ..
                     amount_table["sum_np_fee"] .. ", " ..
                     amount_table["sum_original_fee"] .. ")"
                     value_count = value_count +
                      == value_count then
                         sum_count = sum_count + value_count
                         insert_sql = insert_sql .. "; commit;"
                         local rtn, result = executeSql(insert_sql)
                         if not rtn then
                             rtnstr[
                             rtnstr["msg"] = "Error. amount_sum_fee insert into sum_fee num : " .. sum_count .. " sql : " .. insert_sql
                             return false
                         else
                             local result = "compare: success to amount_sum_fee insert into sum_fee num : " .. sum_count
                             ngx.log(ngx.ERR, result)
                         end
                         insert_sql = ""
                         value_count =
                     end
                 end
                  then
                     sum_count = sum_count + value_count
                     insert_sql = insert_sql .. "; commit;"
                     local rtn, result = executeSql(insert_sql)
                     if not rtn then
                         rtnstr[
                         rtnstr["msg"] = "Error. amount_sum_fee insert into sum_fee num : " .. sum_count .. " sql : " .. insert_sql
                         return false
                     else
                         local result = "compare: success to amount_sum_fee insert into sum_fee num : " .. sum_count
                         ngx.log(ngx.ERR, result)
                     end
                     insert_sql = ""
                     value_count =
                 end
             end
         else
             rtnstr[
             rtnstr["msg"] = "Failed to select product_id amount_sum_fee error : " .. productid_set
             return false
         end
         return true
     end

【4】总结

Lua中使用SQL语句进行汇总数据时,切记需要作NULL判断。

Good Good Study, Day Day Up.

顺序 选择 循环 总结

lua entry thread aborted: runtime error: /usr/../process.lua:448: attempt to concatenate field 'np_sum_duration' (a userdata value)的更多相关文章

  1. openresty 报错:lua entry thread aborted: runtime error

    [1]问题现象 (1)本地openresty系统 (2)报错信息 2019/09/10 08:13:55 [error] 2385#2385: *4 lua entry thread aborted: ...

  2. /usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "process_linux.go:245: running exec setns .....

    docker创建容器时报错如下: containerd: start container" error="oci runtime error: container_linux.go ...

  3. centos7.2部署docker-17.06.0-ce的bug:Error response from daemon: oci runtime error: container_linux.go:262: starting container process caused "process_linux.go:339: container init caused \"\"".

    现象: 操作系统:centos 7.2 kernel 3.10.0-327.el7.x86_64 mesos:1.3.0 docker:docker-17.06.0-ce 在做mesos验证时,通过m ...

  4. error: /usr/include/objc/objc-class.h: No such file or directory

    When i use the example of ShareKit package,i have come across this error:"error: /usr/include/o ...

  5. Heka 编译安装后 运行报错 panic: runtime error: cgo argument has Go pointer to Go pointer

    Heka 编译安装后 运行报错 panic: runtime error: cgo argument has Go pointer to Go pointer 解决办法: 1.  Start heka ...

  6. ERROR: child process failed, exited with error number 100

    [root@localhost ~]# mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs --loga ...

  7. mongodb启动时报错ERROR: child process failed, exited with error number 1

    不多说,直接上干货! 前期博客 Ubuntu14.04下Mongodb安装部署步骤(图文详解) Ubuntu16.04下Mongodb安装部署步骤(图文详解) root@zhouls-virtual- ...

  8. Finished with error: ProcessException: Process "D:\FlutterAPP\flutter_appfive\android\gradlew.bat" exited abnormally:

    在使用Flutter进行开发是遇到这样一个问题 Finished with error: ProcessException: Process "D:\FlutterAPP\flutter_a ...

  9. lua.c:82:10: fatal error: readline/readline.h: No such file or directory #include <readline/readline.h>

    make linuxcd src && make linuxmake[1]: Entering directory `/root/lua/lua-5.3.2/src'make all ...

随机推荐

  1. 简洁的 systemd 操作指南Linux下Service文件服务说明(转)

    1.服务权限systemd有系统和用户区分:系统(/user/lib/systemd/system/).用户(/etc/lib/systemd/user/). 一般系统管理员手工创建的单元文件建议存放 ...

  2. iOS相关

    1. fastlane a collection of tools that help you automate building and releasing iOS and Android apps ...

  3. Vmware samba 搭建——Win10 共享

    配置环境 Win10 Vmware 15 ubuntu 16.04 Vmware 设置 安装 sudo apt-get install samba # 安装samba sudo apt-get ins ...

  4. OAuth 2.0 的四种授权模式

    RFC 6749 OAuth 2.0 的标准是 RFC 6749 文件.该文件先解释了 OAuth 是什么. OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者.......资源 ...

  5. Nginx Rewrite相关功能-ngx_http_rewrite_module模块指令

    Nginx Rewrite相关功能-ngx_http_rewrite_module模块指令 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  6. SpringBoot配置多注册中心(yml,properties)

    dubbo-2.6.6 dubbo.config.multiple=true    dubbo.registries.z1.timeout = 5000    dubbo.registries.z1. ...

  7. python3用turtle库进行绘制小猪佩奇图案

    晚上闲着无事,深入学习这个turtle用法,就做了小猪佩奇图 附上代码: # coding: utf-8 #功能:绘画小猪佩奇 import turtle as t t.screensize(400, ...

  8. l获取list 的长度,EL表达式获取list的长度,EL表达式获取list大小

    在jsp页面中不能通过${list.size}取列表长度,而是 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" pref ...

  9. 第二阶段冲刺(个人)——two

    今天的计划: 测试登录功能并优化. 昨天做了什么呢?  修改登录界面. 遇到的困难:一些标签运用不好,过程进度慢,改了又改.

  10. maven jar包冲突的发现与解决[工具篇]

    本文是我的第177篇文章. 关于jar冲突排查解决的问题,相信很多小伙伴也都知道有一些,无非就是两类:命令 or 工具. 命令方式比如: mvn dependency:tree 工具方式比如: Mav ...