You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash脚本中通过Curl将SQL查询结果赋值给Rest请求参数

问题分析与修复方案

看起来你现在的脚本犯了两个关键错误,直接导致了接口返回的SIP-10322错误,我们一步步来解决:

首先说问题出在哪:

  1. 你把SQL查询语句直接作为第二个-d参数传给curl了——这根本不会执行SQL,反而会让curl把JSON字符串和SQL语句拼在一起作为POST请求体,接口完全无法解析这种混乱的数据,自然没办法正确处理,也就出现了"更新行数为0而非1"的错误。
  2. 你没有真正执行那个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 10:35:41