如何在Bash脚本中通过Curl将SQL查询结果赋值给Rest请求参数
问题分析与修复方案
看起来你现在的脚本犯了两个关键错误,直接导致了接口返回的SIP-10322错误,我们一步步来解决:
首先说问题出在哪:
- 你把SQL查询语句直接作为第二个
-d参数传给curl了——这根本不会执行SQL,反而会让curl把JSON字符串和SQL语句拼在一起作为POST请求体,接口完全无法解析这种混乱的数据,自然没办法正确处理,也就出现了"更新行数为0而非1"的错误。 - 你没有真正执行那个
SELECT count(5) FROM DUAL查询并拿到结果,只是把查询文本当成参数传了,这完全不是你想要的逻辑。
第一步:先执行SQL查询拿到结果
因为你用的是FROM DUAL,应该是Oracle数据库,我们用sqlplus来执行查询并提取纯数字结果(如果是其他数据库,换成对应的工具比如psql即可):
# 这里替换成你的数据库登录信息,或者用netrc配置的话可以调整sqlplus的调用方式 sql_result=$(sqlplus -s username/password@your_database << EOF SET FEEDBACK OFF SET HEADING OFF SELECT count(5) FROM DUAL; EXIT; EOF ) # 清理结果里的换行、空格,确保只留下纯数字 sql_result=$(echo "$sql_result" | tr -d '[:space:]')
SET FEEDBACK OFF和SET HEADING OFF是为了去掉sqlplus默认输出的"1 row selected"这类冗余信息,只保留查询出来的数字。
第二步:把SQL结果嵌入到JSON请求体里
接下来我们把拿到的sql_result变量放到JSON的T_4字段中,注意变量嵌入的写法:
第三步:正确发起curl请求
现在只需要用一次-d参数传递正确的JSON数据,不要重复传-d。
完整的修复后脚本
#!/bin/sh # 执行SQL查询并获取计数结果 sql_result=$(sqlplus -s username/password@your_database << EOF SET FEEDBACK OFF SET HEADING OFF SELECT count(5) FROM DUAL; EXIT; EOF ) # 清理结果,确保是纯数字 sql_result=$(echo "$sql_result" | tr -d '[:space:]') # 发起POST请求,将SQL计数结果赋值给T_4 result=$(curl --netrc-file ~/.netrc -X POST -H "Content-Type: application/json" \ -d '[ { "T_1": "Test1", "T_2": "Test2", "T_3": "Test3", "T_4": "'"$sql_result"'" } ]' https://www.testurl.com) echo "Response from server" echo "$result" exit
关键细节说明
- 嵌入变量到JSON时,用
'"$sql_result"'的写法:外层用单引号包裹JSON内容,遇到变量时先关闭单引号,用双引号包裹变量(避免变量里的空格等特殊字符出问题),再重新打开单引号继续写JSON。 - 如果你的接口要求
T_4是数字类型(不是字符串),直接去掉引号写成"T_4": '$sql_result'即可。 - 关于
SIP-10322错误:这个错误是因为之前的请求数据格式完全错误,接口无法处理,所以没有更新任何行。当你用正确的JSON请求体传递T_4的数值后,接口应该能正常处理请求,更新对应的行,这个错误就会消失。
内容的提问来源于stack exchange,提问作者Jenifer
相关产品推荐
相关产品推荐

