R中getSQL读取含Oracle参数SQL传参报错问题
问题场景
工作目录下文件夹结构:
- sqlqueryfolder
- city.sql
city.sql中编写的Oracle查询语句如下:
SELECT * FROM Country WHERE dates = :dates
在工作目录下运行R代码尝试读取SQL文件并传入绑定参数时,初始代码为:
dates <-‘01-June-22’ Qry <- getSQL("city", dates=dates )
运行后触发报错:
Error in `if (!is.null(params) & length(params[params$param == v, "default"]) > : argument is of length zero`
报错原因
你用的getSQL()是sqlutils包提供的SQL加载函数,这个函数不会默认扫描当前工作目录下的子文件夹找SQL文件,只会在sqlPaths()配置的路径列表里检索目标SQL。你没有把sqlqueryfolder加入检索路径,函数读取不到SQL文件内容,自然没法识别里面的:dates绑定占位符,后续参数校验逻辑拿到空值就触发了长度为0的逻辑判断报错。另外你的初始代码里给dates赋值用了中文全角单引号,也会导致变量赋值异常。
解决步骤
- 加载依赖包,把存放SQL文件的文件夹加入
getSQL的检索路径
library(sqlutils) # 将当前工作目录下的sqlqueryfolder加入SQL检索路径 sqlPaths(c(sqlPaths(), "./sqlqueryfolder"))
- 修正代码里的全角引号为半角符号,再调用
getSQL加载SQL、传入参数:
# 注意使用半角单引号,日期格式建议和数据库内存储格式保持一致,避免隐式转换报错 dates <- '01-June-22' Qry <- getSQL("city", dates = dates)
- 校验配置是否生效:如果运行后仍有报错,可以先执行
getSQL("city", listParams=TRUE),如果返回结果里能看到dates参数,说明函数已经正确识别到SQL里的绑定变量,再传值就不会触发原报错。
注意:后续执行该SQL时建议通过DBI/ROracle的原生参数绑定接口传值,不要手动拼接字符串到SQL语句中,避免SQL注入风险和格式转换错误。
内容的提问来源于stack exchange,提问作者nesha
相关产品推荐
相关产品推荐

