lua entry thread aborted: runtime error: /usr/../process.lua:448: attempt to concatenate field 'np_sum_duration' (a userdata value)
【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)的更多相关文章
- 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: ...
- /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 ...
- 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 ...
- 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 ...
- 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 ...
- ERROR: child process failed, exited with error number 100
[root@localhost ~]# mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs --loga ...
- mongodb启动时报错ERROR: child process failed, exited with error number 1
不多说,直接上干货! 前期博客 Ubuntu14.04下Mongodb安装部署步骤(图文详解) Ubuntu16.04下Mongodb安装部署步骤(图文详解) root@zhouls-virtual- ...
- Finished with error: ProcessException: Process "D:\FlutterAPP\flutter_appfive\android\gradlew.bat" exited abnormally:
在使用Flutter进行开发是遇到这样一个问题 Finished with error: ProcessException: Process "D:\FlutterAPP\flutter_a ...
- 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 ...
随机推荐
- 关于C++中使用++it还是it++的问题
我们经常使用for循环来遍历东西,循环变量可以前自增也可以后自增,发现对遍历结果没啥影响,但是该如何选择呢? 我们应该尽量使用前自增运算符而不是后自增运算符,即用 ++ Iter 代替 Iter++ ...
- jQuery实现的全选、反选和获取当前所有选中的值功能
链接: jQuery实现的全选.反选和获取当前所有选中的值功能 <ul id="list"> <li><label><input type ...
- iOS开发使用Xcode的一些小技巧
1.打开iOS项目 如果你当前目录下既有project又有workspace,你可以在终端使用命令“xed.”自动打开workspace,如果只有project,它会自动打开project. 2.清理 ...
- WorkFlow一:WorkFlow基础配置
1.使用事物代码SWU3进入WF配置页. 2.展开第一个运行环境维护文件夹,选中第一个配置RFC目标,点击生成.完成后可点击运行按钮测试是否成功. 同上,挨个激活. 3.激活第二个文件夹‘维护环境定义 ...
- 旅游景点信息API接口大全
1.分享数据:“http://www.shareapi.cn/docs/api/id/127”,免费,次数1000次 返回JSON示例 { "SceneryID":10224,/* ...
- Linux的web服务的介绍
web(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP的.全球性的.动态交互的.跨平台的分布式图形信息系统.是建立在Internet上的一种网络服务,为浏览者在 ...
- Nginx 反向代理功能-实现Nginx tcp负载均衡
Nginx 反向代理功能-实现Nginx tcp负载均衡 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Ubuntu 16.04.6 + Win10 双系统时间错误且不一致
1.在Win系统下,按Win键 + R,输入regedit 运行, 2.打开注册表,按照路径查找 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet ...
- maven中,dependency 中的 classifier属性
classifier元素用来帮助定义构件输出的一些附属构件.附属构件与主构件对应,比如主构件是 kimi-app-2.0.0.jar 该项目可能还会通过使用一些插件生成 如 kimi-app-2.0. ...
- httprunner学习25-文件上传multipart/form-data
前言 httprunner上传文件接口,其实跟requests上传文件的接口是一样的,之前在python接口系列里面有案例 python接口自动化16-multipart/form-data上传图片 ...