【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. Delphi编译/链接过程

    下面展示了Delphi是怎样编译源文件,并且把它们链接起来,最终形成可执行文件. 当Delphi编译项目(Project)时,将编译项目源文件.窗体单元和其他相关单元,在这个过程中将会发生好几件事情: ...

  2. echarts 更改tooltip提示框CSS样式

    最近 做项目,用过echarts,发现tooltip提示z-index级别很高,想更改下,看了下文档:https://www.echartsjs.com/zh/option.html#tooltip. ...

  3. TinyMCE基础配置

    选择器配置 插件配置 工具栏配置 菜单配置 皮肤配置 编辑区宽高配置 编辑区样式配置 隐藏状态栏 选择器配置 选择器就是CSS选择器,它告诉TinyMCE哪个元素是可编辑的. 示例: tinymce. ...

  4. TinyMCE入门

    引入TinyMCE脚本 <script src="https://cdn.tiny.cloud/1/no-api-key/tinymce/5/tinymce.min.js" ...

  5. Linux的权限管理操作-Linux从入门到精通第七天(非原创)

    文章大纲 一.权限概述二.权限设置三.属主与属组设置四.扩展五.学习资料下载六.参考文章 一.权限概述 总述:Linux系统一般将文件可存/取访问的身份分为3个类别:owner.group.other ...

  6. JVM性能优化简介

    01. JVM是什么    概述:        大白话:             全称Java Virtual Machine(Java虚拟机), 它是一个虚构出来的计算机, 通过实际的计算机来模拟 ...

  7. eclipse 将原工作空间配置导入新建工作空间

    相信各位小伙伴使用eclipse开发的时候经常会遇到新建工作空间的时候, 但是每次新建工作空间之后都要重新配置空间.安装插件等等 笔者曾经对此问题很是绝望. . . 后发现新建的工作空间可以导入其他工 ...

  8. Traefik HTTPS 配置

    参考 add-a-tls-certificate-to-the-ingress Entry Points Definition 使用traefik作为ingress controller透出集群中的h ...

  9. 洛谷P2463 [SDOI2008]Sandy的卡片(后缀数组SA + 差分 + 二分答案)

    题目链接:https://www.luogu.org/problem/P2463 [题意] 求出N个串中都出现的相同子串的最长长度,相同子串的定义如题:所有元素加上一个数变成另一个,则这两个串相同,可 ...

  10. win10 任务栏上的工具栏,重启消失的解决方法

    首先谈下 <任务栏的工具栏> 对于很多人来言,还是有可取性的 任务栏的工具栏对编程者的作用 一般来说,我们会经常查看某些API文档,虽然现在是联网也很方便,但如果都下载下来,整理到一个文件 ...